From 356180ba8749b951e685031be38aff06db8fb8bd Mon Sep 17 00:00:00 2001 From: Alex's Chromebook Date: Wed, 12 Mar 2014 10:28:25 -0700 Subject: [PATCH] initial commit --- index.html | 1 + node_modules/get-pixels/.npmignore | 16 + node_modules/get-pixels/LICENSE | 22 + node_modules/get-pixels/README.md | 37 + node_modules/get-pixels/dom-pixels.js | 20 + node_modules/get-pixels/node-pixels.js | 55 + .../node_modules/ndarray-pack/.npmignore | 15 + .../node_modules/ndarray-pack/LICENSE | 22 + .../node_modules/ndarray-pack/README.md | 30 + .../node_modules/ndarray-pack/convert.js | 30 + .../node_modules/cwise/.npmignore | 18 + .../ndarray-pack/node_modules/cwise/LICENSE | 22 + .../ndarray-pack/node_modules/cwise/README.md | 214 + .../ndarray-pack/node_modules/cwise/cwise.js | 35 + .../node_modules/cwise-compiler/.npmignore | 16 + .../cwise/node_modules/cwise-compiler/LICENSE | 22 + .../node_modules/cwise-compiler/README.md | 21 + .../node_modules/cwise-compiler/compiler.js | 104 + .../cwise-compiler/lib/compile.js | 256 + .../node_modules/cwise-compiler/lib/thunk.js | 47 + .../node_modules/uniq/.npmignore | 15 + .../node_modules/uniq/README.md | 46 + .../node_modules/uniq/package.json | 49 + .../node_modules/uniq/test/test.js | 11 + .../cwise-compiler/node_modules/uniq/uniq.js | 57 + .../node_modules/cwise-compiler/package.json | 38 + .../node_modules/cwise-parser/.npmignore | 15 + .../cwise/node_modules/cwise-parser/LICENSE | 22 + .../cwise/node_modules/cwise-parser/README.md | 4 + .../cwise/node_modules/cwise-parser/index.js | 195 + .../cwise-parser/node_modules/.bin/esparse | 1 + .../cwise-parser/node_modules/.bin/esvalidate | 1 + .../node_modules/esprima/README.md | 73 + .../node_modules/esprima/bin/esparse.js | 117 + .../node_modules/esprima/bin/esvalidate.js | 177 + .../node_modules/esprima/esprima.js | 3908 +++ .../node_modules/esprima/package.json | 59 + .../node_modules/esprima/test/compat.js | 239 + .../node_modules/esprima/test/reflect.js | 422 + .../node_modules/esprima/test/run.js | 66 + .../node_modules/esprima/test/runner.js | 387 + .../node_modules/esprima/test/test.js | 20238 ++++++++++++++++ .../cwise-parser/node_modules/uniq/.npmignore | 15 + .../cwise-parser/node_modules/uniq/README.md | 46 + .../node_modules/uniq/package.json | 49 + .../node_modules/uniq/test/test.js | 11 + .../cwise-parser/node_modules/uniq/uniq.js | 57 + .../node_modules/cwise-parser/package.json | 46 + .../node_modules/cwise-parser/test/test.js | 27 + .../node_modules/cwise/package.json | 56 + .../node_modules/ndarray-pack/package.json | 49 + .../node_modules/ndarray-pack/test/test.js | 25 + .../node_modules/ndarray/.npmignore | 17 + .../get-pixels/node_modules/ndarray/LICENSE | 22 + .../get-pixels/node_modules/ndarray/README.md | 241 + .../node_modules/ndarray/ndarray.js | 358 + .../node_modules/iota-array/.npmignore | 16 + .../ndarray/node_modules/iota-array/LICENSE | 22 + .../ndarray/node_modules/iota-array/README.md | 29 + .../ndarray/node_modules/iota-array/iota.js | 11 + .../node_modules/iota-array/package.json | 46 + .../node_modules/ndarray/package.json | 63 + .../node_modules/pngparse/.npmignore | 1 + .../node_modules/pngparse/README.md | 54 + .../node_modules/pngparse/accum.png | Bin 0 -> 541398 bytes .../node_modules/pngparse/grayscale.png | Bin 0 -> 265 bytes .../get-pixels/node_modules/pngparse/index.js | 537 + .../node_modules/pngparse/indexed.png | Bin 0 -> 2814 bytes .../node_modules/pngparse/indexedalpha.png | Bin 0 -> 2826 bytes .../node_modules/pngparse/package.json | 35 + .../node_modules/pngparse/paeth.png | Bin 0 -> 59221 bytes .../get-pixels/node_modules/pngparse/test.js | 237 + .../node_modules/pngparse/truecolor.png | Bin 0 -> 511 bytes .../node_modules/pngparse/truecoloralpha.png | Bin 0 -> 625 bytes .../get-pixels/node_modules/ppm/.npmignore | 15 + .../get-pixels/node_modules/ppm/README.md | 38 + .../ppm/node_modules/through/.travis.yml | 4 + .../ppm/node_modules/through/LICENSE.APACHE2 | 15 + .../ppm/node_modules/through/LICENSE.MIT | 24 + .../ppm/node_modules/through/index.js | 103 + .../ppm/node_modules/through/package.json | 50 + .../ppm/node_modules/through/readme.markdown | 43 + .../node_modules/through/test/buffering.js | 71 + .../ppm/node_modules/through/test/end.js | 26 + .../ppm/node_modules/through/test/index.js | 114 + .../get-pixels/node_modules/ppm/package.json | 46 + .../get-pixels/node_modules/ppm/ppm.js | 318 + .../get-pixels/node_modules/ppm/test/test.js | 11 + node_modules/get-pixels/package.json | 57 + node_modules/jquery/.bowerrc | 3 + node_modules/jquery/.npmignore | 13 + node_modules/jquery/AUTHORS.txt | 217 + node_modules/jquery/CONTRIBUTING.md | 214 + node_modules/jquery/MIT-LICENSE.txt | 21 + node_modules/jquery/README.md | 372 + node_modules/jquery/bower.json | 28 + node_modules/jquery/dist/cdn/jquery-2.1.0.js | 9111 +++++++ .../jquery/dist/cdn/jquery-2.1.0.min.js | 4 + .../jquery/dist/cdn/jquery-2.1.0.min.map | 1 + node_modules/jquery/dist/jquery.js | 9111 +++++++ node_modules/jquery/dist/jquery.min.js | 5 + node_modules/jquery/dist/jquery.min.map | 1 + node_modules/jquery/package.json | 62 + node_modules/jquery/src/ajax.js | 806 + node_modules/jquery/src/ajax/jsonp.js | 89 + node_modules/jquery/src/ajax/load.js | 75 + node_modules/jquery/src/ajax/parseJSON.js | 13 + node_modules/jquery/src/ajax/parseXML.js | 28 + node_modules/jquery/src/ajax/script.js | 64 + node_modules/jquery/src/ajax/var/nonce.js | 5 + node_modules/jquery/src/ajax/var/rquery.js | 3 + node_modules/jquery/src/ajax/xhr.js | 130 + node_modules/jquery/src/attributes.js | 11 + node_modules/jquery/src/attributes/attr.js | 143 + node_modules/jquery/src/attributes/classes.js | 158 + node_modules/jquery/src/attributes/prop.js | 96 + node_modules/jquery/src/attributes/support.js | 35 + node_modules/jquery/src/attributes/val.js | 153 + node_modules/jquery/src/callbacks.js | 205 + node_modules/jquery/src/core.js | 500 + node_modules/jquery/src/core/access.js | 60 + node_modules/jquery/src/core/init.js | 123 + node_modules/jquery/src/core/parseHTML.js | 39 + node_modules/jquery/src/core/ready.js | 96 + .../jquery/src/core/var/rsingleTag.js | 4 + node_modules/jquery/src/css.js | 455 + node_modules/jquery/src/css/addGetHookIf.js | 24 + node_modules/jquery/src/css/curCSS.js | 57 + node_modules/jquery/src/css/defaultDisplay.js | 69 + .../jquery/src/css/hiddenVisibleSelectors.js | 15 + node_modules/jquery/src/css/support.js | 83 + node_modules/jquery/src/css/swap.js | 28 + node_modules/jquery/src/css/var/cssExpand.js | 3 + node_modules/jquery/src/css/var/getStyles.js | 5 + node_modules/jquery/src/css/var/isHidden.js | 13 + node_modules/jquery/src/css/var/rmargin.js | 3 + node_modules/jquery/src/css/var/rnumnonpx.js | 5 + node_modules/jquery/src/data.js | 175 + node_modules/jquery/src/data/Data.js | 181 + node_modules/jquery/src/data/accepts.js | 20 + node_modules/jquery/src/data/var/data_priv.js | 5 + node_modules/jquery/src/data/var/data_user.js | 5 + node_modules/jquery/src/deferred.js | 149 + node_modules/jquery/src/deprecated.js | 13 + node_modules/jquery/src/dimensions.js | 50 + node_modules/jquery/src/effects.js | 642 + node_modules/jquery/src/effects/Tween.js | 114 + .../jquery/src/effects/animatedSelector.js | 13 + node_modules/jquery/src/event.js | 859 + node_modules/jquery/src/event/alias.js | 39 + node_modules/jquery/src/event/support.js | 9 + node_modules/jquery/src/exports/amd.js | 18 + node_modules/jquery/src/exports/global.js | 32 + node_modules/jquery/src/intro.js | 44 + node_modules/jquery/src/jquery.js | 36 + node_modules/jquery/src/manipulation.js | 583 + .../jquery/src/manipulation/_evalUrl.js | 18 + .../jquery/src/manipulation/support.js | 24 + .../src/manipulation/var/rcheckableType.js | 3 + node_modules/jquery/src/offset.js | 204 + node_modules/jquery/src/outro.js | 1 + node_modules/jquery/src/queue.js | 142 + node_modules/jquery/src/queue/delay.js | 22 + node_modules/jquery/src/selector-native.js | 171 + node_modules/jquery/src/selector-sizzle.js | 14 + node_modules/jquery/src/selector.js | 1 + node_modules/jquery/src/serialize.js | 111 + node_modules/jquery/src/sizzle/dist/sizzle.js | 2015 ++ .../jquery/src/sizzle/dist/sizzle.min.js | 3 + .../jquery/src/sizzle/dist/sizzle.min.map | 1 + .../jquery/src/sizzle/test/data/empty.js | 0 .../src/sizzle/test/data/mixed_sort.html | 22 + .../jquery/src/sizzle/test/data/testinit.js | 136 + .../jquery/src/sizzle/test/index.html | 242 + node_modules/jquery/src/sizzle/test/jquery.js | 9597 ++++++++ .../jquery/src/sizzle/test/unit/extending.js | 95 + .../jquery/src/sizzle/test/unit/selector.js | 1138 + .../jquery/src/sizzle/test/unit/utilities.js | 169 + node_modules/jquery/src/traversing.js | 200 + .../jquery/src/traversing/findFilter.js | 100 + .../src/traversing/var/rneedsContext.js | 6 + node_modules/jquery/src/var/arr.js | 3 + node_modules/jquery/src/var/class2type.js | 4 + node_modules/jquery/src/var/concat.js | 5 + node_modules/jquery/src/var/hasOwn.js | 5 + node_modules/jquery/src/var/indexOf.js | 5 + node_modules/jquery/src/var/pnum.js | 3 + node_modules/jquery/src/var/push.js | 5 + node_modules/jquery/src/var/rnotwhite.js | 3 + node_modules/jquery/src/var/slice.js | 5 + node_modules/jquery/src/var/strundefined.js | 3 + node_modules/jquery/src/var/support.js | 4 + node_modules/jquery/src/var/toString.js | 5 + node_modules/jquery/src/var/trim.js | 3 + node_modules/jquery/src/wrap.js | 78 + node_modules/jsdom/LICENSE.txt | 22 + node_modules/jsdom/README.md | 352 + node_modules/jsdom/lib/jsdom.js | 367 + .../lib/jsdom/browser/documentfeatures.js | 52 + .../jsdom/lib/jsdom/browser/domtohtml.js | 174 + .../jsdom/lib/jsdom/browser/history.js | 92 + .../jsdom/lib/jsdom/browser/htmlencoding.js | 1506 ++ .../jsdom/lib/jsdom/browser/htmltodom.js | 194 + node_modules/jsdom/lib/jsdom/browser/index.js | 633 + .../jsdom/lib/jsdom/browser/location.js | 98 + node_modules/jsdom/lib/jsdom/browser/utils.js | 12 + node_modules/jsdom/lib/jsdom/level1/core.js | 2065 ++ node_modules/jsdom/lib/jsdom/level2/core.js | 628 + node_modules/jsdom/lib/jsdom/level2/events.js | 468 + node_modules/jsdom/lib/jsdom/level2/html.js | 2011 ++ node_modules/jsdom/lib/jsdom/level2/index.js | 7 + .../lib/jsdom/level2/languages/javascript.js | 13 + node_modules/jsdom/lib/jsdom/level2/style.js | 270 + node_modules/jsdom/lib/jsdom/level3/core.js | 661 + node_modules/jsdom/lib/jsdom/level3/events.js | 299 + node_modules/jsdom/lib/jsdom/level3/html.js | 9 + node_modules/jsdom/lib/jsdom/level3/index.js | 10 + node_modules/jsdom/lib/jsdom/level3/ls.js | 219 + node_modules/jsdom/lib/jsdom/level3/xpath.js | 1866 ++ .../jsdom/lib/jsdom/selectors/index.js | 31 + node_modules/jsdom/lib/jsdom/utils.js | 121 + .../jsdom/node_modules/contextify/.npmignore | 12 + .../jsdom/node_modules/contextify/LICENSE.txt | 22 + .../jsdom/node_modules/contextify/README.md | 106 + .../jsdom/node_modules/contextify/binding.gyp | 9 + .../node_modules/contextify/build/Makefile | 332 + .../Release/.deps/Release/contextify.node.d | 1 + .../Release/obj.target/contextify.node.d | 1 + .../obj.target/contextify/src/contextify.o.d | 28 + .../contextify/build/Release/contextify.node | Bin 0 -> 27180 bytes .../contextify/build/Release/linker.lock | 0 .../build/Release/obj.target/contextify.node | Bin 0 -> 27180 bytes .../obj.target/contextify/src/contextify.o | Bin 0 -> 24968 bytes .../contextify/build/binding.Makefile | 6 + .../node_modules/contextify/build/config.gypi | 120 + .../contextify/build/contextify.target.mk | 127 + .../jsdom/node_modules/contextify/changelog | 49 + .../node_modules/contextify/lib/contextify.js | 48 + .../node_modules/bindings/README.md | 97 + .../node_modules/bindings/bindings.js | 159 + .../node_modules/bindings/package.json | 36 + .../contextify/node_modules/nan/.dntrc | 33 + .../contextify/node_modules/nan/LICENSE | 46 + .../contextify/node_modules/nan/README.md | 818 + .../node_modules/nan/build/config.gypi | 38 + .../node_modules/nan/include_dirs.js | 1 + .../contextify/node_modules/nan/nan.h | 1196 + .../contextify/node_modules/nan/package.json | 55 + .../node_modules/contextify/package.json | 58 + .../node_modules/contextify/src/contextify.cc | 315 + .../contextify/test/contextify.js | 578 + .../jsdom/node_modules/contextify/wscript | 18 + .../jsdom/node_modules/cssom/.gitmodules | 6 + .../jsdom/node_modules/cssom/.npmignore | 6 + .../jsdom/node_modules/cssom/MIT-LICENSE.txt | 20 + .../jsdom/node_modules/cssom/README.mdown | 36 + .../node_modules/cssom/lib/CSSDocumentRule.js | 39 + .../node_modules/cssom/lib/CSSFontFaceRule.js | 36 + .../node_modules/cssom/lib/CSSImportRule.js | 133 + .../node_modules/cssom/lib/CSSKeyframeRule.js | 37 + .../cssom/lib/CSSKeyframesRule.js | 39 + .../node_modules/cssom/lib/CSSMediaRule.js | 41 + .../jsdom/node_modules/cssom/lib/CSSRule.js | 39 + .../cssom/lib/CSSStyleDeclaration.js | 148 + .../node_modules/cssom/lib/CSSStyleRule.js | 190 + .../node_modules/cssom/lib/CSSStyleSheet.js | 88 + .../jsdom/node_modules/cssom/lib/CSSValue.js | 43 + .../cssom/lib/CSSValueExpression.js | 344 + .../node_modules/cssom/lib/MatcherList.js | 62 + .../jsdom/node_modules/cssom/lib/MediaList.js | 61 + .../node_modules/cssom/lib/StyleSheet.js | 17 + .../jsdom/node_modules/cssom/lib/clone.js | 76 + .../jsdom/node_modules/cssom/lib/index.js | 19 + .../jsdom/node_modules/cssom/lib/parse.js | 377 + .../jsdom/node_modules/cssom/package.json | 42 + .../jsdom/node_modules/cssstyle/.npmignore | 1 + .../node_modules/cssstyle/MIT-LICENSE.txt | 20 + .../jsdom/node_modules/cssstyle/README.md | 27 + .../cssstyle/lib/CSSStyleDeclaration.js | 208 + .../lib/css3-properties/borderImage.js | 12 + .../lib/css3-properties/borderImageOutset.js | 12 + .../lib/css3-properties/borderImageRepeat.js | 12 + .../lib/css3-properties/borderImageSlice.js | 12 + .../lib/css3-properties/borderImageSource.js | 12 + .../lib/css3-properties/borderImageWidth.js | 12 + .../node_modules/cssstyle/lib/parsers.js | 617 + .../lib/properties/alignmentBaseline.js | 12 + .../cssstyle/lib/properties/azimuth.js | 65 + .../cssstyle/lib/properties/background.js | 24 + .../lib/properties/backgroundAttachment.js | 22 + .../cssstyle/lib/properties/backgroundClip.js | 12 + .../lib/properties/backgroundColor.js | 33 + .../lib/properties/backgroundImage.js | 29 + .../lib/properties/backgroundOrigin.js | 12 + .../lib/properties/backgroundPosition.js | 53 + .../lib/properties/backgroundPositionX.js | 12 + .../lib/properties/backgroundPositionY.js | 12 + .../lib/properties/backgroundRepeat.js | 25 + .../lib/properties/backgroundRepeatX.js | 12 + .../lib/properties/backgroundRepeatY.js | 12 + .../cssstyle/lib/properties/backgroundSize.js | 12 + .../cssstyle/lib/properties/baselineShift.js | 12 + .../cssstyle/lib/properties/border.js | 22 + .../cssstyle/lib/properties/borderBottom.js | 31 + .../lib/properties/borderBottomColor.js | 16 + .../lib/properties/borderBottomLeftRadius.js | 12 + .../lib/properties/borderBottomRightRadius.js | 12 + .../lib/properties/borderBottomStyle.js | 16 + .../lib/properties/borderBottomWidth.js | 16 + .../cssstyle/lib/properties/borderCollapse.js | 25 + .../cssstyle/lib/properties/borderColor.js | 28 + .../cssstyle/lib/properties/borderImage.js | 12 + .../lib/properties/borderImageOutset.js | 12 + .../lib/properties/borderImageRepeat.js | 12 + .../lib/properties/borderImageSlice.js | 12 + .../lib/properties/borderImageSource.js | 12 + .../lib/properties/borderImageWidth.js | 12 + .../cssstyle/lib/properties/borderLeft.js | 31 + .../lib/properties/borderLeftColor.js | 16 + .../lib/properties/borderLeftStyle.js | 16 + .../lib/properties/borderLeftWidth.js | 16 + .../cssstyle/lib/properties/borderRadius.js | 12 + .../cssstyle/lib/properties/borderRight.js | 31 + .../lib/properties/borderRightColor.js | 16 + .../lib/properties/borderRightStyle.js | 16 + .../lib/properties/borderRightWidth.js | 16 + .../cssstyle/lib/properties/borderSpacing.js | 39 + .../cssstyle/lib/properties/borderStyle.js | 27 + .../cssstyle/lib/properties/borderTop.js | 31 + .../cssstyle/lib/properties/borderTopColor.js | 16 + .../lib/properties/borderTopLeftRadius.js | 12 + .../lib/properties/borderTopRightRadius.js | 12 + .../cssstyle/lib/properties/borderTopStyle.js | 16 + .../cssstyle/lib/properties/borderTopWidth.js | 16 + .../cssstyle/lib/properties/borderWidth.js | 44 + .../cssstyle/lib/properties/bottom.js | 14 + .../cssstyle/lib/properties/boxShadow.js | 12 + .../cssstyle/lib/properties/boxSizing.js | 12 + .../cssstyle/lib/properties/captionSide.js | 12 + .../cssstyle/lib/properties/clear.js | 16 + .../cssstyle/lib/properties/clip.js | 49 + .../cssstyle/lib/properties/color.js | 14 + .../lib/properties/colorInterpolation.js | 12 + .../properties/colorInterpolationFilters.js | 12 + .../cssstyle/lib/properties/colorProfile.js | 12 + .../cssstyle/lib/properties/colorRendering.js | 12 + .../cssstyle/lib/properties/content.js | 12 + .../lib/properties/counterIncrement.js | 12 + .../cssstyle/lib/properties/counterReset.js | 12 + .../cssstyle/lib/properties/cssFloat.js | 12 + .../cssstyle/lib/properties/cue.js | 12 + .../cssstyle/lib/properties/cueAfter.js | 12 + .../cssstyle/lib/properties/cueBefore.js | 12 + .../cssstyle/lib/properties/cursor.js | 12 + .../cssstyle/lib/properties/direction.js | 12 + .../cssstyle/lib/properties/display.js | 12 + .../lib/properties/dominantBaseline.js | 12 + .../cssstyle/lib/properties/elevation.js | 12 + .../cssstyle/lib/properties/emptyCells.js | 12 + .../lib/properties/enableBackground.js | 12 + .../cssstyle/lib/properties/fill.js | 12 + .../cssstyle/lib/properties/fillOpacity.js | 12 + .../cssstyle/lib/properties/fillRule.js | 12 + .../cssstyle/lib/properties/filter.js | 12 + .../cssstyle/lib/properties/floodColor.js | 14 + .../cssstyle/lib/properties/floodOpacity.js | 12 + .../cssstyle/lib/properties/font.js | 40 + .../cssstyle/lib/properties/fontFamily.js | 30 + .../cssstyle/lib/properties/fontSize.js | 25 + .../cssstyle/lib/properties/fontSizeAdjust.js | 12 + .../cssstyle/lib/properties/fontStretch.js | 12 + .../cssstyle/lib/properties/fontStyle.js | 18 + .../cssstyle/lib/properties/fontVariant.js | 18 + .../cssstyle/lib/properties/fontWeight.js | 18 + .../properties/glyphOrientationHorizontal.js | 12 + .../properties/glyphOrientationVertical.js | 12 + .../cssstyle/lib/properties/height.js | 14 + .../cssstyle/lib/properties/imageRendering.js | 12 + .../cssstyle/lib/properties/kerning.js | 12 + .../cssstyle/lib/properties/left.js | 14 + .../cssstyle/lib/properties/letterSpacing.js | 12 + .../cssstyle/lib/properties/lightingColor.js | 14 + .../cssstyle/lib/properties/lineHeight.js | 21 + .../cssstyle/lib/properties/listStyle.js | 12 + .../cssstyle/lib/properties/listStyleImage.js | 12 + .../lib/properties/listStylePosition.js | 12 + .../cssstyle/lib/properties/listStyleType.js | 12 + .../cssstyle/lib/properties/margin.js | 12 + .../cssstyle/lib/properties/marginBottom.js | 12 + .../cssstyle/lib/properties/marginLeft.js | 12 + .../cssstyle/lib/properties/marginRight.js | 12 + .../cssstyle/lib/properties/marginTop.js | 12 + .../cssstyle/lib/properties/marker.js | 12 + .../cssstyle/lib/properties/markerEnd.js | 12 + .../cssstyle/lib/properties/markerMid.js | 12 + .../cssstyle/lib/properties/markerOffset.js | 12 + .../cssstyle/lib/properties/markerStart.js | 12 + .../cssstyle/lib/properties/marks.js | 12 + .../cssstyle/lib/properties/mask.js | 12 + .../cssstyle/lib/properties/maxHeight.js | 12 + .../cssstyle/lib/properties/maxWidth.js | 12 + .../cssstyle/lib/properties/minHeight.js | 12 + .../cssstyle/lib/properties/minWidth.js | 12 + .../cssstyle/lib/properties/opacity.js | 14 + .../cssstyle/lib/properties/orphans.js | 12 + .../cssstyle/lib/properties/outline.js | 12 + .../cssstyle/lib/properties/outlineColor.js | 14 + .../cssstyle/lib/properties/outlineOffset.js | 12 + .../cssstyle/lib/properties/outlineStyle.js | 12 + .../cssstyle/lib/properties/outlineWidth.js | 12 + .../cssstyle/lib/properties/overflow.js | 12 + .../cssstyle/lib/properties/overflowX.js | 12 + .../cssstyle/lib/properties/overflowY.js | 12 + .../cssstyle/lib/properties/padding.js | 12 + .../cssstyle/lib/properties/paddingBottom.js | 12 + .../cssstyle/lib/properties/paddingLeft.js | 12 + .../cssstyle/lib/properties/paddingRight.js | 12 + .../cssstyle/lib/properties/paddingTop.js | 12 + .../cssstyle/lib/properties/page.js | 12 + .../cssstyle/lib/properties/pageBreakAfter.js | 12 + .../lib/properties/pageBreakBefore.js | 12 + .../lib/properties/pageBreakInside.js | 12 + .../cssstyle/lib/properties/pause.js | 12 + .../cssstyle/lib/properties/pauseAfter.js | 12 + .../cssstyle/lib/properties/pauseBefore.js | 12 + .../cssstyle/lib/properties/pitch.js | 12 + .../cssstyle/lib/properties/pitchRange.js | 12 + .../cssstyle/lib/properties/playDuring.js | 12 + .../cssstyle/lib/properties/pointerEvents.js | 12 + .../cssstyle/lib/properties/position.js | 12 + .../cssstyle/lib/properties/quotes.js | 12 + .../cssstyle/lib/properties/resize.js | 12 + .../cssstyle/lib/properties/richness.js | 12 + .../cssstyle/lib/properties/right.js | 14 + .../cssstyle/lib/properties/shapeRendering.js | 12 + .../cssstyle/lib/properties/size.js | 12 + .../cssstyle/lib/properties/speak.js | 12 + .../cssstyle/lib/properties/speakHeader.js | 12 + .../cssstyle/lib/properties/speakNumeral.js | 12 + .../lib/properties/speakPunctuation.js | 12 + .../cssstyle/lib/properties/speechRate.js | 12 + .../cssstyle/lib/properties/src.js | 12 + .../cssstyle/lib/properties/stopColor.js | 14 + .../cssstyle/lib/properties/stopOpacity.js | 12 + .../cssstyle/lib/properties/stress.js | 12 + .../cssstyle/lib/properties/stroke.js | 12 + .../lib/properties/strokeDasharray.js | 12 + .../lib/properties/strokeDashoffset.js | 12 + .../cssstyle/lib/properties/strokeLinecap.js | 12 + .../cssstyle/lib/properties/strokeLinejoin.js | 12 + .../lib/properties/strokeMiterlimit.js | 12 + .../cssstyle/lib/properties/strokeOpacity.js | 12 + .../cssstyle/lib/properties/strokeWidth.js | 12 + .../cssstyle/lib/properties/tableLayout.js | 12 + .../cssstyle/lib/properties/textAlign.js | 12 + .../cssstyle/lib/properties/textAnchor.js | 12 + .../cssstyle/lib/properties/textDecoration.js | 12 + .../cssstyle/lib/properties/textIndent.js | 12 + .../lib/properties/textLineThrough.js | 12 + .../lib/properties/textLineThroughColor.js | 14 + .../lib/properties/textLineThroughMode.js | 12 + .../lib/properties/textLineThroughStyle.js | 12 + .../lib/properties/textLineThroughWidth.js | 12 + .../cssstyle/lib/properties/textOverflow.js | 12 + .../cssstyle/lib/properties/textOverline.js | 12 + .../lib/properties/textOverlineColor.js | 14 + .../lib/properties/textOverlineMode.js | 12 + .../lib/properties/textOverlineStyle.js | 12 + .../lib/properties/textOverlineWidth.js | 12 + .../cssstyle/lib/properties/textRendering.js | 12 + .../cssstyle/lib/properties/textShadow.js | 12 + .../cssstyle/lib/properties/textTransform.js | 12 + .../cssstyle/lib/properties/textUnderline.js | 12 + .../lib/properties/textUnderlineColor.js | 14 + .../lib/properties/textUnderlineMode.js | 12 + .../lib/properties/textUnderlineStyle.js | 12 + .../lib/properties/textUnderlineWidth.js | 12 + .../cssstyle/lib/properties/top.js | 14 + .../cssstyle/lib/properties/unicodeBidi.js | 12 + .../cssstyle/lib/properties/unicodeRange.js | 12 + .../cssstyle/lib/properties/vectorEffect.js | 12 + .../cssstyle/lib/properties/verticalAlign.js | 12 + .../cssstyle/lib/properties/visibility.js | 12 + .../cssstyle/lib/properties/voiceFamily.js | 12 + .../cssstyle/lib/properties/volume.js | 12 + .../lib/properties/webkitAnimation.js | 12 + .../lib/properties/webkitAnimationDelay.js | 12 + .../properties/webkitAnimationDirection.js | 12 + .../lib/properties/webkitAnimationDuration.js | 12 + .../lib/properties/webkitAnimationFillMode.js | 12 + .../webkitAnimationIterationCount.js | 12 + .../lib/properties/webkitAnimationName.js | 12 + .../properties/webkitAnimationPlayState.js | 12 + .../webkitAnimationTimingFunction.js | 12 + .../lib/properties/webkitAppearance.js | 12 + .../lib/properties/webkitAspectRatio.js | 12 + .../properties/webkitBackfaceVisibility.js | 12 + .../lib/properties/webkitBackgroundClip.js | 12 + .../properties/webkitBackgroundComposite.js | 12 + .../lib/properties/webkitBackgroundOrigin.js | 12 + .../lib/properties/webkitBackgroundSize.js | 12 + .../lib/properties/webkitBorderAfter.js | 12 + .../lib/properties/webkitBorderAfterColor.js | 14 + .../lib/properties/webkitBorderAfterStyle.js | 12 + .../lib/properties/webkitBorderAfterWidth.js | 12 + .../lib/properties/webkitBorderBefore.js | 12 + .../lib/properties/webkitBorderBeforeColor.js | 14 + .../lib/properties/webkitBorderBeforeStyle.js | 12 + .../lib/properties/webkitBorderBeforeWidth.js | 12 + .../lib/properties/webkitBorderEnd.js | 12 + .../lib/properties/webkitBorderEndColor.js | 14 + .../lib/properties/webkitBorderEndStyle.js | 12 + .../lib/properties/webkitBorderEndWidth.js | 12 + .../lib/properties/webkitBorderFit.js | 12 + .../webkitBorderHorizontalSpacing.js | 12 + .../lib/properties/webkitBorderImage.js | 12 + .../lib/properties/webkitBorderRadius.js | 12 + .../lib/properties/webkitBorderStart.js | 12 + .../lib/properties/webkitBorderStartColor.js | 14 + .../lib/properties/webkitBorderStartStyle.js | 12 + .../lib/properties/webkitBorderStartWidth.js | 12 + .../properties/webkitBorderVerticalSpacing.js | 12 + .../cssstyle/lib/properties/webkitBoxAlign.js | 12 + .../lib/properties/webkitBoxDirection.js | 12 + .../cssstyle/lib/properties/webkitBoxFlex.js | 12 + .../lib/properties/webkitBoxFlexGroup.js | 12 + .../cssstyle/lib/properties/webkitBoxLines.js | 12 + .../lib/properties/webkitBoxOrdinalGroup.js | 12 + .../lib/properties/webkitBoxOrient.js | 12 + .../cssstyle/lib/properties/webkitBoxPack.js | 12 + .../lib/properties/webkitBoxReflect.js | 12 + .../lib/properties/webkitBoxShadow.js | 12 + .../lib/properties/webkitColorCorrection.js | 12 + .../lib/properties/webkitColumnAxis.js | 12 + .../lib/properties/webkitColumnBreakAfter.js | 12 + .../lib/properties/webkitColumnBreakBefore.js | 12 + .../lib/properties/webkitColumnBreakInside.js | 12 + .../lib/properties/webkitColumnCount.js | 12 + .../lib/properties/webkitColumnGap.js | 12 + .../lib/properties/webkitColumnRule.js | 12 + .../lib/properties/webkitColumnRuleColor.js | 14 + .../lib/properties/webkitColumnRuleStyle.js | 12 + .../lib/properties/webkitColumnRuleWidth.js | 12 + .../lib/properties/webkitColumnSpan.js | 12 + .../lib/properties/webkitColumnWidth.js | 12 + .../cssstyle/lib/properties/webkitColumns.js | 12 + .../cssstyle/lib/properties/webkitFilter.js | 12 + .../lib/properties/webkitFlexAlign.js | 12 + .../lib/properties/webkitFlexDirection.js | 12 + .../cssstyle/lib/properties/webkitFlexFlow.js | 12 + .../lib/properties/webkitFlexItemAlign.js | 12 + .../lib/properties/webkitFlexLinePack.js | 12 + .../lib/properties/webkitFlexOrder.js | 12 + .../cssstyle/lib/properties/webkitFlexPack.js | 12 + .../cssstyle/lib/properties/webkitFlexWrap.js | 12 + .../cssstyle/lib/properties/webkitFlowFrom.js | 12 + .../cssstyle/lib/properties/webkitFlowInto.js | 12 + .../properties/webkitFontFeatureSettings.js | 12 + .../lib/properties/webkitFontKerning.js | 12 + .../lib/properties/webkitFontSizeDelta.js | 12 + .../lib/properties/webkitFontSmoothing.js | 12 + .../properties/webkitFontVariantLigatures.js | 12 + .../lib/properties/webkitHighlight.js | 12 + .../properties/webkitHyphenateCharacter.js | 12 + .../properties/webkitHyphenateLimitAfter.js | 12 + .../properties/webkitHyphenateLimitBefore.js | 12 + .../properties/webkitHyphenateLimitLines.js | 12 + .../cssstyle/lib/properties/webkitHyphens.js | 12 + .../lib/properties/webkitLineAlign.js | 12 + .../lib/properties/webkitLineBoxContain.js | 12 + .../lib/properties/webkitLineBreak.js | 12 + .../lib/properties/webkitLineClamp.js | 12 + .../cssstyle/lib/properties/webkitLineGrid.js | 12 + .../cssstyle/lib/properties/webkitLineSnap.js | 12 + .../cssstyle/lib/properties/webkitLocale.js | 12 + .../lib/properties/webkitLogicalHeight.js | 12 + .../lib/properties/webkitLogicalWidth.js | 12 + .../lib/properties/webkitMarginAfter.js | 12 + .../properties/webkitMarginAfterCollapse.js | 12 + .../lib/properties/webkitMarginBefore.js | 12 + .../properties/webkitMarginBeforeCollapse.js | 12 + .../properties/webkitMarginBottomCollapse.js | 12 + .../lib/properties/webkitMarginCollapse.js | 12 + .../lib/properties/webkitMarginEnd.js | 12 + .../lib/properties/webkitMarginStart.js | 12 + .../lib/properties/webkitMarginTopCollapse.js | 12 + .../cssstyle/lib/properties/webkitMarquee.js | 12 + .../lib/properties/webkitMarqueeDirection.js | 12 + .../lib/properties/webkitMarqueeIncrement.js | 12 + .../lib/properties/webkitMarqueeRepetition.js | 12 + .../lib/properties/webkitMarqueeSpeed.js | 12 + .../lib/properties/webkitMarqueeStyle.js | 12 + .../cssstyle/lib/properties/webkitMask.js | 12 + .../lib/properties/webkitMaskAttachment.js | 12 + .../lib/properties/webkitMaskBoxImage.js | 12 + .../properties/webkitMaskBoxImageOutset.js | 12 + .../properties/webkitMaskBoxImageRepeat.js | 12 + .../lib/properties/webkitMaskBoxImageSlice.js | 12 + .../properties/webkitMaskBoxImageSource.js | 12 + .../lib/properties/webkitMaskBoxImageWidth.js | 12 + .../cssstyle/lib/properties/webkitMaskClip.js | 12 + .../lib/properties/webkitMaskComposite.js | 12 + .../lib/properties/webkitMaskImage.js | 12 + .../lib/properties/webkitMaskOrigin.js | 12 + .../lib/properties/webkitMaskPosition.js | 12 + .../lib/properties/webkitMaskPositionX.js | 12 + .../lib/properties/webkitMaskPositionY.js | 12 + .../lib/properties/webkitMaskRepeat.js | 12 + .../lib/properties/webkitMaskRepeatX.js | 12 + .../lib/properties/webkitMaskRepeatY.js | 12 + .../cssstyle/lib/properties/webkitMaskSize.js | 12 + .../webkitMatchNearestMailBlockquoteColor.js | 14 + .../lib/properties/webkitMaxLogicalHeight.js | 12 + .../lib/properties/webkitMaxLogicalWidth.js | 12 + .../lib/properties/webkitMinLogicalHeight.js | 12 + .../lib/properties/webkitMinLogicalWidth.js | 12 + .../cssstyle/lib/properties/webkitNbspMode.js | 12 + .../lib/properties/webkitOverflowScrolling.js | 12 + .../lib/properties/webkitPaddingAfter.js | 12 + .../lib/properties/webkitPaddingBefore.js | 12 + .../lib/properties/webkitPaddingEnd.js | 12 + .../lib/properties/webkitPaddingStart.js | 12 + .../lib/properties/webkitPerspective.js | 12 + .../lib/properties/webkitPerspectiveOrigin.js | 12 + .../properties/webkitPerspectiveOriginX.js | 12 + .../properties/webkitPerspectiveOriginY.js | 12 + .../lib/properties/webkitPrintColorAdjust.js | 12 + .../lib/properties/webkitRegionBreakAfter.js | 12 + .../lib/properties/webkitRegionBreakBefore.js | 12 + .../lib/properties/webkitRegionBreakInside.js | 12 + .../lib/properties/webkitRegionOverflow.js | 12 + .../lib/properties/webkitRtlOrdering.js | 12 + .../lib/properties/webkitSvgShadow.js | 12 + .../lib/properties/webkitTapHighlightColor.js | 14 + .../lib/properties/webkitTextCombine.js | 12 + .../webkitTextDecorationsInEffect.js | 12 + .../lib/properties/webkitTextEmphasis.js | 12 + .../lib/properties/webkitTextEmphasisColor.js | 14 + .../properties/webkitTextEmphasisPosition.js | 12 + .../lib/properties/webkitTextEmphasisStyle.js | 12 + .../lib/properties/webkitTextFillColor.js | 14 + .../lib/properties/webkitTextOrientation.js | 12 + .../lib/properties/webkitTextSecurity.js | 12 + .../lib/properties/webkitTextSizeAdjust.js | 12 + .../lib/properties/webkitTextStroke.js | 12 + .../lib/properties/webkitTextStrokeColor.js | 14 + .../lib/properties/webkitTextStrokeWidth.js | 12 + .../lib/properties/webkitTransform.js | 12 + .../lib/properties/webkitTransformOrigin.js | 12 + .../lib/properties/webkitTransformOriginX.js | 12 + .../lib/properties/webkitTransformOriginY.js | 12 + .../lib/properties/webkitTransformOriginZ.js | 12 + .../lib/properties/webkitTransformStyle.js | 12 + .../lib/properties/webkitTransition.js | 12 + .../lib/properties/webkitTransitionDelay.js | 12 + .../properties/webkitTransitionDuration.js | 12 + .../properties/webkitTransitionProperty.js | 12 + .../webkitTransitionTimingFunction.js | 12 + .../cssstyle/lib/properties/webkitUserDrag.js | 12 + .../lib/properties/webkitUserModify.js | 12 + .../lib/properties/webkitUserSelect.js | 12 + .../cssstyle/lib/properties/webkitWrap.js | 12 + .../cssstyle/lib/properties/webkitWrapFlow.js | 12 + .../lib/properties/webkitWrapMargin.js | 12 + .../lib/properties/webkitWrapPadding.js | 12 + .../lib/properties/webkitWrapShapeInside.js | 12 + .../lib/properties/webkitWrapShapeOutside.js | 12 + .../lib/properties/webkitWrapThrough.js | 12 + .../lib/properties/webkitWritingMode.js | 12 + .../cssstyle/lib/properties/whiteSpace.js | 12 + .../cssstyle/lib/properties/widows.js | 12 + .../cssstyle/lib/properties/width.js | 14 + .../cssstyle/lib/properties/wordBreak.js | 12 + .../cssstyle/lib/properties/wordSpacing.js | 12 + .../cssstyle/lib/properties/wordWrap.js | 12 + .../cssstyle/lib/properties/writingMode.js | 12 + .../cssstyle/lib/properties/zIndex.js | 12 + .../cssstyle/lib/properties/zoom.js | 12 + .../jsdom/node_modules/cssstyle/package.json | 58 + .../node_modules/cssstyle/tests/tests.js | 198 + .../node_modules/htmlparser2/.gitattributes | 2 + .../jsdom/node_modules/htmlparser2/.npmignore | 2 + .../node_modules/htmlparser2/.travis.yml | 5 + .../jsdom/node_modules/htmlparser2/LICENSE | 18 + .../jsdom/node_modules/htmlparser2/README.md | 81 + .../htmlparser2/lib/CollectingHandler.js | 55 + .../htmlparser2/lib/FeedHandler.js | 95 + .../node_modules/htmlparser2/lib/Parser.js | 333 + .../htmlparser2/lib/ProxyHandler.js | 27 + .../node_modules/htmlparser2/lib/Stream.js | 35 + .../node_modules/htmlparser2/lib/Tokenizer.js | 878 + .../htmlparser2/lib/WritableStream.js | 21 + .../htmlparser2/lib/entities/decode.json | 1 + .../htmlparser2/lib/entities/entities.json | 1 + .../htmlparser2/lib/entities/legacy.json | 1 + .../htmlparser2/lib/entities/xml.json | 1 + .../node_modules/htmlparser2/lib/index.js | 70 + .../node_modules/domelementtype/LICENSE | 11 + .../node_modules/domelementtype/index.js | 14 + .../node_modules/domelementtype/package.json | 26 + .../node_modules/domelementtype/readme.md | 1 + .../node_modules/domhandler/.travis.yml | 6 + .../node_modules/domhandler/LICENSE | 11 + .../node_modules/domhandler/index.js | 211 + .../node_modules/domhandler/package.json | 51 + .../node_modules/domhandler/readme.md | 102 + .../domhandler/test/cases/01-basic.json | 57 + .../test/cases/02-single_tag_1.json | 21 + .../test/cases/03-single_tag_2.json | 21 + .../test/cases/04-unescaped_in_script.json | 27 + .../test/cases/05-tags_in_comment.json | 18 + .../test/cases/06-comment_in_script.json | 18 + .../test/cases/07-unescaped_in_style.json | 20 + .../test/cases/08-extra_spaces_in_tag.json | 20 + .../test/cases/09-unquoted_attrib.json | 20 + .../test/cases/10-singular_attribute.json | 15 + .../test/cases/11-text_outside_tags.json | 40 + .../domhandler/test/cases/12-text_only.json | 11 + .../test/cases/13-comment_in_text.json | 19 + .../cases/14-comment_in_text_in_script.json | 18 + .../domhandler/test/cases/15-non-verbose.json | 22 + .../test/cases/16-normalize_whitespace.json | 47 + .../test/cases/17-xml_namespace.json | 18 + .../test/cases/18-enforce_empty_tags.json | 16 + .../test/cases/19-ignore_empty_tags.json | 20 + .../test/cases/20-template_script_tags.json | 20 + .../test/cases/21-conditional_comments.json | 15 + .../test/cases/22-lowercase_tags.json | 41 + .../domhandler/test/cases/23-dom-lvl1.json | 121 + .../node_modules/domhandler/test/tests.js | 58 + .../htmlparser2/node_modules/domutils/LICENSE | 11 + .../node_modules/domutils/index.js | 10 + .../node_modules/domutils/lib/helpers.js | 31 + .../node_modules/domutils/lib/legacy.js | 87 + .../node_modules/domutils/lib/manipulation.js | 74 + .../node_modules/domutils/lib/querying.js | 76 + .../node_modules/domutils/lib/stringify.js | 93 + .../node_modules/domutils/lib/traversal.js | 24 + .../node_modules/domutils/package.json | 55 + .../node_modules/domutils/readme.md | 1 + .../node_modules/domutils/test/fixture.js | 6 + .../domutils/test/tests/helpers.js | 29 + .../domutils/test/tests/legacy.js | 119 + .../node_modules/domutils/test/utils.js | 9 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 18 + .../node_modules/readable-stream/README.md | 15 + .../node_modules/readable-stream/duplex.js | 1 + .../node_modules/readable-stream/float.patch | 923 + .../readable-stream/lib/_stream_duplex.js | 75 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 925 + .../readable-stream/lib/_stream_transform.js | 210 + .../readable-stream/lib/_stream_writable.js | 467 + .../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 | 35 + .../node_modules/core-util-is/util.js | 106 + .../node_modules/debuglog/LICENSE | 19 + .../node_modules/debuglog/README.md | 40 + .../node_modules/debuglog/debuglog.js | 22 + .../node_modules/debuglog/package.json | 26 + .../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 | 200 + .../node_modules/string_decoder/package.json | 32 + .../node_modules/readable-stream/package.json | 43 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 7 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../node_modules/htmlparser2/package.json | 52 + .../htmlparser2/test/01-events.js | 9 + .../htmlparser2/test/02-stream.js | 23 + .../node_modules/htmlparser2/test/03-feed.js | 19 + .../test/Documents/Atom_Example.xml | 25 + .../test/Documents/Attributes.html | 16 + .../htmlparser2/test/Documents/Basic.html | 1 + .../test/Documents/RDF_Example.xml | 63 + .../test/Documents/RSS_Example.xml | 48 + .../htmlparser2/test/Events/01-simple.json | 44 + .../htmlparser2/test/Events/02-template.json | 63 + .../test/Events/03-lowercase_tags.json | 46 + .../htmlparser2/test/Events/04-cdata.json | 43 + .../test/Events/05-cdata-special.json | 35 + .../test/Events/06-leading-lt.json | 16 + .../test/Events/07-self-closing.json | 67 + .../test/Events/08-implicit-close-tags.json | 59 + .../test/Events/09-attributes.json | 68 + .../test/Events/10-crazy-attrib.json | 52 + .../test/Events/11-script_in_script.json | 54 + .../test/Events/12-long-comment-end.json | 20 + .../test/Events/13-long-cdata-end.json | 22 + .../test/Events/14-implicit-open-tags.json | 24 + .../test/Events/15-lt-whitespace.json | 16 + .../test/Events/16-double_attribs.json | 45 + .../test/Events/17-numeric_entities.json | 16 + .../test/Events/18-legacy_entities.json | 16 + .../test/Events/19-named_entities.json | 16 + .../test/Events/20-xml_entities.json | 16 + .../test/Events/21-entity_in_attribute.json | 38 + .../test/Events/22-double_brackets.json | 41 + .../test/Events/23-legacy_entity_fail.json | 16 + .../htmlparser2/test/Feeds/01-rss.js | 34 + .../htmlparser2/test/Feeds/02-atom.js | 18 + .../htmlparser2/test/Feeds/03-rdf.js | 20 + .../htmlparser2/test/Stream/01-basic.json | 83 + .../htmlparser2/test/Stream/02-RSS.json | 1093 + .../htmlparser2/test/Stream/03-Atom.json | 644 + .../htmlparser2/test/Stream/04-RDF.json | 1399 ++ .../test/Stream/05-Attributes.json | 354 + .../htmlparser2/test/test-helper.js | 81 + .../jsdom/node_modules/nwmatcher/.npmignore | 8 + .../jsdom/node_modules/nwmatcher/LICENSE | 22 + .../jsdom/node_modules/nwmatcher/README | 0 .../jsdom/node_modules/nwmatcher/README.md | 91 + .../node_modules/nwmatcher/dist/lint.log | 0 .../nwmatcher/lib/ender/bridge.js | 105 + .../lib/prototype/selector_engine.js | 23 + .../jsdom/node_modules/nwmatcher/package.json | 47 + .../nwmatcher/src/modules/nwmatcher-cache.js | 184 + .../nwmatcher/src/modules/nwmatcher-jquery.js | 119 + .../src/modules/nwmatcher-pseudos.js | 275 + .../src/modules/nwmatcher-shortcuts.js | 35 + .../src/modules/nwmatcher-traversal.js | 90 + .../src/modules/nwmatcher-webforms.js | 100 + .../nwmatcher/src/nwmatcher-base.js | 683 + .../nwmatcher/src/nwmatcher-noqsa.js | 841 + .../node_modules/nwmatcher/src/nwmatcher.js | 1658 ++ .../jsdom/node_modules/request/.npmignore | 2 + .../jsdom/node_modules/request/.travis.yml | 12 + .../jsdom/node_modules/request/LICENSE | 55 + .../jsdom/node_modules/request/README.md | 377 + .../jsdom/node_modules/request/dns-request.js | 7 + .../jsdom/node_modules/request/index.js | 150 + .../jsdom/node_modules/request/lib/cookies.js | 36 + .../jsdom/node_modules/request/lib/copy.js | 8 + .../jsdom/node_modules/request/lib/debug.js | 7 + .../jsdom/node_modules/request/lib/getSafe.js | 34 + .../node_modules/request/lib/optional.js | 5 + .../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 | 28 + .../node_modules/forever-agent/LICENSE | 55 + .../node_modules/forever-agent/README.md | 4 + .../node_modules/forever-agent/index.js | 119 + .../node_modules/forever-agent/package.json | 28 + .../request/node_modules/form-data/License | 19 + .../request/node_modules/form-data/Readme.md | 163 + .../node_modules/form-data/lib/form_data.js | 325 + .../form-data/node_modules/async/LICENSE | 19 + .../form-data/node_modules/async/README.md | 1425 ++ .../node_modules/async/component.json | 11 + .../form-data/node_modules/async/lib/async.js | 958 + .../form-data/node_modules/async/package.json | 43 + .../node_modules/combined-stream/.npmignore | 3 + .../node_modules/combined-stream/License | 19 + .../node_modules/combined-stream/Makefile | 7 + .../node_modules/combined-stream/Readme.md | 132 + .../combined-stream/lib/combined_stream.js | 185 + .../node_modules/delayed-stream/.npmignore | 2 + .../node_modules/delayed-stream/License | 19 + .../node_modules/delayed-stream/Makefile | 7 + .../node_modules/delayed-stream/Readme.md | 154 + .../delayed-stream/lib/delayed_stream.js | 99 + .../node_modules/delayed-stream/package.json | 31 + .../delayed-stream/test/common.js | 6 + .../integration/test-delayed-http-upload.js | 38 + .../test-delayed-stream-auto-pause.js | 21 + .../integration/test-delayed-stream-pause.js | 14 + .../test/integration/test-delayed-stream.js | 48 + .../integration/test-handle-source-errors.js | 15 + .../test/integration/test-max-data-size.js | 18 + .../test/integration/test-pipe-resumes.js | 13 + .../test/integration/test-proxy-readable.js | 13 + .../node_modules/delayed-stream/test/run.js | 7 + .../node_modules/combined-stream/package.json | 32 + .../combined-stream/test/common.js | 23 + .../combined-stream/test/fixture/file1.txt | 256 + .../combined-stream/test/fixture/file2.txt | 256 + .../test/integration/test-callback-streams.js | 27 + .../test/integration/test-data-size.js | 34 + ...delayed-streams-and-buffers-and-strings.js | 38 + .../test/integration/test-delayed-streams.js | 35 + .../test/integration/test-empty-string.js | 39 + .../test/integration/test-is-stream-like.js | 17 + .../test/integration/test-max-data-size.js | 24 + .../test/integration/test-unpaused-streams.js | 30 + .../node_modules/combined-stream/test/run.js | 7 + .../node_modules/form-data/package.json | 46 + .../request/node_modules/hawk/.npmignore | 18 + .../request/node_modules/hawk/.travis.yml | 5 + .../request/node_modules/hawk/LICENSE | 24 + .../request/node_modules/hawk/Makefile | 10 + .../request/node_modules/hawk/README.md | 627 + .../node_modules/hawk/example/usage.js | 78 + .../request/node_modules/hawk/images/hawk.png | Bin 0 -> 6945 bytes .../request/node_modules/hawk/images/logo.png | Bin 0 -> 71732 bytes .../request/node_modules/hawk/index.js | 1 + .../request/node_modules/hawk/lib/browser.js | 485 + .../request/node_modules/hawk/lib/client.js | 367 + .../request/node_modules/hawk/lib/crypto.js | 111 + .../request/node_modules/hawk/lib/index.js | 15 + .../request/node_modules/hawk/lib/server.js | 524 + .../request/node_modules/hawk/lib/utils.js | 183 + .../hawk/node_modules/boom/.npmignore | 18 + .../hawk/node_modules/boom/.travis.yml | 5 + .../hawk/node_modules/boom/LICENSE | 24 + .../hawk/node_modules/boom/Makefile | 11 + .../hawk/node_modules/boom/README.md | 6 + .../hawk/node_modules/boom/images/boom.png | Bin 0 -> 29479 bytes .../hawk/node_modules/boom/index.js | 1 + .../hawk/node_modules/boom/lib/index.js | 207 + .../hawk/node_modules/boom/package.json | 47 + .../hawk/node_modules/boom/test/index.js | 245 + .../hawk/node_modules/cryptiles/.npmignore | 18 + .../hawk/node_modules/cryptiles/.travis.yml | 5 + .../hawk/node_modules/cryptiles/LICENSE | 24 + .../hawk/node_modules/cryptiles/Makefile | 11 + .../hawk/node_modules/cryptiles/README.md | 6 + .../hawk/node_modules/cryptiles/index.js | 1 + .../hawk/node_modules/cryptiles/lib/index.js | 68 + .../hawk/node_modules/cryptiles/package.json | 48 + .../hawk/node_modules/cryptiles/test/index.js | 101 + .../hawk/node_modules/hoek/.npmignore | 18 + .../hawk/node_modules/hoek/.travis.yml | 5 + .../hawk/node_modules/hoek/LICENSE | 33 + .../hawk/node_modules/hoek/Makefile | 10 + .../hawk/node_modules/hoek/README.md | 436 + .../hawk/node_modules/hoek/images/hoek.png | Bin 0 -> 37939 bytes .../hawk/node_modules/hoek/index.js | 1 + .../hawk/node_modules/hoek/lib/escape.js | 132 + .../hawk/node_modules/hoek/lib/index.js | 585 + .../hawk/node_modules/hoek/package.json | 49 + .../hawk/node_modules/hoek/test/escaper.js | 86 + .../hawk/node_modules/hoek/test/index.js | 1078 + .../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 | 24 + .../hawk/node_modules/sntp/Makefile | 11 + .../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 | 409 + .../hawk/node_modules/sntp/package.json | 48 + .../hawk/node_modules/sntp/test/index.js | 359 + .../request/node_modules/hawk/package.json | 53 + .../request/node_modules/hawk/test/browser.js | 771 + .../request/node_modules/hawk/test/client.js | 206 + .../request/node_modules/hawk/test/crypto.js | 86 + .../request/node_modules/hawk/test/index.js | 316 + .../request/node_modules/hawk/test/message.js | 246 + .../request/node_modules/hawk/test/readme.js | 98 + .../request/node_modules/hawk/test/server.js | 686 + .../request/node_modules/hawk/test/uri.js | 456 + .../request/node_modules/hawk/test/utils.js | 120 + .../http-signature/.dir-locals.el | 6 + .../node_modules/http-signature/.npmignore | 7 + .../node_modules/http-signature/LICENSE | 18 + .../node_modules/http-signature/README.md | 75 + .../http-signature/http_signing.md | 296 + .../node_modules/http-signature/lib/index.js | 25 + .../node_modules/http-signature/lib/parser.js | 304 + .../node_modules/http-signature/lib/signer.js | 179 + .../node_modules/http-signature/lib/util.js | 249 + .../node_modules/http-signature/lib/verify.js | 42 + .../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 | 43 + .../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 | 196 + .../node_modules/assert-plus/package.json | 20 + .../node_modules/ctype/CHANGELOG | 71 + .../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 | 18 + .../node_modules/ctype/tools/jsl.conf | 129 + .../node_modules/ctype/tools/jsstyle | 839 + .../node_modules/ctype/tst/ctf/float.json | 13 + .../node_modules/ctype/tst/ctf/int.json | 13 + .../node_modules/ctype/tst/ctf/psinfo.json | 104 + .../node_modules/ctype/tst/ctf/struct.json | 19 + .../node_modules/ctype/tst/ctf/tst.fail.js | 39 + .../node_modules/ctype/tst/ctf/tst.float.js | 14 + .../node_modules/ctype/tst/ctf/tst.int.js | 14 + .../node_modules/ctype/tst/ctf/tst.psinfo.js | 17 + .../node_modules/ctype/tst/ctf/tst.struct.js | 18 + .../node_modules/ctype/tst/ctf/tst.typedef.js | 15 + .../node_modules/ctype/tst/ctf/typedef.json | 14 + .../ctype/tst/ctio/float/tst.rfloat.js | 767 + .../ctype/tst/ctio/float/tst.wfloat.js | 753 + .../node_modules/ctype/tst/ctio/int/tst.64.js | 638 + .../ctype/tst/ctio/int/tst.rint.js | 101 + .../ctype/tst/ctio/int/tst.wbounds.js | 53 + .../ctype/tst/ctio/int/tst.wint.js | 92 + .../ctype/tst/ctio/uint/tst.64.js | 451 + .../ctype/tst/ctio/uint/tst.roundtrip.js | 81 + .../ctype/tst/ctio/uint/tst.ruint.js | 95 + .../ctype/tst/ctio/uint/tst.wuint.js | 156 + .../ctype/tst/ctype/tst.basicr.js | 50 + .../ctype/tst/ctype/tst.basicw.js | 44 + .../node_modules/ctype/tst/ctype/tst.char.js | 42 + .../ctype/tst/ctype/tst.endian.js | 45 + .../ctype/tst/ctype/tst.oldwrite.js | 28 + .../ctype/tst/ctype/tst.readSize.js | 128 + .../ctype/tst/ctype/tst.structw.js | 28 + .../ctype/tst/ctype/tst.writeStruct.js | 31 + .../node_modules/http-signature/package.json | 36 + .../node_modules/json-stringify-safe/LICENSE | 27 + .../json-stringify-safe/README.md | 49 + .../json-stringify-safe/package.json | 33 + .../json-stringify-safe/stringify.js | 39 + .../node_modules/json-stringify-safe/test.js | 128 + .../request/node_modules/mime/LICENSE | 19 + .../request/node_modules/mime/README.md | 66 + .../request/node_modules/mime/mime.js | 114 + .../request/node_modules/mime/package.json | 36 + .../request/node_modules/mime/test.js | 84 + .../node_modules/mime/types/mime.types | 1588 ++ .../node_modules/mime/types/node.types | 77 + .../request/node_modules/node-uuid/.npmignore | 2 + .../request/node_modules/node-uuid/LICENSE.md | 2 + .../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 + .../node_modules/node-uuid/component.json | 18 + .../node_modules/node-uuid/package.json | 47 + .../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 | 245 + .../request/node_modules/oauth-sign/LICENSE | 55 + .../request/node_modules/oauth-sign/README.md | 4 + .../request/node_modules/oauth-sign/index.js | 43 + .../node_modules/oauth-sign/package.json | 31 + .../request/node_modules/oauth-sign/test.js | 49 + .../request/node_modules/qs/.gitmodules | 6 + .../request/node_modules/qs/.npmignore | 7 + .../request/node_modules/qs/Readme.md | 58 + .../request/node_modules/qs/index.js | 366 + .../request/node_modules/qs/package.json | 38 + .../node_modules/tough-cookie/.jshintrc | 70 + .../node_modules/tough-cookie/.npmignore | 3 + .../node_modules/tough-cookie/.travis.yml | 8 + .../request/node_modules/tough-cookie/LICENSE | 78 + .../node_modules/tough-cookie/README.md | 412 + .../tough-cookie/generate-pubsuffix.js | 239 + .../node_modules/tough-cookie/lib/cookie.js | 1107 + .../node_modules/tough-cookie/lib/memstore.js | 123 + .../tough-cookie/lib/pubsuffix.js | 69 + .../node_modules/tough-cookie/lib/store.js | 37 + .../node_modules/punycode/LICENSE-GPL.txt | 278 + .../node_modules/punycode/LICENSE-MIT.txt | 20 + .../node_modules/punycode/README.md | 162 + .../node_modules/punycode/package.json | 74 + .../node_modules/punycode/punycode.js | 507 + .../node_modules/punycode/punycode.min.js | 2 + .../node_modules/tough-cookie/package.json | 45 + .../tough-cookie/public-suffix.txt | 5229 ++++ .../request/node_modules/tough-cookie/test.js | 1625 ++ .../request/node_modules/tunnel-agent/LICENSE | 55 + .../node_modules/tunnel-agent/README.md | 4 + .../node_modules/tunnel-agent/index.js | 227 + .../node_modules/tunnel-agent/package.json | 28 + .../jsdom/node_modules/request/package.json | 62 + .../jsdom/node_modules/request/request.js | 1342 + .../jsdom/node_modules/xmlhttprequest/LICENSE | 22 + .../node_modules/xmlhttprequest/README.md | 57 + .../xmlhttprequest/autotest.watchr | 8 + .../xmlhttprequest/example/demo.js | 16 + .../xmlhttprequest/lib/XMLHttpRequest.js | 599 + .../node_modules/xmlhttprequest/package.json | 43 + .../xmlhttprequest/tests/test-constants.js | 13 + .../xmlhttprequest/tests/test-events.js | 50 + .../xmlhttprequest/tests/test-exceptions.js | 62 + .../xmlhttprequest/tests/test-headers.js | 76 + .../xmlhttprequest/tests/test-redirect-302.js | 41 + .../xmlhttprequest/tests/test-redirect-303.js | 41 + .../xmlhttprequest/tests/test-redirect-307.js | 43 + .../tests/test-request-methods.js | 62 + .../tests/test-request-protocols.js | 34 + .../xmlhttprequest/tests/testdata.txt | 1 + node_modules/jsdom/package.json | 212 + output.txt | 1 + package.json | 16 + pixel.js | 45 + test.png | Bin 0 -> 77825 bytes tux.png | Bin 0 -> 1715 bytes 1114 files changed, 155913 insertions(+) create mode 100644 index.html create mode 100644 node_modules/get-pixels/.npmignore create mode 100644 node_modules/get-pixels/LICENSE create mode 100644 node_modules/get-pixels/README.md create mode 100644 node_modules/get-pixels/dom-pixels.js create mode 100644 node_modules/get-pixels/node-pixels.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/LICENSE create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/convert.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/LICENSE create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/cwise.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/LICENSE create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/compiler.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/compile.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/thunk.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/node_modules/uniq/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/node_modules/uniq/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/node_modules/uniq/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/node_modules/uniq/test/test.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/node_modules/uniq/uniq.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/LICENSE create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/index.js create mode 120000 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/.bin/esparse create mode 120000 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/.bin/esvalidate create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/README.md create mode 100755 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esparse.js create mode 100755 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esvalidate.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/esprima.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/compat.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/reflect.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/run.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/runner.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/test.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/test/test.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/uniq.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/test/test.js create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray-pack/test/test.js create mode 100644 node_modules/get-pixels/node_modules/ndarray/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray/LICENSE create mode 100644 node_modules/get-pixels/node_modules/ndarray/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray/ndarray.js create mode 100644 node_modules/get-pixels/node_modules/ndarray/node_modules/iota-array/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ndarray/node_modules/iota-array/LICENSE create mode 100644 node_modules/get-pixels/node_modules/ndarray/node_modules/iota-array/README.md create mode 100644 node_modules/get-pixels/node_modules/ndarray/node_modules/iota-array/iota.js create mode 100644 node_modules/get-pixels/node_modules/ndarray/node_modules/iota-array/package.json create mode 100644 node_modules/get-pixels/node_modules/ndarray/package.json create mode 100644 node_modules/get-pixels/node_modules/pngparse/.npmignore create mode 100644 node_modules/get-pixels/node_modules/pngparse/README.md create mode 100644 node_modules/get-pixels/node_modules/pngparse/accum.png create mode 100644 node_modules/get-pixels/node_modules/pngparse/grayscale.png create mode 100644 node_modules/get-pixels/node_modules/pngparse/index.js create mode 100644 node_modules/get-pixels/node_modules/pngparse/indexed.png create mode 100644 node_modules/get-pixels/node_modules/pngparse/indexedalpha.png create mode 100644 node_modules/get-pixels/node_modules/pngparse/package.json create mode 100644 node_modules/get-pixels/node_modules/pngparse/paeth.png create mode 100644 node_modules/get-pixels/node_modules/pngparse/test.js create mode 100644 node_modules/get-pixels/node_modules/pngparse/truecolor.png create mode 100644 node_modules/get-pixels/node_modules/pngparse/truecoloralpha.png create mode 100644 node_modules/get-pixels/node_modules/ppm/.npmignore create mode 100644 node_modules/get-pixels/node_modules/ppm/README.md create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/.travis.yml create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.APACHE2 create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.MIT create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/index.js create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/package.json create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/readme.markdown create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/test/buffering.js create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/test/end.js create mode 100644 node_modules/get-pixels/node_modules/ppm/node_modules/through/test/index.js create mode 100644 node_modules/get-pixels/node_modules/ppm/package.json create mode 100644 node_modules/get-pixels/node_modules/ppm/ppm.js create mode 100644 node_modules/get-pixels/node_modules/ppm/test/test.js create mode 100644 node_modules/get-pixels/package.json create mode 100644 node_modules/jquery/.bowerrc create mode 100644 node_modules/jquery/.npmignore create mode 100644 node_modules/jquery/AUTHORS.txt create mode 100644 node_modules/jquery/CONTRIBUTING.md create mode 100644 node_modules/jquery/MIT-LICENSE.txt create mode 100644 node_modules/jquery/README.md create mode 100644 node_modules/jquery/bower.json create mode 100644 node_modules/jquery/dist/cdn/jquery-2.1.0.js create mode 100644 node_modules/jquery/dist/cdn/jquery-2.1.0.min.js create mode 100644 node_modules/jquery/dist/cdn/jquery-2.1.0.min.map create mode 100644 node_modules/jquery/dist/jquery.js create mode 100644 node_modules/jquery/dist/jquery.min.js create mode 100644 node_modules/jquery/dist/jquery.min.map create mode 100644 node_modules/jquery/package.json create mode 100644 node_modules/jquery/src/ajax.js create mode 100644 node_modules/jquery/src/ajax/jsonp.js create mode 100644 node_modules/jquery/src/ajax/load.js create mode 100644 node_modules/jquery/src/ajax/parseJSON.js create mode 100644 node_modules/jquery/src/ajax/parseXML.js create mode 100644 node_modules/jquery/src/ajax/script.js create mode 100644 node_modules/jquery/src/ajax/var/nonce.js create mode 100644 node_modules/jquery/src/ajax/var/rquery.js create mode 100644 node_modules/jquery/src/ajax/xhr.js create mode 100644 node_modules/jquery/src/attributes.js create mode 100644 node_modules/jquery/src/attributes/attr.js create mode 100644 node_modules/jquery/src/attributes/classes.js create mode 100644 node_modules/jquery/src/attributes/prop.js create mode 100644 node_modules/jquery/src/attributes/support.js create mode 100644 node_modules/jquery/src/attributes/val.js create mode 100644 node_modules/jquery/src/callbacks.js create mode 100644 node_modules/jquery/src/core.js create mode 100644 node_modules/jquery/src/core/access.js create mode 100644 node_modules/jquery/src/core/init.js create mode 100644 node_modules/jquery/src/core/parseHTML.js create mode 100644 node_modules/jquery/src/core/ready.js create mode 100644 node_modules/jquery/src/core/var/rsingleTag.js create mode 100644 node_modules/jquery/src/css.js create mode 100644 node_modules/jquery/src/css/addGetHookIf.js create mode 100644 node_modules/jquery/src/css/curCSS.js create mode 100644 node_modules/jquery/src/css/defaultDisplay.js create mode 100644 node_modules/jquery/src/css/hiddenVisibleSelectors.js create mode 100644 node_modules/jquery/src/css/support.js create mode 100644 node_modules/jquery/src/css/swap.js create mode 100644 node_modules/jquery/src/css/var/cssExpand.js create mode 100644 node_modules/jquery/src/css/var/getStyles.js create mode 100644 node_modules/jquery/src/css/var/isHidden.js create mode 100644 node_modules/jquery/src/css/var/rmargin.js create mode 100644 node_modules/jquery/src/css/var/rnumnonpx.js create mode 100644 node_modules/jquery/src/data.js create mode 100644 node_modules/jquery/src/data/Data.js create mode 100644 node_modules/jquery/src/data/accepts.js create mode 100644 node_modules/jquery/src/data/var/data_priv.js create mode 100644 node_modules/jquery/src/data/var/data_user.js create mode 100644 node_modules/jquery/src/deferred.js create mode 100644 node_modules/jquery/src/deprecated.js create mode 100644 node_modules/jquery/src/dimensions.js create mode 100644 node_modules/jquery/src/effects.js create mode 100644 node_modules/jquery/src/effects/Tween.js create mode 100644 node_modules/jquery/src/effects/animatedSelector.js create mode 100644 node_modules/jquery/src/event.js create mode 100644 node_modules/jquery/src/event/alias.js create mode 100644 node_modules/jquery/src/event/support.js create mode 100644 node_modules/jquery/src/exports/amd.js create mode 100644 node_modules/jquery/src/exports/global.js create mode 100644 node_modules/jquery/src/intro.js create mode 100644 node_modules/jquery/src/jquery.js create mode 100644 node_modules/jquery/src/manipulation.js create mode 100644 node_modules/jquery/src/manipulation/_evalUrl.js create mode 100644 node_modules/jquery/src/manipulation/support.js create mode 100644 node_modules/jquery/src/manipulation/var/rcheckableType.js create mode 100644 node_modules/jquery/src/offset.js create mode 100644 node_modules/jquery/src/outro.js create mode 100644 node_modules/jquery/src/queue.js create mode 100644 node_modules/jquery/src/queue/delay.js create mode 100644 node_modules/jquery/src/selector-native.js create mode 100644 node_modules/jquery/src/selector-sizzle.js create mode 100644 node_modules/jquery/src/selector.js create mode 100644 node_modules/jquery/src/serialize.js create mode 100644 node_modules/jquery/src/sizzle/dist/sizzle.js create mode 100644 node_modules/jquery/src/sizzle/dist/sizzle.min.js create mode 100644 node_modules/jquery/src/sizzle/dist/sizzle.min.map create mode 100644 node_modules/jquery/src/sizzle/test/data/empty.js create mode 100644 node_modules/jquery/src/sizzle/test/data/mixed_sort.html create mode 100644 node_modules/jquery/src/sizzle/test/data/testinit.js create mode 100644 node_modules/jquery/src/sizzle/test/index.html create mode 100644 node_modules/jquery/src/sizzle/test/jquery.js create mode 100644 node_modules/jquery/src/sizzle/test/unit/extending.js create mode 100644 node_modules/jquery/src/sizzle/test/unit/selector.js create mode 100644 node_modules/jquery/src/sizzle/test/unit/utilities.js create mode 100644 node_modules/jquery/src/traversing.js create mode 100644 node_modules/jquery/src/traversing/findFilter.js create mode 100644 node_modules/jquery/src/traversing/var/rneedsContext.js create mode 100644 node_modules/jquery/src/var/arr.js create mode 100644 node_modules/jquery/src/var/class2type.js create mode 100644 node_modules/jquery/src/var/concat.js create mode 100644 node_modules/jquery/src/var/hasOwn.js create mode 100644 node_modules/jquery/src/var/indexOf.js create mode 100644 node_modules/jquery/src/var/pnum.js create mode 100644 node_modules/jquery/src/var/push.js create mode 100644 node_modules/jquery/src/var/rnotwhite.js create mode 100644 node_modules/jquery/src/var/slice.js create mode 100644 node_modules/jquery/src/var/strundefined.js create mode 100644 node_modules/jquery/src/var/support.js create mode 100644 node_modules/jquery/src/var/toString.js create mode 100644 node_modules/jquery/src/var/trim.js create mode 100644 node_modules/jquery/src/wrap.js create mode 100644 node_modules/jsdom/LICENSE.txt create mode 100644 node_modules/jsdom/README.md create mode 100644 node_modules/jsdom/lib/jsdom.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/documentfeatures.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/domtohtml.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/history.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/htmlencoding.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/htmltodom.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/index.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/location.js create mode 100644 node_modules/jsdom/lib/jsdom/browser/utils.js create mode 100644 node_modules/jsdom/lib/jsdom/level1/core.js create mode 100644 node_modules/jsdom/lib/jsdom/level2/core.js create mode 100644 node_modules/jsdom/lib/jsdom/level2/events.js create mode 100644 node_modules/jsdom/lib/jsdom/level2/html.js create mode 100644 node_modules/jsdom/lib/jsdom/level2/index.js create mode 100644 node_modules/jsdom/lib/jsdom/level2/languages/javascript.js create mode 100644 node_modules/jsdom/lib/jsdom/level2/style.js create mode 100644 node_modules/jsdom/lib/jsdom/level3/core.js create mode 100644 node_modules/jsdom/lib/jsdom/level3/events.js create mode 100644 node_modules/jsdom/lib/jsdom/level3/html.js create mode 100644 node_modules/jsdom/lib/jsdom/level3/index.js create mode 100644 node_modules/jsdom/lib/jsdom/level3/ls.js create mode 100644 node_modules/jsdom/lib/jsdom/level3/xpath.js create mode 100644 node_modules/jsdom/lib/jsdom/selectors/index.js create mode 100644 node_modules/jsdom/lib/jsdom/utils.js create mode 100644 node_modules/jsdom/node_modules/contextify/.npmignore create mode 100644 node_modules/jsdom/node_modules/contextify/LICENSE.txt create mode 100644 node_modules/jsdom/node_modules/contextify/README.md create mode 100644 node_modules/jsdom/node_modules/contextify/binding.gyp create mode 100644 node_modules/jsdom/node_modules/contextify/build/Makefile create mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/.deps/Release/contextify.node.d create mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/.deps/Release/obj.target/contextify.node.d create mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/.deps/Release/obj.target/contextify/src/contextify.o.d create mode 100755 node_modules/jsdom/node_modules/contextify/build/Release/contextify.node create mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/linker.lock create mode 100755 node_modules/jsdom/node_modules/contextify/build/Release/obj.target/contextify.node create mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/obj.target/contextify/src/contextify.o create mode 100644 node_modules/jsdom/node_modules/contextify/build/binding.Makefile create mode 100644 node_modules/jsdom/node_modules/contextify/build/config.gypi create mode 100644 node_modules/jsdom/node_modules/contextify/build/contextify.target.mk create mode 100644 node_modules/jsdom/node_modules/contextify/changelog create mode 100644 node_modules/jsdom/node_modules/contextify/lib/contextify.js create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/bindings/README.md create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/bindings/bindings.js create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/bindings/package.json create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/.dntrc create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/LICENSE create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/README.md create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/build/config.gypi create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/include_dirs.js create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/nan.h create mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/nan/package.json create mode 100644 node_modules/jsdom/node_modules/contextify/package.json create mode 100644 node_modules/jsdom/node_modules/contextify/src/contextify.cc create mode 100644 node_modules/jsdom/node_modules/contextify/test/contextify.js create mode 100644 node_modules/jsdom/node_modules/contextify/wscript create mode 100644 node_modules/jsdom/node_modules/cssom/.gitmodules create mode 100644 node_modules/jsdom/node_modules/cssom/.npmignore create mode 100644 node_modules/jsdom/node_modules/cssom/MIT-LICENSE.txt create mode 100644 node_modules/jsdom/node_modules/cssom/README.mdown create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSDocumentRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSFontFaceRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSImportRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSKeyframeRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSKeyframesRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSMediaRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSStyleDeclaration.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSStyleRule.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSStyleSheet.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSValue.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSValueExpression.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/MatcherList.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/MediaList.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/StyleSheet.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/clone.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/index.js create mode 100644 node_modules/jsdom/node_modules/cssom/lib/parse.js create mode 100644 node_modules/jsdom/node_modules/cssom/package.json create mode 100644 node_modules/jsdom/node_modules/cssstyle/.npmignore create mode 100644 node_modules/jsdom/node_modules/cssstyle/MIT-LICENSE.txt create mode 100644 node_modules/jsdom/node_modules/cssstyle/README.md create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/CSSStyleDeclaration.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/css3-properties/borderImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/css3-properties/borderImageOutset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/css3-properties/borderImageRepeat.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/css3-properties/borderImageSlice.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/css3-properties/borderImageSource.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/css3-properties/borderImageWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/parsers.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/alignmentBaseline.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/azimuth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/background.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundAttachment.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundClip.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundOrigin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPosition.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeat.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundSize.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/baselineShift.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/border.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottom.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomLeftRadius.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomRightRadius.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderCollapse.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageOutset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageRepeat.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSlice.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSource.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeft.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRadius.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderSpacing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTop.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopLeftRadius.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopRightRadius.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/bottom.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/boxShadow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/boxSizing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/captionSide.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/clear.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/clip.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/color.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolation.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolationFilters.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorProfile.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorRendering.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/content.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/counterIncrement.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/counterReset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cssFloat.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cue.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cueAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cueBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cursor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/direction.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/display.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/dominantBaseline.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/elevation.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/emptyCells.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/enableBackground.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fill.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fillOpacity.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fillRule.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/filter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/floodColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/floodOpacity.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/font.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontFamily.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSize.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSizeAdjust.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStretch.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontVariant.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontWeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationHorizontal.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationVertical.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/height.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/imageRendering.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/kerning.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/left.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/letterSpacing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/lightingColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/lineHeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStylePosition.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleType.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/margin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginBottom.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginLeft.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginRight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginTop.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marker.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerEnd.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerMid.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerOffset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerStart.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marks.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/mask.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/maxHeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/maxWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/minHeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/minWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/opacity.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/orphans.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outline.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineOffset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/overflow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/padding.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingBottom.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingLeft.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingRight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingTop.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/page.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakInside.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pause.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pitch.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pitchRange.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/playDuring.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pointerEvents.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/position.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/quotes.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/resize.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/richness.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/right.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/shapeRendering.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/size.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speak.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speakHeader.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speakNumeral.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speakPunctuation.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speechRate.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/src.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stopColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stopOpacity.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stress.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stroke.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDasharray.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDashoffset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinecap.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinejoin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeMiterlimit.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeOpacity.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/tableLayout.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textAlign.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textAnchor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textDecoration.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textIndent.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThrough.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverflow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverline.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textRendering.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textShadow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textTransform.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderline.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/top.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeBidi.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeRange.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/vectorEffect.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/verticalAlign.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/visibility.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/voiceFamily.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/volume.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimation.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDelay.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDirection.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDuration.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationFillMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationIterationCount.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationName.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationPlayState.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationTimingFunction.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAppearance.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAspectRatio.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackfaceVisibility.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundClip.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundComposite.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundOrigin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundSize.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEnd.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderFit.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderHorizontalSpacing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderRadius.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStart.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderVerticalSpacing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxAlign.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxDirection.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlex.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlexGroup.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxLines.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrdinalGroup.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrient.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxPack.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxReflect.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxShadow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColorCorrection.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnAxis.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakInside.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnCount.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnGap.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRule.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnSpan.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumns.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFilter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexAlign.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexDirection.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexFlow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexItemAlign.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexLinePack.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexOrder.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexPack.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexWrap.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowFrom.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowInto.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontFeatureSettings.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontKerning.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSizeDelta.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSmoothing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontVariantLigatures.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHighlight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateCharacter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitLines.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphens.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineAlign.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBoxContain.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBreak.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineClamp.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineGrid.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineSnap.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLocale.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalHeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfterCollapse.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBeforeCollapse.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBottomCollapse.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginCollapse.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginEnd.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginStart.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginTopCollapse.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarquee.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeDirection.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeIncrement.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeRepetition.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeSpeed.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMask.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskAttachment.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageOutset.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageRepeat.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSlice.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSource.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskClip.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskComposite.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskImage.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskOrigin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPosition.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeat.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskSize.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMatchNearestMailBlockquoteColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalHeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalHeight.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitNbspMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitOverflowScrolling.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingEnd.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingStart.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspective.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOrigin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPrintColorAdjust.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakAfter.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakBefore.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakInside.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionOverflow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRtlOrdering.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitSvgShadow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextCombine.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextDecorationsInEffect.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasis.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisPosition.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextFillColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextOrientation.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSecurity.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSizeAdjust.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStroke.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeWidth.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransform.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOrigin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginX.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginY.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginZ.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformStyle.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransition.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDelay.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDuration.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionProperty.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionTimingFunction.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserDrag.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserModify.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserSelect.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrap.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapFlow.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapMargin.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapPadding.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeInside.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeOutside.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapThrough.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWritingMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/whiteSpace.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/widows.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/width.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/wordBreak.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/wordSpacing.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/wordWrap.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/writingMode.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/zIndex.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/zoom.js create mode 100644 node_modules/jsdom/node_modules/cssstyle/package.json create mode 100644 node_modules/jsdom/node_modules/cssstyle/tests/tests.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/.gitattributes create mode 100644 node_modules/jsdom/node_modules/htmlparser2/.npmignore create mode 100644 node_modules/jsdom/node_modules/htmlparser2/.travis.yml create mode 100644 node_modules/jsdom/node_modules/htmlparser2/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/README.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/CollectingHandler.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/FeedHandler.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/Parser.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/ProxyHandler.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/Stream.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/Tokenizer.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/WritableStream.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/entities/decode.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/entities/entities.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/entities/legacy.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/entities/xml.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/lib/index.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/index.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domelementtype/readme.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/.travis.yml create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/index.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/readme.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/01-basic.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/02-single_tag_1.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/03-single_tag_2.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/04-unescaped_in_script.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/05-tags_in_comment.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/06-comment_in_script.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/07-unescaped_in_style.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/08-extra_spaces_in_tag.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/09-unquoted_attrib.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/10-singular_attribute.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/11-text_outside_tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/12-text_only.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/13-comment_in_text.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/14-comment_in_text_in_script.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/15-non-verbose.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/16-normalize_whitespace.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/17-xml_namespace.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/18-enforce_empty_tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/19-ignore_empty_tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/20-template_script_tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/21-conditional_comments.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/22-lowercase_tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/cases/23-dom-lvl1.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domhandler/test/tests.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/index.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/lib/helpers.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/lib/legacy.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/lib/manipulation.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/lib/querying.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/lib/stringify.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/lib/traversal.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/readme.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/test/fixture.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/test/tests/helpers.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/test/tests/legacy.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/domutils/test/utils.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/.npmignore create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/README.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/duplex.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/float.patch create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/README.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/float.patch create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/lib/util.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/util.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/debuglog/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/debuglog/README.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/debuglog/debuglog.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/debuglog/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/readable.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/transform.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/node_modules/readable-stream/writable.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/package.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/01-events.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/02-stream.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/03-feed.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Documents/Atom_Example.xml create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Documents/Attributes.html create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Documents/Basic.html create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Documents/RDF_Example.xml create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Documents/RSS_Example.xml create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/01-simple.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/02-template.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/03-lowercase_tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/04-cdata.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/05-cdata-special.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/06-leading-lt.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/07-self-closing.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/08-implicit-close-tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/09-attributes.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/10-crazy-attrib.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/11-script_in_script.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/12-long-comment-end.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/13-long-cdata-end.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/14-implicit-open-tags.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/15-lt-whitespace.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/16-double_attribs.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/17-numeric_entities.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/18-legacy_entities.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/19-named_entities.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/20-xml_entities.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/21-entity_in_attribute.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/22-double_brackets.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Events/23-legacy_entity_fail.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Feeds/01-rss.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Feeds/02-atom.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Feeds/03-rdf.js create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Stream/01-basic.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Stream/02-RSS.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Stream/03-Atom.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Stream/04-RDF.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/Stream/05-Attributes.json create mode 100644 node_modules/jsdom/node_modules/htmlparser2/test/test-helper.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/.npmignore create mode 100644 node_modules/jsdom/node_modules/nwmatcher/LICENSE create mode 100644 node_modules/jsdom/node_modules/nwmatcher/README create mode 100644 node_modules/jsdom/node_modules/nwmatcher/README.md create mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/lint.log create mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/ender/bridge.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/prototype/selector_engine.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/package.json create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-noqsa.js create mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js create mode 100644 node_modules/jsdom/node_modules/request/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/.travis.yml create mode 100644 node_modules/jsdom/node_modules/request/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/README.md create mode 100644 node_modules/jsdom/node_modules/request/dns-request.js create mode 100755 node_modules/jsdom/node_modules/request/index.js create mode 100644 node_modules/jsdom/node_modules/request/lib/cookies.js create mode 100644 node_modules/jsdom/node_modules/request/lib/copy.js create mode 100644 node_modules/jsdom/node_modules/request/lib/debug.js create mode 100644 node_modules/jsdom/node_modules/request/lib/getSafe.js create mode 100644 node_modules/jsdom/node_modules/request/lib/optional.js create mode 120000 node_modules/jsdom/node_modules/request/node_modules/.bin/uuid create mode 100644 node_modules/jsdom/node_modules/request/node_modules/aws-sign2/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/aws-sign2/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/aws-sign2/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/aws-sign2/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/forever-agent/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/forever-agent/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/forever-agent/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/forever-agent/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/License create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/Readme.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/lib/form_data.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/component.json create mode 100755 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/License create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-empty-string.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-is-stream-like.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/.npmignore create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/.travis.yml create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/LICENSE create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/Makefile create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/README.md create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/example/usage.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/images/hawk.png create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/images/logo.png create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/lib/browser.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/lib/client.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/lib/crypto.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/lib/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/lib/server.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/lib/utils.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/Makefile create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/README.md create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/package.json create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/Makefile create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/Makefile create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/README.md create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/README.md create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/package.json create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/package.json create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/browser.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/client.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/crypto.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/index.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/message.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/readme.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/server.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/uri.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/hawk/test/utils.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/.dir-locals.el create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/http_signing.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/lib/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/lib/parser.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/lib/signer.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/lib/util.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/lib/verify.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/errors.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/reader.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/types.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/writer.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/reader.test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/writer.test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/CHANGELOG create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/README create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/README.old create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/ctf.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/ctio.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/ctype.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/man/man3ctype/ctio.3ctype create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json create mode 100755 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsl.conf create mode 100755 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsstyle create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/http-signature/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/json-stringify-safe/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/json-stringify-safe/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/json-stringify-safe/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/json-stringify-safe/stringify.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/json-stringify-safe/test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/mime.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/types/mime.types create mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/types/node.types create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/LICENSE.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/benchmark/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu create mode 100755 node_modules/jsdom/node_modules/request/node_modules/node-uuid/benchmark/bench.sh create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js create mode 100755 node_modules/jsdom/node_modules/request/node_modules/node-uuid/bin/uuid create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/component.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/test/compare_v1.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/test/test.html create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/test/test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/node-uuid/uuid.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/oauth-sign/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/oauth-sign/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/oauth-sign/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/oauth-sign/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/oauth-sign/test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/qs/.gitmodules create mode 100644 node_modules/jsdom/node_modules/request/node_modules/qs/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/qs/Readme.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/qs/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/qs/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/.jshintrc create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/.npmignore create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/.travis.yml create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/lib/cookie.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/lib/memstore.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/lib/store.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-GPL.txt create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.min.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/package.json create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/public-suffix.txt create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tough-cookie/test.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tunnel-agent/LICENSE create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tunnel-agent/README.md create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tunnel-agent/index.js create mode 100644 node_modules/jsdom/node_modules/request/node_modules/tunnel-agent/package.json create mode 100755 node_modules/jsdom/node_modules/request/package.json create mode 100644 node_modules/jsdom/node_modules/request/request.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/LICENSE create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/README.md create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/autotest.watchr create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/example/demo.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/lib/XMLHttpRequest.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/package.json create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-constants.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-events.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-exceptions.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-headers.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-302.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-303.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-redirect-307.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-methods.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/test-request-protocols.js create mode 100644 node_modules/jsdom/node_modules/xmlhttprequest/tests/testdata.txt create mode 100644 node_modules/jsdom/package.json create mode 100644 output.txt create mode 100644 package.json create mode 100644 pixel.js create mode 100644 test.png create mode 100644 tux.png diff --git a/index.html b/index.html new file mode 100644 index 0000000..00944c6 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/node_modules/get-pixels/.npmignore b/node_modules/get-pixels/.npmignore new file mode 100644 index 0000000..038e024 --- /dev/null +++ b/node_modules/get-pixels/.npmignore @@ -0,0 +1,16 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +npm-debug.log +node_modules/* +test/* \ No newline at end of file diff --git a/node_modules/get-pixels/LICENSE b/node_modules/get-pixels/LICENSE new file mode 100644 index 0000000..8ce206a --- /dev/null +++ b/node_modules/get-pixels/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2013 Mikola Lysenko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/get-pixels/README.md b/node_modules/get-pixels/README.md new file mode 100644 index 0000000..fe4ecb6 --- /dev/null +++ b/node_modules/get-pixels/README.md @@ -0,0 +1,37 @@ +get-pixels +========== +Given a URL/path, grab all the pixels in an image and return the result as an [ndarray](https://github.com/mikolalysenko/ndarray). Works both in browserify and in node.js. + +**Note** On the node side, currently only supports PNG and PPM. Patches welcome!!! + +Example +======= + +```javascript +var getPixels = require("get-pixels") + +getPixels("lena.png", function(err, pixels) { + if(err) { + console.log("Bad image path") + return + } + console.log("got pixels", pixels.shape) +}) +``` + +Install +======= + + npm install get-pixels + +### `require("get-pixels")(url, cb(err, pixels))` +Reads all the pixels from url into an ndarray. + +* `url` is the path to the file +* `cb(err, pixels)` is a callback which gets triggered once the image is loaded. + +**Returns** An ndarray of pixels in raster order having shape equal to `[rows, columns, channels]`. + +Credits +======= +(c) 2013 Mikola Lysenko. MIT License \ No newline at end of file diff --git a/node_modules/get-pixels/dom-pixels.js b/node_modules/get-pixels/dom-pixels.js new file mode 100644 index 0000000..91bb880 --- /dev/null +++ b/node_modules/get-pixels/dom-pixels.js @@ -0,0 +1,20 @@ +"use strict" + +var ndarray = require("ndarray") + +module.exports = function getPixels(url, cb) { + var img = new Image() + img.onload = function() { + var canvas = document.createElement("canvas") + canvas.width = img.width + canvas.height = img.height + var context = canvas.getContext("2d") + context.drawImage(img, 0, 0) + var pixels = context.getImageData(0, 0, img.width, img.height) + cb(null, ndarray(new Uint8Array(pixels.data), [img.height, img.width, 4], [4*img.width, 4, 1], 0)) + } + img.onerror = function(err) { + cb(err) + } + img.src = url +} diff --git a/node_modules/get-pixels/node-pixels.js b/node_modules/get-pixels/node-pixels.js new file mode 100644 index 0000000..805c0ea --- /dev/null +++ b/node_modules/get-pixels/node-pixels.js @@ -0,0 +1,55 @@ +"use strict" + +var ndarray = require("ndarray") +var path = require("path") +var pngparse = require("pngparse") +var ppm = require("ppm") +var pack = require("ndarray-pack") +var fs = require("fs") + +function handlePNG(url, cb) { + fs.readFile(url, function(err, data) { + if(err) { + cb(err) + return + } + pngparse.parse(data, function(err, img_data) { + if(err) { + cb(err) + return + } + cb(undefined, ndarray(new Uint8Array(img_data.data), + [img_data.height|0, img_data.width|0, 4], + [4*img_data.width|0, 4, 1], + 0)) + }) + }) +} + +function handlePPM(url, cb) { + ppm.parse(fs.createReadStream(url), function(err, pixels) { + if(err) { + cb(err) + return + } + cb(undefined, pack(pixels, "uint8")) + }) +} + +module.exports = function getPixels(url, cb) { + var ext = path.extname(url) + switch(ext.toUpperCase()) { + case ".PNG": + handlePNG(url, cb) + break + + case ".PPM": + handlePPM(url, cb) + break + + default: + process.nextTick(function() { + cb(new Error("Unsupported file type: " + ext)) + }) + } +} diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/.npmignore b/node_modules/get-pixels/node_modules/ndarray-pack/.npmignore new file mode 100644 index 0000000..0d1b0b0 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/.npmignore @@ -0,0 +1,15 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +npm-debug.log +node_modules/* \ No newline at end of file diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/LICENSE b/node_modules/get-pixels/node_modules/ndarray-pack/LICENSE new file mode 100644 index 0000000..8ce206a --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/LICENSE @@ -0,0 +1,22 @@ + +The MIT License (MIT) + +Copyright (c) 2013 Mikola Lysenko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/README.md b/node_modules/get-pixels/node_modules/ndarray-pack/README.md new file mode 100644 index 0000000..04ff93b --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/README.md @@ -0,0 +1,30 @@ +ndarray-pack +============ +Converts an array-of-arrays (ie [numeric.js array](http://www.numericjs.com/)) into a packed [ndarray](https://github.com/mikolalysenko/ndarray). + +Example +======= +```javascript +//First create a numeric.js style array: +var x = [[1, 0, 1], + [0, 1, 1], + [0, 0, 1], + [1, 0, 0]] + +var y = require("ndarray-pack")(x) +``` + +Install +======= + + npm install pack + +### `require("ndarray-pack")(nested_array)` +Converts the nested array into a packed ndarray. + +* `nested_array` is an array-of-arrays (ie a numeric.js array) + +**Returns** A packed ndarray representation of the nested arrays. + +# Credits +(c) 2013 Mikola Lysenko. MIT License \ No newline at end of file diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/convert.js b/node_modules/get-pixels/node_modules/ndarray-pack/convert.js new file mode 100644 index 0000000..c912dd7 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/convert.js @@ -0,0 +1,30 @@ +"use strict" + +var ndarray = require("ndarray") +var cwise = require("cwise") + +var do_convert = cwise({ + args: ["array", "scalar", "index"], + body: function(out, a, idx) { + var v = a + for(var i=0; i0) { + throw new Error("cwise: pre() block may not reference array args") + } + if(i < proc.post.args.length && proc.post.args[i].count>0) { + throw new Error("cwise: post() block may not reference array args") + } + break + case "scalar": + proc.scalarArgs.push(i) + proc.shimArgs.push("scalar" + i) + break + case "index": + proc.indexArgs.push(i) + if(i < proc.pre.args.length && proc.pre.args[i].count > 0) { + throw new Error("cwise: pre() block may not reference array index") + } + if(i < proc.body.args.length && proc.body.args[i].lvalue) { + throw new Error("cwise: body() block may not write to array index") + } + if(i < proc.post.args.length && proc.post.args[i].count > 0) { + throw new Error("cwise: post() block may not reference array index") + } + break + case "shape": + proc.shapeArgs.push(i) + if(i < proc.pre.args.length && proc.pre.args[i].lvalue) { + throw new Error("cwise: pre() block may not write to array shape") + } + if(i < proc.body.args.length && proc.body.args[i].lvalue) { + throw new Error("cwise: body() block may not write to array shape") + } + if(i < proc.post.args.length && proc.post.args[i].lvalue) { + throw new Error("cwise: post() block may not write to array shape") + } + break + default: + throw new Error("cwise: Unknown argument type " + proc_args[i]) + } + } + + //Make sure at least one array argument was specified + if(proc.arrayArgs.length <= 0) { + throw new Error("cwise: No array arguments specified") + } + + //Make sure arguments are correct + if(proc.pre.args.length > proc_args.length) { + throw new Error("cwise: Too many arguments in pre() block") + } + if(proc.body.args.length > proc_args.length) { + throw new Error("cwise: Too many arguments in body() block") + } + if(proc.post.args.length > proc_args.length) { + throw new Error("cwise: Too many arguments in post() block") + } + + //Check debug flag + proc.debug = !!user_args.printCode || !!user_args.debug + + //Retrieve name + proc.funcName = user_args.funcName || "cwise" + + //Read in block size + proc.blockSize = user_args.blockSize || 64 + + return createThunk(proc) +} + +module.exports = compileCwise diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/compile.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/compile.js new file mode 100644 index 0000000..0165966 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/compile.js @@ -0,0 +1,256 @@ +"use strict" + +var uniq = require("uniq") + +function innerFill(order, proc, body) { + var dimension = order.length + , nargs = proc.arrayArgs.length + , has_index = proc.indexArgs.length>0 + , code = [] + , vars = [] + , idx=0, pidx=0, i, j + for(i=0; i=0; --i) { + idx = order[i] + code.push(["for(i",i,"=0;i",i," 0) { + code.push(["index[",pidx,"]-=s",pidx].join("")) + } + code.push(["++index[",idx,"]"].join("")) + } + code.push("}") + } + return code.join("\n") +} + +function outerFill(matched, order, proc, body) { + var dimension = order.length + , nargs = proc.arrayArgs.length + , blockSize = proc.blockSize + , has_index = proc.indexArgs.length > 0 + , code = [] + for(var i=0; i0;){"].join("")) + code.push(["if(j",i,"<",blockSize,"){"].join("")) + code.push(["s",order[i],"=j",i].join("")) + code.push(["j",i,"=0"].join("")) + code.push(["}else{s",order[i],"=",blockSize].join("")) + code.push(["j",i,"-=",blockSize,"}"].join("")) + if(has_index) { + code.push(["index[",order[i],"]=j",i].join("")) + } + } + for(var i=0; i 0) { + allEqual = allEqual && summary[i] === summary[i-1] + } + } + if(allEqual) { + return summary[0] + } + return summary.join("") +} + +//Generates a cwise operator +function generateCWiseOp(proc, typesig) { + + //Compute dimension + var dimension = typesig[1].length|0 + var orders = new Array(proc.arrayArgs.length) + var dtypes = new Array(proc.arrayArgs.length) + + //First create arguments for procedure + var arglist = ["SS"] + var code = ["'use strict'"] + var vars = [] + + for(var j=0; j 0) { + vars.push("shape=SS.slice(0)") + } + if(proc.indexArgs.length > 0) { + var zeros = new Array(dimension) + for(var i=0; i 3) { + code.push(processBlock(proc.pre, proc, dtypes)) + } + + //Process body + var body = processBlock(proc.body, proc, dtypes) + var matched = countMatches(orders) + if(matched < dimension) { + code.push(outerFill(matched, orders[0], proc, body)) + } else { + code.push(innerFill(orders[0], proc, body)) + } + + //Inline epilog + if(proc.post.body.length > 3) { + code.push(processBlock(proc.post, proc, dtypes)) + } + + if(proc.debug) { + console.log("Generated cwise routine for ", typesig, ":\n\n", code.join("\n")) + } + + var loopName = [(proc.funcName||"unnamed"), "_cwise_loop_", orders[0].join("s"),"m",matched,typeSummary(dtypes)].join("") + var f = new Function(["function ",loopName,"(", arglist.join(","),"){", code.join("\n"),"} return ", loopName].join("")) + return f() +} +module.exports = generateCWiseOp \ No newline at end of file diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/thunk.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/thunk.js new file mode 100644 index 0000000..07bf08a --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-compiler/lib/thunk.js @@ -0,0 +1,47 @@ +"use strict" + +var compile = require("./compile.js") + +function createThunk(proc) { + var code = ["'use strict'", "var CACHED={}"] + var vars = [] + var thunkName = proc.funcName + "_cwise_thunk" + + //Build thunk + code.push(["return function ", thunkName, "(", proc.shimArgs.join(","), "){"].join("")) + var typesig = [] + var string_typesig = [] + var proc_args = [["array",proc.arrayArgs[0],".shape"].join("")] + for(var i=0; i= 0) { + var carg = compiledArgs[argNo] + var usage = getUsage(node) + if(usage & LVALUE) { + carg.lvalue = true + } + if(usage & RVALUE) { + carg.rvalue = true + } + ++carg.count + rewrite(node, carg.name) + } else if(isGlobal(name)) { + //Don't rewrite globals + } else { + rewrite(node, createLocal(name)) + } + } else if(node.type === "Literal") { + if(typeof node.value === "string") { + rewrite(node, escapeString(node.value)) + } + } else if(node.type === "WithStatement") { + throw new Error("cwise-parser: with() statements not allowed") + } else { + //Visit all children + var keys = Object.keys(node) + for(var i=0, n=keys.length; iJavaScript)). +Esprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat), +with the help of [many contributors](https://github.com/ariya/esprima/contributors). + +Esprima runs on web browsers (IE 6+, Firefox 1+, Safari 3+, Chrome 1+, Konqueror 4.6+, Opera 8+) as well as +[Node.js](http://nodejs.org). + +### Features + +- Full support for [ECMAScript 5.1](http://www.ecma-international.org/publications/standards/Ecma-262.htm)(ECMA-262) +- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla +[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API) +- Heavily tested (> 550 [unit tests](http://esprima.org/test/) with solid 100% statement coverage) +- Optional tracking of syntax node location (index-based and line-column) +- Experimental support for ES6/Harmony (module, class, destructuring, ...) + +Esprima is blazing fast (see the [benchmark suite](http://esprima.org/test/benchmarks.html)). +It is up to 3x faster than UglifyJS v1 and it is still [competitive](http://esprima.org/test/compare.html) +with the new generation of fast parsers. + +### Applications + +Esprima serves as the basis for many popular JavaScript development tools: + +- Code coverage analysis: [node-cover](https://github.com/itay/node-cover), [Istanbul](https://github.com/yahoo/Istanbul) +- Documentation tool: [JFDoc](https://github.com/thejohnfreeman/jfdoc), [JSDuck](https://github.com/senchalabs/jsduck) +- Language extension: [LLJS](http://mbebenita.github.com/LLJS/) (low-level JS), +[Sweet.js](http://sweetjs.org/) (macro) +- ES6/Harmony transpiler: [Six](https://github.com/matthewrobb/six), [Harmonizr](https://github.com/jdiamond/harmonizr) +- Eclipse Orion smart editing ([outline view](https://github.com/aclement/esprima-outline), [content assist](http://contraptionsforprogramming.blogspot.com/2012/02/better-javascript-content-assist-in.html)) +- Source code modification: [Esmorph](https://github.com/ariya/esmorph), [Code Painter](https://github.com/fawek/codepainter), +- Source transformation: [node-falafel](https://github.com/substack/node-falafel), [Esmangle](https://github.com/Constellation/esmangle), [escodegen](https://github.com/Constellation/escodegen) + +### Questions? +- [Documentation](http://esprima.org/doc) +- [Issue tracker](http://issues.esprima.org): [known problems](http://code.google.com/p/esprima/issues/list?q=Defect) +and [future plans](http://code.google.com/p/esprima/issues/list?q=Enhancement) +- [Mailing list](http://groups.google.com/group/esprima) +- [Contribution guide](http://esprima.org/doc/index.html#contribution) + +Follow [@Esprima](http://twitter.com/Esprima) on Twitter to get the +development updates. +Feedback and contribution are welcomed! + +### License + +Copyright (C) 2012, 2011 [Ariya Hidayat](http://ariya.ofilabs.com/about) + and other contributors. + +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 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 BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esparse.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esparse.js new file mode 100755 index 0000000..3e7bb81 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esparse.js @@ -0,0 +1,117 @@ +#!/usr/bin/env node +/* + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2011 Ariya Hidayat + + 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 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 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. +*/ + +/*jslint sloppy:true node:true rhino:true */ + +var fs, esprima, fname, content, options, syntax; + +if (typeof require === 'function') { + fs = require('fs'); + esprima = require('esprima'); +} else if (typeof load === 'function') { + try { + load('esprima.js'); + } catch (e) { + load('../esprima.js'); + } +} + +// Shims to Node.js objects when running under Rhino. +if (typeof console === 'undefined' && typeof process === 'undefined') { + console = { log: print }; + fs = { readFileSync: readFile }; + process = { argv: arguments, exit: quit }; + process.argv.unshift('esparse.js'); + process.argv.unshift('rhino'); +} + +function showUsage() { + console.log('Usage:'); + console.log(' esparse [options] file.js'); + console.log(); + console.log('Available options:'); + console.log(); + console.log(' --comment Gather all line and block comments in an array'); + console.log(' --loc Include line-column location info for each syntax node'); + console.log(' --range Include index-based range for each syntax node'); + console.log(' --raw Display the raw value of literals'); + console.log(' --tokens List all tokens in an array'); + console.log(' --tolerant Tolerate errors on a best-effort basis (experimental)'); + console.log(' -v, --version Shows program version'); + console.log(); + process.exit(1); +} + +if (process.argv.length <= 2) { + showUsage(); +} + +options = {}; + +process.argv.splice(2).forEach(function (entry) { + + if (entry === '-h' || entry === '--help') { + showUsage(); + } else if (entry === '-v' || entry === '--version') { + console.log('ECMAScript Parser (using Esprima version', esprima.version, ')'); + console.log(); + process.exit(0); + } else if (entry === '--comment') { + options.comment = true; + } else if (entry === '--loc') { + options.loc = true; + } else if (entry === '--range') { + options.range = true; + } else if (entry === '--raw') { + options.raw = true; + } else if (entry === '--tokens') { + options.tokens = true; + } else if (entry === '--tolerant') { + options.tolerant = true; + } else if (entry.slice(0, 2) === '--') { + console.log('Error: unknown option ' + entry + '.'); + process.exit(1); + } else if (typeof fname === 'string') { + console.log('Error: more than one input file.'); + process.exit(1); + } else { + fname = entry; + } +}); + +if (typeof fname !== 'string') { + console.log('Error: no input file.'); + process.exit(1); +} + +try { + content = fs.readFileSync(fname, 'utf-8'); + syntax = esprima.parse(content, options); + console.log(JSON.stringify(syntax, null, 4)); +} catch (e) { + console.log('Error: ' + e.message); + process.exit(1); +} diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esvalidate.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esvalidate.js new file mode 100755 index 0000000..e0af3f7 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/bin/esvalidate.js @@ -0,0 +1,177 @@ +#!/usr/bin/env node +/* + Copyright (C) 2012 Ariya Hidayat + + 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 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 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. +*/ + +/*jslint sloppy:true plusplus:true node:true rhino:true */ + +var fs, esprima, options, fnames, count; + +if (typeof require === 'function') { + fs = require('fs'); + esprima = require('esprima'); +} else if (typeof load === 'function') { + try { + load('esprima.js'); + } catch (e) { + load('../esprima.js'); + } +} + +// Shims to Node.js objects when running under Rhino. +if (typeof console === 'undefined' && typeof process === 'undefined') { + console = { log: print }; + fs = { readFileSync: readFile }; + process = { argv: arguments, exit: quit }; + process.argv.unshift('esvalidate.js'); + process.argv.unshift('rhino'); +} + +function showUsage() { + console.log('Usage:'); + console.log(' esvalidate [options] file.js'); + console.log(); + console.log('Available options:'); + console.log(); + console.log(' --format=type Set the report format, plain (default) or junit'); + console.log(' -v, --version Print program version'); + console.log(); + process.exit(1); +} + +if (process.argv.length <= 2) { + showUsage(); +} + +options = { + format: 'plain' +}; + +fnames = []; + +process.argv.splice(2).forEach(function (entry) { + + if (entry === '-h' || entry === '--help') { + showUsage(); + } else if (entry === '-v' || entry === '--version') { + console.log('ECMAScript Validator (using Esprima version', esprima.version, ')'); + console.log(); + process.exit(0); + } else if (entry.slice(0, 9) === '--format=') { + options.format = entry.slice(9); + if (options.format !== 'plain' && options.format !== 'junit') { + console.log('Error: unknown report format ' + options.format + '.'); + process.exit(1); + } + } else if (entry.slice(0, 2) === '--') { + console.log('Error: unknown option ' + entry + '.'); + process.exit(1); + } else { + fnames.push(entry); + } +}); + +if (fnames.length === 0) { + console.log('Error: no input file.'); + process.exit(1); +} + +if (options.format === 'junit') { + console.log(''); + console.log(''); +} + +count = 0; +fnames.forEach(function (fname) { + var content, timestamp, syntax, name; + try { + content = fs.readFileSync(fname, 'utf-8'); + + if (content[0] === '#' && content[1] === '!') { + content = '//' + content.substr(2, content.length); + } + + timestamp = Date.now(); + syntax = esprima.parse(content, { tolerant: true }); + + if (options.format === 'junit') { + + name = fname; + if (name.lastIndexOf('/') >= 0) { + name = name.slice(name.lastIndexOf('/') + 1); + } + + console.log(''); + + syntax.errors.forEach(function (error) { + var msg = error.message; + msg = msg.replace(/^Line\ [0-9]*\:\ /, ''); + console.log(' '); + console.log(' ' + + error.message + '(' + name + ':' + error.lineNumber + ')' + + ''); + console.log(' '); + }); + + console.log(''); + + } else if (options.format === 'plain') { + + syntax.errors.forEach(function (error) { + var msg = error.message; + msg = msg.replace(/^Line\ [0-9]*\:\ /, ''); + msg = fname + ':' + error.lineNumber + ': ' + msg; + console.log(msg); + ++count; + }); + + } + } catch (e) { + ++count; + if (options.format === 'junit') { + console.log(''); + console.log(' '); + console.log(' ' + + e.message + '(' + fname + ((e.lineNumber) ? ':' + e.lineNumber : '') + + ')'); + console.log(' '); + console.log(''); + } else { + console.log('Error: ' + e.message); + } + } +}); + +if (options.format === 'junit') { + console.log(''); +} + +if (count > 0) { + process.exit(1); +} diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/esprima.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/esprima.js new file mode 100644 index 0000000..f1320da --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/esprima.js @@ -0,0 +1,3908 @@ +/* + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2012 Mathias Bynens + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2012 Kris Kowal + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Arpad Borsos + Copyright (C) 2011 Ariya Hidayat + + 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 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 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. +*/ + +/*jslint bitwise:true plusplus:true */ +/*global esprima:true, define:true, exports:true, window: true, +throwError: true, createLiteral: true, generateStatement: true, +parseAssignmentExpression: true, parseBlock: true, parseExpression: true, +parseFunctionDeclaration: true, parseFunctionExpression: true, +parseFunctionSourceElements: true, parseVariableIdentifier: true, +parseLeftHandSideExpression: true, +parseStatement: true, parseSourceElement: true */ + +(function (root, factory) { + 'use strict'; + + // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, + // Rhino, and plain browser loading. + if (typeof define === 'function' && define.amd) { + define(['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory((root.esprima = {})); + } +}(this, function (exports) { + 'use strict'; + + var Token, + TokenName, + Syntax, + PropertyKind, + Messages, + Regex, + source, + strict, + index, + lineNumber, + lineStart, + length, + buffer, + state, + extra; + + Token = { + BooleanLiteral: 1, + EOF: 2, + Identifier: 3, + Keyword: 4, + NullLiteral: 5, + NumericLiteral: 6, + Punctuator: 7, + StringLiteral: 8 + }; + + TokenName = {}; + TokenName[Token.BooleanLiteral] = 'Boolean'; + TokenName[Token.EOF] = ''; + TokenName[Token.Identifier] = 'Identifier'; + TokenName[Token.Keyword] = 'Keyword'; + TokenName[Token.NullLiteral] = 'Null'; + TokenName[Token.NumericLiteral] = 'Numeric'; + TokenName[Token.Punctuator] = 'Punctuator'; + TokenName[Token.StringLiteral] = 'String'; + + Syntax = { + AssignmentExpression: 'AssignmentExpression', + ArrayExpression: 'ArrayExpression', + BlockStatement: 'BlockStatement', + BinaryExpression: 'BinaryExpression', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ConditionalExpression: 'ConditionalExpression', + ContinueStatement: 'ContinueStatement', + DoWhileStatement: 'DoWhileStatement', + DebuggerStatement: 'DebuggerStatement', + EmptyStatement: 'EmptyStatement', + ExpressionStatement: 'ExpressionStatement', + ForStatement: 'ForStatement', + ForInStatement: 'ForInStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + Literal: 'Literal', + LabeledStatement: 'LabeledStatement', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SwitchStatement: 'SwitchStatement', + SwitchCase: 'SwitchCase', + ThisExpression: 'ThisExpression', + ThrowStatement: 'ThrowStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement', + WithStatement: 'WithStatement' + }; + + PropertyKind = { + Data: 1, + Get: 2, + Set: 4 + }; + + // Error messages should be identical to V8. + Messages = { + UnexpectedToken: 'Unexpected token %0', + UnexpectedNumber: 'Unexpected number', + UnexpectedString: 'Unexpected string', + UnexpectedIdentifier: 'Unexpected identifier', + UnexpectedReserved: 'Unexpected reserved word', + UnexpectedEOS: 'Unexpected end of input', + NewlineAfterThrow: 'Illegal newline after throw', + InvalidRegExp: 'Invalid regular expression', + UnterminatedRegExp: 'Invalid regular expression: missing /', + InvalidLHSInAssignment: 'Invalid left-hand side in assignment', + InvalidLHSInForIn: 'Invalid left-hand side in for-in', + MultipleDefaultsInSwitch: 'More than one default clause in switch statement', + NoCatchOrFinally: 'Missing catch or finally after try', + UnknownLabel: 'Undefined label \'%0\'', + Redeclaration: '%0 \'%1\' has already been declared', + IllegalContinue: 'Illegal continue statement', + IllegalBreak: 'Illegal break statement', + IllegalReturn: 'Illegal return statement', + StrictModeWith: 'Strict mode code may not include a with statement', + StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', + StrictVarName: 'Variable name may not be eval or arguments in strict mode', + StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', + StrictParamDupe: 'Strict mode function may not have duplicate parameter names', + StrictFunctionName: 'Function name may not be eval or arguments in strict mode', + StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', + StrictDelete: 'Delete of an unqualified identifier in strict mode.', + StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode', + AccessorDataProperty: 'Object literal may not have data and accessor property with the same name', + AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name', + StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', + StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', + StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', + StrictReservedWord: 'Use of future reserved word in strict mode' + }; + + // See also tools/generate-unicode-regex.py. + Regex = { + NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\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\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\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-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\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-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\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-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\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]'), + NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\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\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\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\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]') + }; + + // Ensure the condition is true, otherwise throw an error. + // This is only to have a better contract semantic, i.e. another safety net + // to catch a logic error. The condition shall be fulfilled in normal case. + // Do NOT use this to enforce a certain condition on any user input. + + function assert(condition, message) { + if (!condition) { + throw new Error('ASSERT: ' + message); + } + } + + function sliceSource(from, to) { + return source.slice(from, to); + } + + if (typeof 'esprima'[0] === 'undefined') { + sliceSource = function sliceArraySource(from, to) { + return source.slice(from, to).join(''); + }; + } + + function isDecimalDigit(ch) { + return '0123456789'.indexOf(ch) >= 0; + } + + function isHexDigit(ch) { + return '0123456789abcdefABCDEF'.indexOf(ch) >= 0; + } + + function isOctalDigit(ch) { + return '01234567'.indexOf(ch) >= 0; + } + + + // 7.2 White Space + + function isWhiteSpace(ch) { + return (ch === ' ') || (ch === '\u0009') || (ch === '\u000B') || + (ch === '\u000C') || (ch === '\u00A0') || + (ch.charCodeAt(0) >= 0x1680 && + '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(ch) >= 0); + } + + // 7.3 Line Terminators + + function isLineTerminator(ch) { + return (ch === '\n' || ch === '\r' || ch === '\u2028' || ch === '\u2029'); + } + + // 7.6 Identifier Names and Identifiers + + function isIdentifierStart(ch) { + return (ch === '$') || (ch === '_') || (ch === '\\') || + (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || + ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierStart.test(ch)); + } + + function isIdentifierPart(ch) { + return (ch === '$') || (ch === '_') || (ch === '\\') || + (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || + ((ch >= '0') && (ch <= '9')) || + ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierPart.test(ch)); + } + + // 7.6.1.2 Future Reserved Words + + function isFutureReservedWord(id) { + switch (id) { + + // Future reserved words. + case 'class': + case 'enum': + case 'export': + case 'extends': + case 'import': + case 'super': + return true; + } + + return false; + } + + function isStrictModeReservedWord(id) { + switch (id) { + + // Strict Mode reserved words. + case 'implements': + case 'interface': + case 'package': + case 'private': + case 'protected': + case 'public': + case 'static': + case 'yield': + case 'let': + return true; + } + + return false; + } + + function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; + } + + // 7.6.1.1 Keywords + + function isKeyword(id) { + var keyword = false; + switch (id.length) { + case 2: + keyword = (id === 'if') || (id === 'in') || (id === 'do'); + break; + case 3: + keyword = (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try'); + break; + case 4: + keyword = (id === 'this') || (id === 'else') || (id === 'case') || (id === 'void') || (id === 'with'); + break; + case 5: + keyword = (id === 'while') || (id === 'break') || (id === 'catch') || (id === 'throw'); + break; + case 6: + keyword = (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch'); + break; + case 7: + keyword = (id === 'default') || (id === 'finally'); + break; + case 8: + keyword = (id === 'function') || (id === 'continue') || (id === 'debugger'); + break; + case 10: + keyword = (id === 'instanceof'); + break; + } + + if (keyword) { + return true; + } + + switch (id) { + // Future reserved words. + // 'const' is specialized as Keyword in V8. + case 'const': + return true; + + // For compatiblity to SpiderMonkey and ES.next + case 'yield': + case 'let': + return true; + } + + if (strict && isStrictModeReservedWord(id)) { + return true; + } + + return isFutureReservedWord(id); + } + + // 7.4 Comments + + function skipComment() { + var ch, blockComment, lineComment; + + blockComment = false; + lineComment = false; + + while (index < length) { + ch = source[index]; + + if (lineComment) { + ch = source[index++]; + if (isLineTerminator(ch)) { + lineComment = false; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } + } else if (blockComment) { + if (isLineTerminator(ch)) { + if (ch === '\r' && source[index + 1] === '\n') { + ++index; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + ch = source[index++]; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + if (ch === '*') { + ch = source[index]; + if (ch === '/') { + ++index; + blockComment = false; + } + } + } + } else if (ch === '/') { + ch = source[index + 1]; + if (ch === '/') { + index += 2; + lineComment = true; + } else if (ch === '*') { + index += 2; + blockComment = true; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + break; + } + } else if (isWhiteSpace(ch)) { + ++index; + } else if (isLineTerminator(ch)) { + ++index; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } else { + break; + } + } + } + + function scanHexEscape(prefix) { + var i, len, ch, code = 0; + + len = (prefix === 'u') ? 4 : 2; + for (i = 0; i < len; ++i) { + if (index < length && isHexDigit(source[index])) { + ch = source[index++]; + code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); + } else { + return ''; + } + } + return String.fromCharCode(code); + } + + function scanIdentifier() { + var ch, start, id, restore; + + ch = source[index]; + if (!isIdentifierStart(ch)) { + return; + } + + start = index; + if (ch === '\\') { + ++index; + if (source[index] !== 'u') { + return; + } + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + if (ch === '\\' || !isIdentifierStart(ch)) { + return; + } + id = ch; + } else { + index = restore; + id = 'u'; + } + } else { + id = source[index++]; + } + + while (index < length) { + ch = source[index]; + if (!isIdentifierPart(ch)) { + break; + } + if (ch === '\\') { + ++index; + if (source[index] !== 'u') { + return; + } + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + if (ch === '\\' || !isIdentifierPart(ch)) { + return; + } + id += ch; + } else { + index = restore; + id += 'u'; + } + } else { + id += source[index++]; + } + } + + // There is no keyword or literal with only one character. + // Thus, it must be an identifier. + if (id.length === 1) { + return { + type: Token.Identifier, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (isKeyword(id)) { + return { + type: Token.Keyword, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.1 Null Literals + + if (id === 'null') { + return { + type: Token.NullLiteral, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.2 Boolean Literals + + if (id === 'true' || id === 'false') { + return { + type: Token.BooleanLiteral, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + return { + type: Token.Identifier, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.7 Punctuators + + function scanPunctuator() { + var start = index, + ch1 = source[index], + ch2, + ch3, + ch4; + + // Check for most common single-character punctuators. + + if (ch1 === ';' || ch1 === '{' || ch1 === '}') { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === ',' || ch1 === '(' || ch1 === ')') { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // Dot (.) can also start a floating-point number, hence the need + // to check the next character. + + ch2 = source[index + 1]; + if (ch1 === '.' && !isDecimalDigit(ch2)) { + return { + type: Token.Punctuator, + value: source[index++], + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // Peek more characters. + + ch3 = source[index + 2]; + ch4 = source[index + 3]; + + // 4-character punctuator: >>>= + + if (ch1 === '>' && ch2 === '>' && ch3 === '>') { + if (ch4 === '=') { + index += 4; + return { + type: Token.Punctuator, + value: '>>>=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // 3-character punctuators: === !== >>> <<= >>= + + if (ch1 === '=' && ch2 === '=' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '===', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '!' && ch2 === '=' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '!==', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '>' && ch2 === '>' && ch3 === '>') { + index += 3; + return { + type: Token.Punctuator, + value: '>>>', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '<' && ch2 === '<' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '<<=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '>' && ch2 === '>' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '>>=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 2-character punctuators: <= >= == != ++ -- << >> && || + // += -= *= %= &= |= ^= /= + + if (ch2 === '=') { + if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) { + index += 2; + return { + type: Token.Punctuator, + value: ch1 + ch2, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) { + if ('+-<>&|'.indexOf(ch2) >= 0) { + index += 2; + return { + type: Token.Punctuator, + value: ch1 + ch2, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // The remaining 1-character punctuators. + + if ('[]<>+-*%&|^!~?:=/'.indexOf(ch1) >= 0) { + return { + type: Token.Punctuator, + value: source[index++], + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // 7.8.3 Numeric Literals + + function scanNumericLiteral() { + var number, start, ch; + + ch = source[index]; + assert(isDecimalDigit(ch) || (ch === '.'), + 'Numeric literal must start with a decimal digit or a decimal point'); + + start = index; + number = ''; + if (ch !== '.') { + number = source[index++]; + ch = source[index]; + + // Hex number starts with '0x'. + // Octal number starts with '0'. + if (number === '0') { + if (ch === 'x' || ch === 'X') { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isHexDigit(ch)) { + break; + } + number += source[index++]; + } + + if (number.length <= 2) { + // only 0x + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + if (index < length) { + ch = source[index]; + if (isIdentifierStart(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + return { + type: Token.NumericLiteral, + value: parseInt(number, 16), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } else if (isOctalDigit(ch)) { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isOctalDigit(ch)) { + break; + } + number += source[index++]; + } + + if (index < length) { + ch = source[index]; + if (isIdentifierStart(ch) || isDecimalDigit(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + return { + type: Token.NumericLiteral, + value: parseInt(number, 8), + octal: true, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // decimal number starts with '0' such as '09' is illegal. + if (isDecimalDigit(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + while (index < length) { + ch = source[index]; + if (!isDecimalDigit(ch)) { + break; + } + number += source[index++]; + } + } + + if (ch === '.') { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isDecimalDigit(ch)) { + break; + } + number += source[index++]; + } + } + + if (ch === 'e' || ch === 'E') { + number += source[index++]; + + ch = source[index]; + if (ch === '+' || ch === '-') { + number += source[index++]; + } + + ch = source[index]; + if (isDecimalDigit(ch)) { + number += source[index++]; + while (index < length) { + ch = source[index]; + if (!isDecimalDigit(ch)) { + break; + } + number += source[index++]; + } + } else { + ch = 'character ' + ch; + if (index >= length) { + ch = ''; + } + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + if (index < length) { + ch = source[index]; + if (isIdentifierStart(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + return { + type: Token.NumericLiteral, + value: parseFloat(number), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.4 String Literals + + function scanStringLiteral() { + var str = '', quote, start, ch, code, unescaped, restore, octal = false; + + quote = source[index]; + assert((quote === '\'' || quote === '"'), + 'String literal must starts with a quote'); + + start = index; + ++index; + + while (index < length) { + ch = source[index++]; + + if (ch === quote) { + quote = ''; + break; + } else if (ch === '\\') { + ch = source[index++]; + if (!isLineTerminator(ch)) { + switch (ch) { + case 'n': + str += '\n'; + break; + case 'r': + str += '\r'; + break; + case 't': + str += '\t'; + break; + case 'u': + case 'x': + restore = index; + unescaped = scanHexEscape(ch); + if (unescaped) { + str += unescaped; + } else { + index = restore; + str += ch; + } + break; + case 'b': + str += '\b'; + break; + case 'f': + str += '\f'; + break; + case 'v': + str += '\x0B'; + break; + + default: + if (isOctalDigit(ch)) { + code = '01234567'.indexOf(ch); + + // \0 is not octal escape sequence + if (code !== 0) { + octal = true; + } + + if (index < length && isOctalDigit(source[index])) { + octal = true; + code = code * 8 + '01234567'.indexOf(source[index++]); + + // 3 digits are only allowed when string starts + // with 0, 1, 2, 3 + if ('0123'.indexOf(ch) >= 0 && + index < length && + isOctalDigit(source[index])) { + code = code * 8 + '01234567'.indexOf(source[index++]); + } + } + str += String.fromCharCode(code); + } else { + str += ch; + } + break; + } + } else { + ++lineNumber; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + } + } else if (isLineTerminator(ch)) { + break; + } else { + str += ch; + } + } + + if (quote !== '') { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.StringLiteral, + value: str, + octal: octal, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + function scanRegExp() { + var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false; + + buffer = null; + skipComment(); + + start = index; + ch = source[index]; + assert(ch === '/', 'Regular expression literal must start with a slash'); + str = source[index++]; + + while (index < length) { + ch = source[index++]; + str += ch; + if (ch === '\\') { + ch = source[index++]; + // ECMA-262 7.8.5 + if (isLineTerminator(ch)) { + throwError({}, Messages.UnterminatedRegExp); + } + str += ch; + } else if (classMarker) { + if (ch === ']') { + classMarker = false; + } + } else { + if (ch === '/') { + terminated = true; + break; + } else if (ch === '[') { + classMarker = true; + } else if (isLineTerminator(ch)) { + throwError({}, Messages.UnterminatedRegExp); + } + } + } + + if (!terminated) { + throwError({}, Messages.UnterminatedRegExp); + } + + // Exclude leading and trailing slash. + pattern = str.substr(1, str.length - 2); + + flags = ''; + while (index < length) { + ch = source[index]; + if (!isIdentifierPart(ch)) { + break; + } + + ++index; + if (ch === '\\' && index < length) { + ch = source[index]; + if (ch === 'u') { + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + flags += ch; + str += '\\u'; + for (; restore < index; ++restore) { + str += source[restore]; + } + } else { + index = restore; + flags += 'u'; + str += '\\u'; + } + } else { + str += '\\'; + } + } else { + flags += ch; + str += ch; + } + } + + try { + value = new RegExp(pattern, flags); + } catch (e) { + throwError({}, Messages.InvalidRegExp); + } + + return { + literal: str, + value: value, + range: [start, index] + }; + } + + function isIdentifierName(token) { + return token.type === Token.Identifier || + token.type === Token.Keyword || + token.type === Token.BooleanLiteral || + token.type === Token.NullLiteral; + } + + function advance() { + var ch, token; + + skipComment(); + + if (index >= length) { + return { + type: Token.EOF, + lineNumber: lineNumber, + lineStart: lineStart, + range: [index, index] + }; + } + + token = scanPunctuator(); + if (typeof token !== 'undefined') { + return token; + } + + ch = source[index]; + + if (ch === '\'' || ch === '"') { + return scanStringLiteral(); + } + + if (ch === '.' || isDecimalDigit(ch)) { + return scanNumericLiteral(); + } + + token = scanIdentifier(); + if (typeof token !== 'undefined') { + return token; + } + + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + function lex() { + var token; + + if (buffer) { + index = buffer.range[1]; + lineNumber = buffer.lineNumber; + lineStart = buffer.lineStart; + token = buffer; + buffer = null; + return token; + } + + buffer = null; + return advance(); + } + + function lookahead() { + var pos, line, start; + + if (buffer !== null) { + return buffer; + } + + pos = index; + line = lineNumber; + start = lineStart; + buffer = advance(); + index = pos; + lineNumber = line; + lineStart = start; + + return buffer; + } + + // Return true if there is a line terminator before the next token. + + function peekLineTerminator() { + var pos, line, start, found; + + pos = index; + line = lineNumber; + start = lineStart; + skipComment(); + found = lineNumber !== line; + index = pos; + lineNumber = line; + lineStart = start; + + return found; + } + + // Throw an exception + + function throwError(token, messageFormat) { + var error, + args = Array.prototype.slice.call(arguments, 2), + msg = messageFormat.replace( + /%(\d)/g, + function (whole, index) { + return args[index] || ''; + } + ); + + if (typeof token.lineNumber === 'number') { + error = new Error('Line ' + token.lineNumber + ': ' + msg); + error.index = token.range[0]; + error.lineNumber = token.lineNumber; + error.column = token.range[0] - lineStart + 1; + } else { + error = new Error('Line ' + lineNumber + ': ' + msg); + error.index = index; + error.lineNumber = lineNumber; + error.column = index - lineStart + 1; + } + + throw error; + } + + function throwErrorTolerant() { + try { + throwError.apply(null, arguments); + } catch (e) { + if (extra.errors) { + extra.errors.push(e); + } else { + throw e; + } + } + } + + + // Throw an exception because of the token. + + function throwUnexpected(token) { + if (token.type === Token.EOF) { + throwError(token, Messages.UnexpectedEOS); + } + + if (token.type === Token.NumericLiteral) { + throwError(token, Messages.UnexpectedNumber); + } + + if (token.type === Token.StringLiteral) { + throwError(token, Messages.UnexpectedString); + } + + if (token.type === Token.Identifier) { + throwError(token, Messages.UnexpectedIdentifier); + } + + if (token.type === Token.Keyword) { + if (isFutureReservedWord(token.value)) { + throwError(token, Messages.UnexpectedReserved); + } else if (strict && isStrictModeReservedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictReservedWord); + return; + } + throwError(token, Messages.UnexpectedToken, token.value); + } + + // BooleanLiteral, NullLiteral, or Punctuator. + throwError(token, Messages.UnexpectedToken, token.value); + } + + // Expect the next token to match the specified punctuator. + // If not, an exception will be thrown. + + function expect(value) { + var token = lex(); + if (token.type !== Token.Punctuator || token.value !== value) { + throwUnexpected(token); + } + } + + // Expect the next token to match the specified keyword. + // If not, an exception will be thrown. + + function expectKeyword(keyword) { + var token = lex(); + if (token.type !== Token.Keyword || token.value !== keyword) { + throwUnexpected(token); + } + } + + // Return true if the next token matches the specified punctuator. + + function match(value) { + var token = lookahead(); + return token.type === Token.Punctuator && token.value === value; + } + + // Return true if the next token matches the specified keyword + + function matchKeyword(keyword) { + var token = lookahead(); + return token.type === Token.Keyword && token.value === keyword; + } + + // Return true if the next token is an assignment operator + + function matchAssign() { + var token = lookahead(), + op = token.value; + + if (token.type !== Token.Punctuator) { + return false; + } + return op === '=' || + op === '*=' || + op === '/=' || + op === '%=' || + op === '+=' || + op === '-=' || + op === '<<=' || + op === '>>=' || + op === '>>>=' || + op === '&=' || + op === '^=' || + op === '|='; + } + + function consumeSemicolon() { + var token, line; + + // Catch the very common case first. + if (source[index] === ';') { + lex(); + return; + } + + line = lineNumber; + skipComment(); + if (lineNumber !== line) { + return; + } + + if (match(';')) { + lex(); + return; + } + + token = lookahead(); + if (token.type !== Token.EOF && !match('}')) { + throwUnexpected(token); + } + } + + // Return true if provided expression is LeftHandSideExpression + + function isLeftHandSide(expr) { + return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression; + } + + // 11.1.4 Array Initialiser + + function parseArrayInitialiser() { + var elements = []; + + expect('['); + + while (!match(']')) { + if (match(',')) { + lex(); + elements.push(null); + } else { + elements.push(parseAssignmentExpression()); + + if (!match(']')) { + expect(','); + } + } + } + + expect(']'); + + return { + type: Syntax.ArrayExpression, + elements: elements + }; + } + + // 11.1.5 Object Initialiser + + function parsePropertyFunction(param, first) { + var previousStrict, body; + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (first && strict && isRestrictedWord(param[0].name)) { + throwErrorTolerant(first, Messages.StrictParamName); + } + strict = previousStrict; + + return { + type: Syntax.FunctionExpression, + id: null, + params: param, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }; + } + + function parseObjectPropertyKey() { + var token = lex(); + + // Note: This function is called only from parseObjectProperty(), where + // EOF and Punctuator tokens are already filtered out. + + if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) { + if (strict && token.octal) { + throwErrorTolerant(token, Messages.StrictOctalLiteral); + } + return createLiteral(token); + } + + return { + type: Syntax.Identifier, + name: token.value + }; + } + + function parseObjectProperty() { + var token, key, id, param; + + token = lookahead(); + + if (token.type === Token.Identifier) { + + id = parseObjectPropertyKey(); + + // Property Assignment: Getter and Setter. + + if (token.value === 'get' && !match(':')) { + key = parseObjectPropertyKey(); + expect('('); + expect(')'); + return { + type: Syntax.Property, + key: key, + value: parsePropertyFunction([]), + kind: 'get' + }; + } else if (token.value === 'set' && !match(':')) { + key = parseObjectPropertyKey(); + expect('('); + token = lookahead(); + if (token.type !== Token.Identifier) { + expect(')'); + throwErrorTolerant(token, Messages.UnexpectedToken, token.value); + return { + type: Syntax.Property, + key: key, + value: parsePropertyFunction([]), + kind: 'set' + }; + } else { + param = [ parseVariableIdentifier() ]; + expect(')'); + return { + type: Syntax.Property, + key: key, + value: parsePropertyFunction(param, token), + kind: 'set' + }; + } + } else { + expect(':'); + return { + type: Syntax.Property, + key: id, + value: parseAssignmentExpression(), + kind: 'init' + }; + } + } else if (token.type === Token.EOF || token.type === Token.Punctuator) { + throwUnexpected(token); + } else { + key = parseObjectPropertyKey(); + expect(':'); + return { + type: Syntax.Property, + key: key, + value: parseAssignmentExpression(), + kind: 'init' + }; + } + } + + function parseObjectInitialiser() { + var properties = [], property, name, kind, map = {}, toString = String; + + expect('{'); + + while (!match('}')) { + property = parseObjectProperty(); + + if (property.key.type === Syntax.Identifier) { + name = property.key.name; + } else { + name = toString(property.key.value); + } + kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set; + if (Object.prototype.hasOwnProperty.call(map, name)) { + if (map[name] === PropertyKind.Data) { + if (strict && kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.StrictDuplicateProperty); + } else if (kind !== PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } + } else { + if (kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } else if (map[name] & kind) { + throwErrorTolerant({}, Messages.AccessorGetSet); + } + } + map[name] |= kind; + } else { + map[name] = kind; + } + + properties.push(property); + + if (!match('}')) { + expect(','); + } + } + + expect('}'); + + return { + type: Syntax.ObjectExpression, + properties: properties + }; + } + + // 11.1.6 The Grouping Operator + + function parseGroupExpression() { + var expr; + + expect('('); + + expr = parseExpression(); + + expect(')'); + + return expr; + } + + + // 11.1 Primary Expressions + + function parsePrimaryExpression() { + var token = lookahead(), + type = token.type; + + if (type === Token.Identifier) { + return { + type: Syntax.Identifier, + name: lex().value + }; + } + + if (type === Token.StringLiteral || type === Token.NumericLiteral) { + if (strict && token.octal) { + throwErrorTolerant(token, Messages.StrictOctalLiteral); + } + return createLiteral(lex()); + } + + if (type === Token.Keyword) { + if (matchKeyword('this')) { + lex(); + return { + type: Syntax.ThisExpression + }; + } + + if (matchKeyword('function')) { + return parseFunctionExpression(); + } + } + + if (type === Token.BooleanLiteral) { + lex(); + token.value = (token.value === 'true'); + return createLiteral(token); + } + + if (type === Token.NullLiteral) { + lex(); + token.value = null; + return createLiteral(token); + } + + if (match('[')) { + return parseArrayInitialiser(); + } + + if (match('{')) { + return parseObjectInitialiser(); + } + + if (match('(')) { + return parseGroupExpression(); + } + + if (match('/') || match('/=')) { + return createLiteral(scanRegExp()); + } + + return throwUnexpected(lex()); + } + + // 11.2 Left-Hand-Side Expressions + + function parseArguments() { + var args = []; + + expect('('); + + if (!match(')')) { + while (index < length) { + args.push(parseAssignmentExpression()); + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + return args; + } + + function parseNonComputedProperty() { + var token = lex(); + + if (!isIdentifierName(token)) { + throwUnexpected(token); + } + + return { + type: Syntax.Identifier, + name: token.value + }; + } + + function parseNonComputedMember() { + expect('.'); + + return parseNonComputedProperty(); + } + + function parseComputedMember() { + var expr; + + expect('['); + + expr = parseExpression(); + + expect(']'); + + return expr; + } + + function parseNewExpression() { + var expr; + + expectKeyword('new'); + + expr = { + type: Syntax.NewExpression, + callee: parseLeftHandSideExpression(), + 'arguments': [] + }; + + if (match('(')) { + expr['arguments'] = parseArguments(); + } + + return expr; + } + + function parseLeftHandSideExpressionAllowCall() { + var expr; + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[') || match('(')) { + if (match('(')) { + expr = { + type: Syntax.CallExpression, + callee: expr, + 'arguments': parseArguments() + }; + } else if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + } + } + + return expr; + } + + + function parseLeftHandSideExpression() { + var expr; + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[')) { + if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + } + } + + return expr; + } + + // 11.3 Postfix Expressions + + function parsePostfixExpression() { + var expr = parseLeftHandSideExpressionAllowCall(), token; + + token = lookahead(); + if (token.type !== Token.Punctuator) { + return expr; + } + + if ((match('++') || match('--')) && !peekLineTerminator()) { + // 11.3.1, 11.3.2 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPostfix); + } + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + expr = { + type: Syntax.UpdateExpression, + operator: lex().value, + argument: expr, + prefix: false + }; + } + + return expr; + } + + // 11.4 Unary Operators + + function parseUnaryExpression() { + var token, expr; + + token = lookahead(); + if (token.type !== Token.Punctuator && token.type !== Token.Keyword) { + return parsePostfixExpression(); + } + + if (match('++') || match('--')) { + token = lex(); + expr = parseUnaryExpression(); + // 11.4.4, 11.4.5 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPrefix); + } + + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + expr = { + type: Syntax.UpdateExpression, + operator: token.value, + argument: expr, + prefix: true + }; + return expr; + } + + if (match('+') || match('-') || match('~') || match('!')) { + expr = { + type: Syntax.UnaryExpression, + operator: lex().value, + argument: parseUnaryExpression(), + prefix: true + }; + return expr; + } + + if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) { + expr = { + type: Syntax.UnaryExpression, + operator: lex().value, + argument: parseUnaryExpression(), + prefix: true + }; + if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) { + throwErrorTolerant({}, Messages.StrictDelete); + } + return expr; + } + + return parsePostfixExpression(); + } + + // 11.5 Multiplicative Operators + + function parseMultiplicativeExpression() { + var expr = parseUnaryExpression(); + + while (match('*') || match('/') || match('%')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseUnaryExpression() + }; + } + + return expr; + } + + // 11.6 Additive Operators + + function parseAdditiveExpression() { + var expr = parseMultiplicativeExpression(); + + while (match('+') || match('-')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseMultiplicativeExpression() + }; + } + + return expr; + } + + // 11.7 Bitwise Shift Operators + + function parseShiftExpression() { + var expr = parseAdditiveExpression(); + + while (match('<<') || match('>>') || match('>>>')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseAdditiveExpression() + }; + } + + return expr; + } + // 11.8 Relational Operators + + function parseRelationalExpression() { + var expr, previousAllowIn; + + previousAllowIn = state.allowIn; + state.allowIn = true; + + expr = parseShiftExpression(); + + while (match('<') || match('>') || match('<=') || match('>=') || (previousAllowIn && matchKeyword('in')) || matchKeyword('instanceof')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseShiftExpression() + }; + } + + state.allowIn = previousAllowIn; + return expr; + } + + // 11.9 Equality Operators + + function parseEqualityExpression() { + var expr = parseRelationalExpression(); + + while (match('==') || match('!=') || match('===') || match('!==')) { + expr = { + type: Syntax.BinaryExpression, + operator: lex().value, + left: expr, + right: parseRelationalExpression() + }; + } + + return expr; + } + + // 11.10 Binary Bitwise Operators + + function parseBitwiseANDExpression() { + var expr = parseEqualityExpression(); + + while (match('&')) { + lex(); + expr = { + type: Syntax.BinaryExpression, + operator: '&', + left: expr, + right: parseEqualityExpression() + }; + } + + return expr; + } + + function parseBitwiseXORExpression() { + var expr = parseBitwiseANDExpression(); + + while (match('^')) { + lex(); + expr = { + type: Syntax.BinaryExpression, + operator: '^', + left: expr, + right: parseBitwiseANDExpression() + }; + } + + return expr; + } + + function parseBitwiseORExpression() { + var expr = parseBitwiseXORExpression(); + + while (match('|')) { + lex(); + expr = { + type: Syntax.BinaryExpression, + operator: '|', + left: expr, + right: parseBitwiseXORExpression() + }; + } + + return expr; + } + + // 11.11 Binary Logical Operators + + function parseLogicalANDExpression() { + var expr = parseBitwiseORExpression(); + + while (match('&&')) { + lex(); + expr = { + type: Syntax.LogicalExpression, + operator: '&&', + left: expr, + right: parseBitwiseORExpression() + }; + } + + return expr; + } + + function parseLogicalORExpression() { + var expr = parseLogicalANDExpression(); + + while (match('||')) { + lex(); + expr = { + type: Syntax.LogicalExpression, + operator: '||', + left: expr, + right: parseLogicalANDExpression() + }; + } + + return expr; + } + + // 11.12 Conditional Operator + + function parseConditionalExpression() { + var expr, previousAllowIn, consequent; + + expr = parseLogicalORExpression(); + + if (match('?')) { + lex(); + previousAllowIn = state.allowIn; + state.allowIn = true; + consequent = parseAssignmentExpression(); + state.allowIn = previousAllowIn; + expect(':'); + + expr = { + type: Syntax.ConditionalExpression, + test: expr, + consequent: consequent, + alternate: parseAssignmentExpression() + }; + } + + return expr; + } + + // 11.13 Assignment Operators + + function parseAssignmentExpression() { + var token, expr; + + token = lookahead(); + expr = parseConditionalExpression(); + + if (matchAssign()) { + // LeftHandSideExpression + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + // 11.13.1 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant(token, Messages.StrictLHSAssignment); + } + + expr = { + type: Syntax.AssignmentExpression, + operator: lex().value, + left: expr, + right: parseAssignmentExpression() + }; + } + + return expr; + } + + // 11.14 Comma Operator + + function parseExpression() { + var expr = parseAssignmentExpression(); + + if (match(',')) { + expr = { + type: Syntax.SequenceExpression, + expressions: [ expr ] + }; + + while (index < length) { + if (!match(',')) { + break; + } + lex(); + expr.expressions.push(parseAssignmentExpression()); + } + + } + return expr; + } + + // 12.1 Block + + function parseStatementList() { + var list = [], + statement; + + while (index < length) { + if (match('}')) { + break; + } + statement = parseSourceElement(); + if (typeof statement === 'undefined') { + break; + } + list.push(statement); + } + + return list; + } + + function parseBlock() { + var block; + + expect('{'); + + block = parseStatementList(); + + expect('}'); + + return { + type: Syntax.BlockStatement, + body: block + }; + } + + // 12.2 Variable Statement + + function parseVariableIdentifier() { + var token = lex(); + + if (token.type !== Token.Identifier) { + throwUnexpected(token); + } + + return { + type: Syntax.Identifier, + name: token.value + }; + } + + function parseVariableDeclaration(kind) { + var id = parseVariableIdentifier(), + init = null; + + // 12.2.1 + if (strict && isRestrictedWord(id.name)) { + throwErrorTolerant({}, Messages.StrictVarName); + } + + if (kind === 'const') { + expect('='); + init = parseAssignmentExpression(); + } else if (match('=')) { + lex(); + init = parseAssignmentExpression(); + } + + return { + type: Syntax.VariableDeclarator, + id: id, + init: init + }; + } + + function parseVariableDeclarationList(kind) { + var list = []; + + do { + list.push(parseVariableDeclaration(kind)); + if (!match(',')) { + break; + } + lex(); + } while (index < length); + + return list; + } + + function parseVariableStatement() { + var declarations; + + expectKeyword('var'); + + declarations = parseVariableDeclarationList(); + + consumeSemicolon(); + + return { + type: Syntax.VariableDeclaration, + declarations: declarations, + kind: 'var' + }; + } + + // kind may be `const` or `let` + // Both are experimental and not in the specification yet. + // see http://wiki.ecmascript.org/doku.php?id=harmony:const + // and http://wiki.ecmascript.org/doku.php?id=harmony:let + function parseConstLetDeclaration(kind) { + var declarations; + + expectKeyword(kind); + + declarations = parseVariableDeclarationList(kind); + + consumeSemicolon(); + + return { + type: Syntax.VariableDeclaration, + declarations: declarations, + kind: kind + }; + } + + // 12.3 Empty Statement + + function parseEmptyStatement() { + expect(';'); + + return { + type: Syntax.EmptyStatement + }; + } + + // 12.4 Expression Statement + + function parseExpressionStatement() { + var expr = parseExpression(); + + consumeSemicolon(); + + return { + type: Syntax.ExpressionStatement, + expression: expr + }; + } + + // 12.5 If statement + + function parseIfStatement() { + var test, consequent, alternate; + + expectKeyword('if'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + consequent = parseStatement(); + + if (matchKeyword('else')) { + lex(); + alternate = parseStatement(); + } else { + alternate = null; + } + + return { + type: Syntax.IfStatement, + test: test, + consequent: consequent, + alternate: alternate + }; + } + + // 12.6 Iteration Statements + + function parseDoWhileStatement() { + var body, test, oldInIteration; + + expectKeyword('do'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + if (match(';')) { + lex(); + } + + return { + type: Syntax.DoWhileStatement, + body: body, + test: test + }; + } + + function parseWhileStatement() { + var test, body, oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + return { + type: Syntax.WhileStatement, + test: test, + body: body + }; + } + + function parseForVariableDeclaration() { + var token = lex(); + + return { + type: Syntax.VariableDeclaration, + declarations: parseVariableDeclarationList(), + kind: token.value + }; + } + + function parseForStatement() { + var init, test, update, left, right, body, oldInIteration; + + init = test = update = null; + + expectKeyword('for'); + + expect('('); + + if (match(';')) { + lex(); + } else { + if (matchKeyword('var') || matchKeyword('let')) { + state.allowIn = false; + init = parseForVariableDeclaration(); + state.allowIn = true; + + if (init.declarations.length === 1 && matchKeyword('in')) { + lex(); + left = init; + right = parseExpression(); + init = null; + } + } else { + state.allowIn = false; + init = parseExpression(); + state.allowIn = true; + + if (matchKeyword('in')) { + // LeftHandSideExpression + if (!isLeftHandSide(init)) { + throwErrorTolerant({}, Messages.InvalidLHSInForIn); + } + + lex(); + left = init; + right = parseExpression(); + init = null; + } + } + + if (typeof left === 'undefined') { + expect(';'); + } + } + + if (typeof left === 'undefined') { + + if (!match(';')) { + test = parseExpression(); + } + expect(';'); + + if (!match(')')) { + update = parseExpression(); + } + } + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + if (typeof left === 'undefined') { + return { + type: Syntax.ForStatement, + init: init, + test: test, + update: update, + body: body + }; + } + + return { + type: Syntax.ForInStatement, + left: left, + right: right, + body: body, + each: false + }; + } + + // 12.7 The continue statement + + function parseContinueStatement() { + var token, label = null; + + expectKeyword('continue'); + + // Optimize the most common form: 'continue;'. + if (source[index] === ';') { + lex(); + + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return { + type: Syntax.ContinueStatement, + label: null + }; + } + + if (peekLineTerminator()) { + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return { + type: Syntax.ContinueStatement, + label: null + }; + } + + token = lookahead(); + if (token.type === Token.Identifier) { + label = parseVariableIdentifier(); + + if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return { + type: Syntax.ContinueStatement, + label: label + }; + } + + // 12.8 The break statement + + function parseBreakStatement() { + var token, label = null; + + expectKeyword('break'); + + // Optimize the most common form: 'break;'. + if (source[index] === ';') { + lex(); + + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return { + type: Syntax.BreakStatement, + label: null + }; + } + + if (peekLineTerminator()) { + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return { + type: Syntax.BreakStatement, + label: null + }; + } + + token = lookahead(); + if (token.type === Token.Identifier) { + label = parseVariableIdentifier(); + + if (!Object.prototype.hasOwnProperty.call(state.labelSet, label.name)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return { + type: Syntax.BreakStatement, + label: label + }; + } + + // 12.9 The return statement + + function parseReturnStatement() { + var token, argument = null; + + expectKeyword('return'); + + if (!state.inFunctionBody) { + throwErrorTolerant({}, Messages.IllegalReturn); + } + + // 'return' followed by a space and an identifier is very common. + if (source[index] === ' ') { + if (isIdentifierStart(source[index + 1])) { + argument = parseExpression(); + consumeSemicolon(); + return { + type: Syntax.ReturnStatement, + argument: argument + }; + } + } + + if (peekLineTerminator()) { + return { + type: Syntax.ReturnStatement, + argument: null + }; + } + + if (!match(';')) { + token = lookahead(); + if (!match('}') && token.type !== Token.EOF) { + argument = parseExpression(); + } + } + + consumeSemicolon(); + + return { + type: Syntax.ReturnStatement, + argument: argument + }; + } + + // 12.10 The with statement + + function parseWithStatement() { + var object, body; + + if (strict) { + throwErrorTolerant({}, Messages.StrictModeWith); + } + + expectKeyword('with'); + + expect('('); + + object = parseExpression(); + + expect(')'); + + body = parseStatement(); + + return { + type: Syntax.WithStatement, + object: object, + body: body + }; + } + + // 12.10 The swith statement + + function parseSwitchCase() { + var test, + consequent = [], + statement; + + if (matchKeyword('default')) { + lex(); + test = null; + } else { + expectKeyword('case'); + test = parseExpression(); + } + expect(':'); + + while (index < length) { + if (match('}') || matchKeyword('default') || matchKeyword('case')) { + break; + } + statement = parseStatement(); + if (typeof statement === 'undefined') { + break; + } + consequent.push(statement); + } + + return { + type: Syntax.SwitchCase, + test: test, + consequent: consequent + }; + } + + function parseSwitchStatement() { + var discriminant, cases, clause, oldInSwitch, defaultFound; + + expectKeyword('switch'); + + expect('('); + + discriminant = parseExpression(); + + expect(')'); + + expect('{'); + + cases = []; + + if (match('}')) { + lex(); + return { + type: Syntax.SwitchStatement, + discriminant: discriminant, + cases: cases + }; + } + + oldInSwitch = state.inSwitch; + state.inSwitch = true; + defaultFound = false; + + while (index < length) { + if (match('}')) { + break; + } + clause = parseSwitchCase(); + if (clause.test === null) { + if (defaultFound) { + throwError({}, Messages.MultipleDefaultsInSwitch); + } + defaultFound = true; + } + cases.push(clause); + } + + state.inSwitch = oldInSwitch; + + expect('}'); + + return { + type: Syntax.SwitchStatement, + discriminant: discriminant, + cases: cases + }; + } + + // 12.13 The throw statement + + function parseThrowStatement() { + var argument; + + expectKeyword('throw'); + + if (peekLineTerminator()) { + throwError({}, Messages.NewlineAfterThrow); + } + + argument = parseExpression(); + + consumeSemicolon(); + + return { + type: Syntax.ThrowStatement, + argument: argument + }; + } + + // 12.14 The try statement + + function parseCatchClause() { + var param; + + expectKeyword('catch'); + + expect('('); + if (match(')')) { + throwUnexpected(lookahead()); + } + + param = parseVariableIdentifier(); + // 12.14.1 + if (strict && isRestrictedWord(param.name)) { + throwErrorTolerant({}, Messages.StrictCatchVariable); + } + + expect(')'); + + return { + type: Syntax.CatchClause, + param: param, + body: parseBlock() + }; + } + + function parseTryStatement() { + var block, handlers = [], finalizer = null; + + expectKeyword('try'); + + block = parseBlock(); + + if (matchKeyword('catch')) { + handlers.push(parseCatchClause()); + } + + if (matchKeyword('finally')) { + lex(); + finalizer = parseBlock(); + } + + if (handlers.length === 0 && !finalizer) { + throwError({}, Messages.NoCatchOrFinally); + } + + return { + type: Syntax.TryStatement, + block: block, + guardedHandlers: [], + handlers: handlers, + finalizer: finalizer + }; + } + + // 12.15 The debugger statement + + function parseDebuggerStatement() { + expectKeyword('debugger'); + + consumeSemicolon(); + + return { + type: Syntax.DebuggerStatement + }; + } + + // 12 Statements + + function parseStatement() { + var token = lookahead(), + expr, + labeledBody; + + if (token.type === Token.EOF) { + throwUnexpected(token); + } + + if (token.type === Token.Punctuator) { + switch (token.value) { + case ';': + return parseEmptyStatement(); + case '{': + return parseBlock(); + case '(': + return parseExpressionStatement(); + default: + break; + } + } + + if (token.type === Token.Keyword) { + switch (token.value) { + case 'break': + return parseBreakStatement(); + case 'continue': + return parseContinueStatement(); + case 'debugger': + return parseDebuggerStatement(); + case 'do': + return parseDoWhileStatement(); + case 'for': + return parseForStatement(); + case 'function': + return parseFunctionDeclaration(); + case 'if': + return parseIfStatement(); + case 'return': + return parseReturnStatement(); + case 'switch': + return parseSwitchStatement(); + case 'throw': + return parseThrowStatement(); + case 'try': + return parseTryStatement(); + case 'var': + return parseVariableStatement(); + case 'while': + return parseWhileStatement(); + case 'with': + return parseWithStatement(); + default: + break; + } + } + + expr = parseExpression(); + + // 12.12 Labelled Statements + if ((expr.type === Syntax.Identifier) && match(':')) { + lex(); + + if (Object.prototype.hasOwnProperty.call(state.labelSet, expr.name)) { + throwError({}, Messages.Redeclaration, 'Label', expr.name); + } + + state.labelSet[expr.name] = true; + labeledBody = parseStatement(); + delete state.labelSet[expr.name]; + + return { + type: Syntax.LabeledStatement, + label: expr, + body: labeledBody + }; + } + + consumeSemicolon(); + + return { + type: Syntax.ExpressionStatement, + expression: expr + }; + } + + // 13 Function Definition + + function parseFunctionSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted, + oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody; + + expect('{'); + + while (index < length) { + token = lookahead(); + if (token.type !== Token.StringLiteral) { + break; + } + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = sliceSource(token.range[0] + 1, token.range[1] - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + oldLabelSet = state.labelSet; + oldInIteration = state.inIteration; + oldInSwitch = state.inSwitch; + oldInFunctionBody = state.inFunctionBody; + + state.labelSet = {}; + state.inIteration = false; + state.inSwitch = false; + state.inFunctionBody = true; + + while (index < length) { + if (match('}')) { + break; + } + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + + expect('}'); + + state.labelSet = oldLabelSet; + state.inIteration = oldInIteration; + state.inSwitch = oldInSwitch; + state.inFunctionBody = oldInFunctionBody; + + return { + type: Syntax.BlockStatement, + body: sourceElements + }; + } + + function parseFunctionDeclaration() { + var id, param, params = [], body, token, stricted, firstRestricted, message, previousStrict, paramSet; + + expectKeyword('function'); + token = lookahead(); + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + + expect('('); + + if (!match(')')) { + paramSet = {}; + while (index < length) { + token = lookahead(); + param = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + stricted = token; + message = Messages.StrictParamName; + } + if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + stricted = token; + message = Messages.StrictParamDupe; + } + } else if (!firstRestricted) { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictParamName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + firstRestricted = token; + message = Messages.StrictParamDupe; + } + } + params.push(param); + paramSet[param.name] = true; + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && stricted) { + throwErrorTolerant(stricted, message); + } + strict = previousStrict; + + return { + type: Syntax.FunctionDeclaration, + id: id, + params: params, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }; + } + + function parseFunctionExpression() { + var token, id = null, stricted, firstRestricted, message, param, params = [], body, previousStrict, paramSet; + + expectKeyword('function'); + + if (!match('(')) { + token = lookahead(); + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + } + + expect('('); + + if (!match(')')) { + paramSet = {}; + while (index < length) { + token = lookahead(); + param = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + stricted = token; + message = Messages.StrictParamName; + } + if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + stricted = token; + message = Messages.StrictParamDupe; + } + } else if (!firstRestricted) { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictParamName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) { + firstRestricted = token; + message = Messages.StrictParamDupe; + } + } + params.push(param); + paramSet[param.name] = true; + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && stricted) { + throwErrorTolerant(stricted, message); + } + strict = previousStrict; + + return { + type: Syntax.FunctionExpression, + id: id, + params: params, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }; + } + + // 14 Program + + function parseSourceElement() { + var token = lookahead(); + + if (token.type === Token.Keyword) { + switch (token.value) { + case 'const': + case 'let': + return parseConstLetDeclaration(token.value); + case 'function': + return parseFunctionDeclaration(); + default: + return parseStatement(); + } + } + + if (token.type !== Token.EOF) { + return parseStatement(); + } + } + + function parseSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted; + + while (index < length) { + token = lookahead(); + if (token.type !== Token.StringLiteral) { + break; + } + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = sliceSource(token.range[0] + 1, token.range[1] - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + while (index < length) { + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + return sourceElements; + } + + function parseProgram() { + var program; + strict = false; + program = { + type: Syntax.Program, + body: parseSourceElements() + }; + return program; + } + + // The following functions are needed only when the option to preserve + // the comments is active. + + function addComment(type, value, start, end, loc) { + assert(typeof start === 'number', 'Comment must have valid position'); + + // Because the way the actual token is scanned, often the comments + // (if any) are skipped twice during the lexical analysis. + // Thus, we need to skip adding a comment if the comment array already + // handled it. + if (extra.comments.length > 0) { + if (extra.comments[extra.comments.length - 1].range[1] > start) { + return; + } + } + + extra.comments.push({ + type: type, + value: value, + range: [start, end], + loc: loc + }); + } + + function scanComment() { + var comment, ch, loc, start, blockComment, lineComment; + + comment = ''; + blockComment = false; + lineComment = false; + + while (index < length) { + ch = source[index]; + + if (lineComment) { + ch = source[index++]; + if (isLineTerminator(ch)) { + loc.end = { + line: lineNumber, + column: index - lineStart - 1 + }; + lineComment = false; + addComment('Line', comment, start, index - 1, loc); + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + comment = ''; + } else if (index >= length) { + lineComment = false; + comment += ch; + loc.end = { + line: lineNumber, + column: length - lineStart + }; + addComment('Line', comment, start, length, loc); + } else { + comment += ch; + } + } else if (blockComment) { + if (isLineTerminator(ch)) { + if (ch === '\r' && source[index + 1] === '\n') { + ++index; + comment += '\r\n'; + } else { + comment += ch; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + ch = source[index++]; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + comment += ch; + if (ch === '*') { + ch = source[index]; + if (ch === '/') { + comment = comment.substr(0, comment.length - 1); + blockComment = false; + ++index; + loc.end = { + line: lineNumber, + column: index - lineStart + }; + addComment('Block', comment, start, index, loc); + comment = ''; + } + } + } + } else if (ch === '/') { + ch = source[index + 1]; + if (ch === '/') { + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + start = index; + index += 2; + lineComment = true; + if (index >= length) { + loc.end = { + line: lineNumber, + column: index - lineStart + }; + lineComment = false; + addComment('Line', comment, start, index, loc); + } + } else if (ch === '*') { + start = index; + index += 2; + blockComment = true; + loc = { + start: { + line: lineNumber, + column: index - lineStart - 2 + } + }; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + break; + } + } else if (isWhiteSpace(ch)) { + ++index; + } else if (isLineTerminator(ch)) { + ++index; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } else { + break; + } + } + } + + function filterCommentLocation() { + var i, entry, comment, comments = []; + + for (i = 0; i < extra.comments.length; ++i) { + entry = extra.comments[i]; + comment = { + type: entry.type, + value: entry.value + }; + if (extra.range) { + comment.range = entry.range; + } + if (extra.loc) { + comment.loc = entry.loc; + } + comments.push(comment); + } + + extra.comments = comments; + } + + function collectToken() { + var start, loc, token, range, value; + + skipComment(); + start = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + token = extra.advance(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + if (token.type !== Token.EOF) { + range = [token.range[0], token.range[1]]; + value = sliceSource(token.range[0], token.range[1]); + extra.tokens.push({ + type: TokenName[token.type], + value: value, + range: range, + loc: loc + }); + } + + return token; + } + + function collectRegex() { + var pos, loc, regex, token; + + skipComment(); + + pos = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + regex = extra.scanRegExp(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + // Pop the previous token, which is likely '/' or '/=' + if (extra.tokens.length > 0) { + token = extra.tokens[extra.tokens.length - 1]; + if (token.range[0] === pos && token.type === 'Punctuator') { + if (token.value === '/' || token.value === '/=') { + extra.tokens.pop(); + } + } + } + + extra.tokens.push({ + type: 'RegularExpression', + value: regex.literal, + range: [pos, index], + loc: loc + }); + + return regex; + } + + function filterTokenLocation() { + var i, entry, token, tokens = []; + + for (i = 0; i < extra.tokens.length; ++i) { + entry = extra.tokens[i]; + token = { + type: entry.type, + value: entry.value + }; + if (extra.range) { + token.range = entry.range; + } + if (extra.loc) { + token.loc = entry.loc; + } + tokens.push(token); + } + + extra.tokens = tokens; + } + + function createLiteral(token) { + return { + type: Syntax.Literal, + value: token.value + }; + } + + function createRawLiteral(token) { + return { + type: Syntax.Literal, + value: token.value, + raw: sliceSource(token.range[0], token.range[1]) + }; + } + + function createLocationMarker() { + var marker = {}; + + marker.range = [index, index]; + marker.loc = { + start: { + line: lineNumber, + column: index - lineStart + }, + end: { + line: lineNumber, + column: index - lineStart + } + }; + + marker.end = function () { + this.range[1] = index; + this.loc.end.line = lineNumber; + this.loc.end.column = index - lineStart; + }; + + marker.applyGroup = function (node) { + if (extra.range) { + node.groupRange = [this.range[0], this.range[1]]; + } + if (extra.loc) { + node.groupLoc = { + start: { + line: this.loc.start.line, + column: this.loc.start.column + }, + end: { + line: this.loc.end.line, + column: this.loc.end.column + } + }; + } + }; + + marker.apply = function (node) { + if (extra.range) { + node.range = [this.range[0], this.range[1]]; + } + if (extra.loc) { + node.loc = { + start: { + line: this.loc.start.line, + column: this.loc.start.column + }, + end: { + line: this.loc.end.line, + column: this.loc.end.column + } + }; + } + }; + + return marker; + } + + function trackGroupExpression() { + var marker, expr; + + skipComment(); + marker = createLocationMarker(); + expect('('); + + expr = parseExpression(); + + expect(')'); + + marker.end(); + marker.applyGroup(expr); + + return expr; + } + + function trackLeftHandSideExpression() { + var marker, expr; + + skipComment(); + marker = createLocationMarker(); + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[')) { + if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + marker.end(); + marker.apply(expr); + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + marker.end(); + marker.apply(expr); + } + } + + return expr; + } + + function trackLeftHandSideExpressionAllowCall() { + var marker, expr; + + skipComment(); + marker = createLocationMarker(); + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[') || match('(')) { + if (match('(')) { + expr = { + type: Syntax.CallExpression, + callee: expr, + 'arguments': parseArguments() + }; + marker.end(); + marker.apply(expr); + } else if (match('[')) { + expr = { + type: Syntax.MemberExpression, + computed: true, + object: expr, + property: parseComputedMember() + }; + marker.end(); + marker.apply(expr); + } else { + expr = { + type: Syntax.MemberExpression, + computed: false, + object: expr, + property: parseNonComputedMember() + }; + marker.end(); + marker.apply(expr); + } + } + + return expr; + } + + function filterGroup(node) { + var n, i, entry; + + n = (Object.prototype.toString.apply(node) === '[object Array]') ? [] : {}; + for (i in node) { + if (node.hasOwnProperty(i) && i !== 'groupRange' && i !== 'groupLoc') { + entry = node[i]; + if (entry === null || typeof entry !== 'object' || entry instanceof RegExp) { + n[i] = entry; + } else { + n[i] = filterGroup(entry); + } + } + } + return n; + } + + function wrapTrackingFunction(range, loc) { + + return function (parseFunction) { + + function isBinary(node) { + return node.type === Syntax.LogicalExpression || + node.type === Syntax.BinaryExpression; + } + + function visit(node) { + var start, end; + + if (isBinary(node.left)) { + visit(node.left); + } + if (isBinary(node.right)) { + visit(node.right); + } + + if (range) { + if (node.left.groupRange || node.right.groupRange) { + start = node.left.groupRange ? node.left.groupRange[0] : node.left.range[0]; + end = node.right.groupRange ? node.right.groupRange[1] : node.right.range[1]; + node.range = [start, end]; + } else if (typeof node.range === 'undefined') { + start = node.left.range[0]; + end = node.right.range[1]; + node.range = [start, end]; + } + } + if (loc) { + if (node.left.groupLoc || node.right.groupLoc) { + start = node.left.groupLoc ? node.left.groupLoc.start : node.left.loc.start; + end = node.right.groupLoc ? node.right.groupLoc.end : node.right.loc.end; + node.loc = { + start: start, + end: end + }; + } else if (typeof node.loc === 'undefined') { + node.loc = { + start: node.left.loc.start, + end: node.right.loc.end + }; + } + } + } + + return function () { + var marker, node; + + skipComment(); + + marker = createLocationMarker(); + node = parseFunction.apply(null, arguments); + marker.end(); + + if (range && typeof node.range === 'undefined') { + marker.apply(node); + } + + if (loc && typeof node.loc === 'undefined') { + marker.apply(node); + } + + if (isBinary(node)) { + visit(node); + } + + return node; + }; + }; + } + + function patch() { + + var wrapTracking; + + if (extra.comments) { + extra.skipComment = skipComment; + skipComment = scanComment; + } + + if (extra.raw) { + extra.createLiteral = createLiteral; + createLiteral = createRawLiteral; + } + + if (extra.range || extra.loc) { + + extra.parseGroupExpression = parseGroupExpression; + extra.parseLeftHandSideExpression = parseLeftHandSideExpression; + extra.parseLeftHandSideExpressionAllowCall = parseLeftHandSideExpressionAllowCall; + parseGroupExpression = trackGroupExpression; + parseLeftHandSideExpression = trackLeftHandSideExpression; + parseLeftHandSideExpressionAllowCall = trackLeftHandSideExpressionAllowCall; + + wrapTracking = wrapTrackingFunction(extra.range, extra.loc); + + extra.parseAdditiveExpression = parseAdditiveExpression; + extra.parseAssignmentExpression = parseAssignmentExpression; + extra.parseBitwiseANDExpression = parseBitwiseANDExpression; + extra.parseBitwiseORExpression = parseBitwiseORExpression; + extra.parseBitwiseXORExpression = parseBitwiseXORExpression; + extra.parseBlock = parseBlock; + extra.parseFunctionSourceElements = parseFunctionSourceElements; + extra.parseCatchClause = parseCatchClause; + extra.parseComputedMember = parseComputedMember; + extra.parseConditionalExpression = parseConditionalExpression; + extra.parseConstLetDeclaration = parseConstLetDeclaration; + extra.parseEqualityExpression = parseEqualityExpression; + extra.parseExpression = parseExpression; + extra.parseForVariableDeclaration = parseForVariableDeclaration; + extra.parseFunctionDeclaration = parseFunctionDeclaration; + extra.parseFunctionExpression = parseFunctionExpression; + extra.parseLogicalANDExpression = parseLogicalANDExpression; + extra.parseLogicalORExpression = parseLogicalORExpression; + extra.parseMultiplicativeExpression = parseMultiplicativeExpression; + extra.parseNewExpression = parseNewExpression; + extra.parseNonComputedProperty = parseNonComputedProperty; + extra.parseObjectProperty = parseObjectProperty; + extra.parseObjectPropertyKey = parseObjectPropertyKey; + extra.parsePostfixExpression = parsePostfixExpression; + extra.parsePrimaryExpression = parsePrimaryExpression; + extra.parseProgram = parseProgram; + extra.parsePropertyFunction = parsePropertyFunction; + extra.parseRelationalExpression = parseRelationalExpression; + extra.parseStatement = parseStatement; + extra.parseShiftExpression = parseShiftExpression; + extra.parseSwitchCase = parseSwitchCase; + extra.parseUnaryExpression = parseUnaryExpression; + extra.parseVariableDeclaration = parseVariableDeclaration; + extra.parseVariableIdentifier = parseVariableIdentifier; + + parseAdditiveExpression = wrapTracking(extra.parseAdditiveExpression); + parseAssignmentExpression = wrapTracking(extra.parseAssignmentExpression); + parseBitwiseANDExpression = wrapTracking(extra.parseBitwiseANDExpression); + parseBitwiseORExpression = wrapTracking(extra.parseBitwiseORExpression); + parseBitwiseXORExpression = wrapTracking(extra.parseBitwiseXORExpression); + parseBlock = wrapTracking(extra.parseBlock); + parseFunctionSourceElements = wrapTracking(extra.parseFunctionSourceElements); + parseCatchClause = wrapTracking(extra.parseCatchClause); + parseComputedMember = wrapTracking(extra.parseComputedMember); + parseConditionalExpression = wrapTracking(extra.parseConditionalExpression); + parseConstLetDeclaration = wrapTracking(extra.parseConstLetDeclaration); + parseEqualityExpression = wrapTracking(extra.parseEqualityExpression); + parseExpression = wrapTracking(extra.parseExpression); + parseForVariableDeclaration = wrapTracking(extra.parseForVariableDeclaration); + parseFunctionDeclaration = wrapTracking(extra.parseFunctionDeclaration); + parseFunctionExpression = wrapTracking(extra.parseFunctionExpression); + parseLeftHandSideExpression = wrapTracking(parseLeftHandSideExpression); + parseLogicalANDExpression = wrapTracking(extra.parseLogicalANDExpression); + parseLogicalORExpression = wrapTracking(extra.parseLogicalORExpression); + parseMultiplicativeExpression = wrapTracking(extra.parseMultiplicativeExpression); + parseNewExpression = wrapTracking(extra.parseNewExpression); + parseNonComputedProperty = wrapTracking(extra.parseNonComputedProperty); + parseObjectProperty = wrapTracking(extra.parseObjectProperty); + parseObjectPropertyKey = wrapTracking(extra.parseObjectPropertyKey); + parsePostfixExpression = wrapTracking(extra.parsePostfixExpression); + parsePrimaryExpression = wrapTracking(extra.parsePrimaryExpression); + parseProgram = wrapTracking(extra.parseProgram); + parsePropertyFunction = wrapTracking(extra.parsePropertyFunction); + parseRelationalExpression = wrapTracking(extra.parseRelationalExpression); + parseStatement = wrapTracking(extra.parseStatement); + parseShiftExpression = wrapTracking(extra.parseShiftExpression); + parseSwitchCase = wrapTracking(extra.parseSwitchCase); + parseUnaryExpression = wrapTracking(extra.parseUnaryExpression); + parseVariableDeclaration = wrapTracking(extra.parseVariableDeclaration); + parseVariableIdentifier = wrapTracking(extra.parseVariableIdentifier); + } + + if (typeof extra.tokens !== 'undefined') { + extra.advance = advance; + extra.scanRegExp = scanRegExp; + + advance = collectToken; + scanRegExp = collectRegex; + } + } + + function unpatch() { + if (typeof extra.skipComment === 'function') { + skipComment = extra.skipComment; + } + + if (extra.raw) { + createLiteral = extra.createLiteral; + } + + if (extra.range || extra.loc) { + parseAdditiveExpression = extra.parseAdditiveExpression; + parseAssignmentExpression = extra.parseAssignmentExpression; + parseBitwiseANDExpression = extra.parseBitwiseANDExpression; + parseBitwiseORExpression = extra.parseBitwiseORExpression; + parseBitwiseXORExpression = extra.parseBitwiseXORExpression; + parseBlock = extra.parseBlock; + parseFunctionSourceElements = extra.parseFunctionSourceElements; + parseCatchClause = extra.parseCatchClause; + parseComputedMember = extra.parseComputedMember; + parseConditionalExpression = extra.parseConditionalExpression; + parseConstLetDeclaration = extra.parseConstLetDeclaration; + parseEqualityExpression = extra.parseEqualityExpression; + parseExpression = extra.parseExpression; + parseForVariableDeclaration = extra.parseForVariableDeclaration; + parseFunctionDeclaration = extra.parseFunctionDeclaration; + parseFunctionExpression = extra.parseFunctionExpression; + parseGroupExpression = extra.parseGroupExpression; + parseLeftHandSideExpression = extra.parseLeftHandSideExpression; + parseLeftHandSideExpressionAllowCall = extra.parseLeftHandSideExpressionAllowCall; + parseLogicalANDExpression = extra.parseLogicalANDExpression; + parseLogicalORExpression = extra.parseLogicalORExpression; + parseMultiplicativeExpression = extra.parseMultiplicativeExpression; + parseNewExpression = extra.parseNewExpression; + parseNonComputedProperty = extra.parseNonComputedProperty; + parseObjectProperty = extra.parseObjectProperty; + parseObjectPropertyKey = extra.parseObjectPropertyKey; + parsePrimaryExpression = extra.parsePrimaryExpression; + parsePostfixExpression = extra.parsePostfixExpression; + parseProgram = extra.parseProgram; + parsePropertyFunction = extra.parsePropertyFunction; + parseRelationalExpression = extra.parseRelationalExpression; + parseStatement = extra.parseStatement; + parseShiftExpression = extra.parseShiftExpression; + parseSwitchCase = extra.parseSwitchCase; + parseUnaryExpression = extra.parseUnaryExpression; + parseVariableDeclaration = extra.parseVariableDeclaration; + parseVariableIdentifier = extra.parseVariableIdentifier; + } + + if (typeof extra.scanRegExp === 'function') { + advance = extra.advance; + scanRegExp = extra.scanRegExp; + } + } + + function stringToArray(str) { + var length = str.length, + result = [], + i; + for (i = 0; i < length; ++i) { + result[i] = str.charAt(i); + } + return result; + } + + function parse(code, options) { + var program, toString; + + toString = String; + if (typeof code !== 'string' && !(code instanceof String)) { + code = toString(code); + } + + source = code; + index = 0; + lineNumber = (source.length > 0) ? 1 : 0; + lineStart = 0; + length = source.length; + buffer = null; + state = { + allowIn: true, + labelSet: {}, + inFunctionBody: false, + inIteration: false, + inSwitch: false + }; + + extra = {}; + if (typeof options !== 'undefined') { + extra.range = (typeof options.range === 'boolean') && options.range; + extra.loc = (typeof options.loc === 'boolean') && options.loc; + extra.raw = (typeof options.raw === 'boolean') && options.raw; + if (typeof options.tokens === 'boolean' && options.tokens) { + extra.tokens = []; + } + if (typeof options.comment === 'boolean' && options.comment) { + extra.comments = []; + } + if (typeof options.tolerant === 'boolean' && options.tolerant) { + extra.errors = []; + } + } + + if (length > 0) { + if (typeof source[0] === 'undefined') { + // Try first to convert to a string. This is good as fast path + // for old IE which understands string indexing for string + // literals only and not for string object. + if (code instanceof String) { + source = code.valueOf(); + } + + // Force accessing the characters via an array. + if (typeof source[0] === 'undefined') { + source = stringToArray(code); + } + } + } + + patch(); + try { + program = parseProgram(); + if (typeof extra.comments !== 'undefined') { + filterCommentLocation(); + program.comments = extra.comments; + } + if (typeof extra.tokens !== 'undefined') { + filterTokenLocation(); + program.tokens = extra.tokens; + } + if (typeof extra.errors !== 'undefined') { + program.errors = extra.errors; + } + if (extra.range || extra.loc) { + program.body = filterGroup(program.body); + } + } catch (e) { + throw e; + } finally { + unpatch(); + extra = {}; + } + + return program; + } + + // Sync with package.json. + exports.version = '1.0.4'; + + exports.parse = parse; + + // Deep copy. + exports.Syntax = (function () { + var name, types = {}; + + if (typeof Object.create === 'function') { + types = Object.create(null); + } + + for (name in Syntax) { + if (Syntax.hasOwnProperty(name)) { + types[name] = Syntax[name]; + } + } + + if (typeof Object.freeze === 'function') { + Object.freeze(types); + } + + return types; + }()); + +})); +/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/package.json b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/package.json new file mode 100644 index 0000000..81e2948 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/package.json @@ -0,0 +1,59 @@ +{ + "name": "esprima", + "description": "ECMAScript parsing infrastructure for multipurpose analysis", + "homepage": "http://esprima.org", + "main": "esprima.js", + "bin": { + "esparse": "./bin/esparse.js", + "esvalidate": "./bin/esvalidate.js" + }, + "files": [ + "bin", + "test/run.js", + "test/runner.js", + "test/test.js", + "test/compat.js", + "test/reflect.js", + "esprima.js" + ], + "version": "1.0.4", + "engines": { + "node": ">=0.4.0" + }, + "maintainers": [ + { + "name": "Ariya Hidayat", + "email": "ariya.hidayat@gmail.com", + "url": "http://ariya.ofilabs.com" + } + ], + "repository": { + "type": "git", + "url": "http://github.com/ariya/esprima.git" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/ariya/esprima/raw/master/LICENSE.BSD" + } + ], + "keywords": [ + "ast", + "ecmascript", + "javascript", + "parser", + "syntax" + ], + "scripts": { + "test": "node test/run.js", + "benchmark": "node test/benchmarks.js", + "benchmark-quick": "node test/benchmarks.js quick" + }, + "readme": "**Esprima** ([esprima.org](http://esprima.org)) is a high performance,\nstandard-compliant [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)\nparser written in ECMAScript (also popularly known as\n[JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript)).\nEsprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat),\nwith the help of [many contributors](https://github.com/ariya/esprima/contributors).\n\nEsprima runs on web browsers (IE 6+, Firefox 1+, Safari 3+, Chrome 1+, Konqueror 4.6+, Opera 8+) as well as\n[Node.js](http://nodejs.org).\n\n### Features\n\n- Full support for [ECMAScript 5.1](http://www.ecma-international.org/publications/standards/Ecma-262.htm)(ECMA-262)\n- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla\n[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)\n- Heavily tested (> 550 [unit tests](http://esprima.org/test/) with solid 100% statement coverage)\n- Optional tracking of syntax node location (index-based and line-column)\n- Experimental support for ES6/Harmony (module, class, destructuring, ...)\n\nEsprima is blazing fast (see the [benchmark suite](http://esprima.org/test/benchmarks.html)).\nIt is up to 3x faster than UglifyJS v1 and it is still [competitive](http://esprima.org/test/compare.html)\nwith the new generation of fast parsers.\n\n### Applications\n\nEsprima serves as the basis for many popular JavaScript development tools:\n\n- Code coverage analysis: [node-cover](https://github.com/itay/node-cover), [Istanbul](https://github.com/yahoo/Istanbul)\n- Documentation tool: [JFDoc](https://github.com/thejohnfreeman/jfdoc), [JSDuck](https://github.com/senchalabs/jsduck)\n- Language extension: [LLJS](http://mbebenita.github.com/LLJS/) (low-level JS),\n[Sweet.js](http://sweetjs.org/) (macro)\n- ES6/Harmony transpiler: [Six](https://github.com/matthewrobb/six), [Harmonizr](https://github.com/jdiamond/harmonizr)\n- Eclipse Orion smart editing ([outline view](https://github.com/aclement/esprima-outline), [content assist](http://contraptionsforprogramming.blogspot.com/2012/02/better-javascript-content-assist-in.html))\n- Source code modification: [Esmorph](https://github.com/ariya/esmorph), [Code Painter](https://github.com/fawek/codepainter),\n- Source transformation: [node-falafel](https://github.com/substack/node-falafel), [Esmangle](https://github.com/Constellation/esmangle), [escodegen](https://github.com/Constellation/escodegen)\n\n### Questions?\n- [Documentation](http://esprima.org/doc)\n- [Issue tracker](http://issues.esprima.org): [known problems](http://code.google.com/p/esprima/issues/list?q=Defect)\nand [future plans](http://code.google.com/p/esprima/issues/list?q=Enhancement)\n- [Mailing list](http://groups.google.com/group/esprima)\n- [Contribution guide](http://esprima.org/doc/index.html#contribution)\n\nFollow [@Esprima](http://twitter.com/Esprima) on Twitter to get the\ndevelopment updates.\nFeedback and contribution are welcomed!\n\n### License\n\nCopyright (C) 2012, 2011 [Ariya Hidayat](http://ariya.ofilabs.com/about)\n and other contributors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/ariya/esprima/issues" + }, + "_id": "esprima@1.0.4", + "_from": "esprima@~1.0.3" +} diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/compat.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/compat.js new file mode 100644 index 0000000..ee3a629 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/compat.js @@ -0,0 +1,239 @@ +/* + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2011 Ariya Hidayat + + 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 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 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. +*/ + +/*jslint node: true */ +/*global document: true, window:true, esprima: true, testReflect: true */ + +var runTests; + +function getContext(esprima, reportCase, reportFailure) { + 'use strict'; + + var Reflect, Pattern; + + // Maps Mozilla Reflect object to our Esprima parser. + Reflect = { + parse: function (code) { + var result; + + reportCase(code); + + try { + result = esprima.parse(code); + } catch (error) { + result = error; + } + + return result; + } + }; + + // This is used by Reflect test suite to match a syntax tree. + Pattern = function (obj) { + var pattern; + + // Poor man's deep object cloning. + pattern = JSON.parse(JSON.stringify(obj)); + + // Special handling for regular expression literal since we need to + // convert it to a string literal, otherwise it will be decoded + // as object "{}" and the regular expression would be lost. + if (obj.type && obj.type === 'Literal') { + if (obj.value instanceof RegExp) { + pattern = { + type: obj.type, + value: obj.value.toString() + }; + } + } + + // Special handling for branch statement because SpiderMonkey + // prefers to put the 'alternate' property before 'consequent'. + if (obj.type && obj.type === 'IfStatement') { + pattern = { + type: pattern.type, + test: pattern.test, + consequent: pattern.consequent, + alternate: pattern.alternate + }; + } + + // Special handling for do while statement because SpiderMonkey + // prefers to put the 'test' property before 'body'. + if (obj.type && obj.type === 'DoWhileStatement') { + pattern = { + type: pattern.type, + body: pattern.body, + test: pattern.test + }; + } + + function adjustRegexLiteralAndRaw(key, value) { + if (key === 'value' && value instanceof RegExp) { + value = value.toString(); + } else if (key === 'raw' && typeof value === "string") { + // Ignore Esprima-specific 'raw' property. + return undefined; + } + return value; + } + + if (obj.type && (obj.type === 'Program')) { + pattern.assert = function (tree) { + var actual, expected; + actual = JSON.stringify(tree, adjustRegexLiteralAndRaw, 4); + expected = JSON.stringify(obj, null, 4); + + if (expected !== actual) { + reportFailure(expected, actual); + } + }; + } + + return pattern; + }; + + return { + Reflect: Reflect, + Pattern: Pattern + }; +} + +if (typeof window !== 'undefined') { + // Run all tests in a browser environment. + runTests = function () { + 'use strict'; + + var total = 0, + failures = 0; + + function setText(el, str) { + if (typeof el.innerText === 'string') { + el.innerText = str; + } else { + el.textContent = str; + } + } + + function reportCase(code) { + var report, e; + report = document.getElementById('report'); + e = document.createElement('pre'); + e.setAttribute('class', 'code'); + setText(e, code); + report.appendChild(e); + total += 1; + } + + function reportFailure(expected, actual) { + var report, e; + + failures += 1; + + report = document.getElementById('report'); + + e = document.createElement('p'); + setText(e, 'Expected'); + report.appendChild(e); + + e = document.createElement('pre'); + e.setAttribute('class', 'expected'); + setText(e, expected); + report.appendChild(e); + + e = document.createElement('p'); + setText(e, 'Actual'); + report.appendChild(e); + + e = document.createElement('pre'); + e.setAttribute('class', 'actual'); + setText(e, actual); + report.appendChild(e); + } + + setText(document.getElementById('version'), esprima.version); + + window.setTimeout(function () { + var tick, context = getContext(esprima, reportCase, reportFailure); + + tick = new Date(); + testReflect(context.Reflect, context.Pattern); + tick = (new Date()) - tick; + + if (failures > 0) { + setText(document.getElementById('status'), total + ' tests. ' + + 'Failures: ' + failures + '. ' + tick + ' ms'); + } else { + setText(document.getElementById('status'), total + ' tests. ' + + 'No failure. ' + tick + ' ms'); + } + }, 513); + }; +} else { + (function (global) { + 'use strict'; + var esprima = require('../esprima'), + tick, + total = 0, + failures = [], + header, + current, + context; + + function reportCase(code) { + total += 1; + current = code; + } + + function reportFailure(expected, actual) { + failures.push({ + source: current, + expected: expected.toString(), + actual: actual.toString() + }); + } + + context = getContext(esprima, reportCase, reportFailure); + + tick = new Date(); + require('./reflect').testReflect(context.Reflect, context.Pattern); + tick = (new Date()) - tick; + + header = total + ' tests. ' + failures.length + ' failures. ' + + tick + ' ms'; + if (failures.length) { + console.error(header); + failures.forEach(function (failure) { + console.error(failure.source + ': Expected\n ' + + failure.expected.split('\n').join('\n ') + + '\nto match\n ' + failure.actual); + }); + } else { + console.log(header); + } + process.exit(failures.length === 0 ? 0 : 1); + }(this)); +} +/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/reflect.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/reflect.js new file mode 100644 index 0000000..dba1ba8 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/reflect.js @@ -0,0 +1,422 @@ +// This is modified from Mozilla Reflect.parse test suite (the file is located +// at js/src/tests/js1_8_5/extensions/reflect-parse.js in the source tree). +// +// Some notable changes: +// * Removed unsupported features (destructuring, let, comprehensions...). +// * Removed tests for E4X (ECMAScript for XML). +// * Removed everything related to builder. +// * Enclosed every 'Pattern' construct with a scope. +// * Tweaked some expected tree to remove generator field. +// * Removed the test for bug 632030 and bug 632024. + +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +(function (exports) { + +function testReflect(Reflect, Pattern) { + +function program(elts) { return Pattern({ type: "Program", body: elts }) } +function exprStmt(expr) { return Pattern({ type: "ExpressionStatement", expression: expr }) } +function throwStmt(expr) { return Pattern({ type: "ThrowStatement", argument: expr }) } +function returnStmt(expr) { return Pattern({ type: "ReturnStatement", argument: expr }) } +function yieldExpr(expr) { return Pattern({ type: "YieldExpression", argument: expr }) } +function lit(val) { return Pattern({ type: "Literal", value: val }) } +var thisExpr = Pattern({ type: "ThisExpression" }); +function funDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration", + id: id, + params: params, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }) } +function genFunDecl(id, params, body) { return Pattern({ type: "FunctionDeclaration", + id: id, + params: params, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }) } +function declarator(id, init) { return Pattern({ type: "VariableDeclarator", id: id, init: init }) } +function varDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "var" }) } +function letDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "let" }) } +function constDecl(decls) { return Pattern({ type: "VariableDeclaration", declarations: decls, kind: "const" }) } +function ident(name) { return Pattern({ type: "Identifier", name: name }) } +function dotExpr(obj, id) { return Pattern({ type: "MemberExpression", computed: false, object: obj, property: id }) } +function memExpr(obj, id) { return Pattern({ type: "MemberExpression", computed: true, object: obj, property: id }) } +function forStmt(init, test, update, body) { return Pattern({ type: "ForStatement", init: init, test: test, update: update, body: body }) } +function forInStmt(lhs, rhs, body) { return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body, each: false }) } +function forEachInStmt(lhs, rhs, body) { return Pattern({ type: "ForInStatement", left: lhs, right: rhs, body: body, each: true }) } +function breakStmt(lab) { return Pattern({ type: "BreakStatement", label: lab }) } +function continueStmt(lab) { return Pattern({ type: "ContinueStatement", label: lab }) } +function blockStmt(body) { return Pattern({ type: "BlockStatement", body: body }) } +var emptyStmt = Pattern({ type: "EmptyStatement" }); +function ifStmt(test, cons, alt) { return Pattern({ type: "IfStatement", test: test, alternate: alt, consequent: cons }) } +function labStmt(lab, stmt) { return Pattern({ type: "LabeledStatement", label: lab, body: stmt }) } +function withStmt(obj, stmt) { return Pattern({ type: "WithStatement", object: obj, body: stmt }) } +function whileStmt(test, stmt) { return Pattern({ type: "WhileStatement", test: test, body: stmt }) } +function doStmt(stmt, test) { return Pattern({ type: "DoWhileStatement", test: test, body: stmt }) } +function switchStmt(disc, cases) { return Pattern({ type: "SwitchStatement", discriminant: disc, cases: cases }) } +function caseClause(test, stmts) { return Pattern({ type: "SwitchCase", test: test, consequent: stmts }) } +function defaultClause(stmts) { return Pattern({ type: "SwitchCase", test: null, consequent: stmts }) } +function catchClause(id, guard, body) { if (guard) { return Pattern({ type: "GuardedCatchClause", param: id, guard: guard, body: body }) } else { return Pattern({ type: "CatchClause", param: id, body: body }) } } +function tryStmt(body, guarded, catches, fin) { return Pattern({ type: "TryStatement", block: body, guardedHandlers: guarded, handlers: catches, finalizer: fin }) } +function letStmt(head, body) { return Pattern({ type: "LetStatement", head: head, body: body }) } +function funExpr(id, args, body, gen) { return Pattern({ type: "FunctionExpression", + id: id, + params: args, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }) } +function genFunExpr(id, args, body) { return Pattern({ type: "FunctionExpression", + id: id, + params: args, + defaults: [], + body: body, + rest: null, + generator: false, + expression: false + }) } + +function unExpr(op, arg) { return Pattern({ type: "UnaryExpression", operator: op, argument: arg, prefix: true }) } +function binExpr(op, left, right) { return Pattern({ type: "BinaryExpression", operator: op, left: left, right: right }) } +function aExpr(op, left, right) { return Pattern({ type: "AssignmentExpression", operator: op, left: left, right: right }) } +function updExpr(op, arg, prefix) { return Pattern({ type: "UpdateExpression", operator: op, argument: arg, prefix: prefix }) } +function logExpr(op, left, right) { return Pattern({ type: "LogicalExpression", operator: op, left: left, right: right }) } + +function condExpr(test, cons, alt) { return Pattern({ type: "ConditionalExpression", test: test, consequent: cons, alternate: alt }) } +function seqExpr(exprs) { return Pattern({ type: "SequenceExpression", expressions: exprs }) } +function newExpr(callee, args) { return Pattern({ type: "NewExpression", callee: callee, arguments: args }) } +function callExpr(callee, args) { return Pattern({ type: "CallExpression", callee: callee, arguments: args }) } +function arrExpr(elts) { return Pattern({ type: "ArrayExpression", elements: elts }) } +function objExpr(elts) { return Pattern({ type: "ObjectExpression", properties: elts }) } +function objProp(key, value, kind) { return Pattern({ type: "Property", key: key, value: value, kind: kind }) } + +function arrPatt(elts) { return Pattern({ type: "ArrayPattern", elements: elts }) } +function objPatt(elts) { return Pattern({ type: "ObjectPattern", properties: elts }) } + +function localSrc(src) { return "(function(){ " + src + " })" } +function localPatt(patt) { return program([exprStmt(funExpr(null, [], blockStmt([patt])))]) } +function blockSrc(src) { return "(function(){ { " + src + " } })" } +function blockPatt(patt) { return program([exprStmt(funExpr(null, [], blockStmt([blockStmt([patt])])))]) } + +function assertBlockStmt(src, patt) { + blockPatt(patt).assert(Reflect.parse(blockSrc(src))); +} + +function assertBlockExpr(src, patt) { + assertBlockStmt(src, exprStmt(patt)); +} + +function assertBlockDecl(src, patt, builder) { + blockPatt(patt).assert(Reflect.parse(blockSrc(src), {builder: builder})); +} + +function assertLocalStmt(src, patt) { + localPatt(patt).assert(Reflect.parse(localSrc(src))); +} + +function assertLocalExpr(src, patt) { + assertLocalStmt(src, exprStmt(patt)); +} + +function assertLocalDecl(src, patt) { + localPatt(patt).assert(Reflect.parse(localSrc(src))); +} + +function assertGlobalStmt(src, patt, builder) { + program([patt]).assert(Reflect.parse(src, {builder: builder})); +} + +function assertGlobalExpr(src, patt, builder) { + program([exprStmt(patt)]).assert(Reflect.parse(src, {builder: builder})); + //assertStmt(src, exprStmt(patt)); +} + +function assertGlobalDecl(src, patt) { + program([patt]).assert(Reflect.parse(src)); +} + +function assertProg(src, patt) { + program(patt).assert(Reflect.parse(src)); +} + +function assertStmt(src, patt) { + assertLocalStmt(src, patt); + assertGlobalStmt(src, patt); + assertBlockStmt(src, patt); +} + +function assertExpr(src, patt) { + assertLocalExpr(src, patt); + assertGlobalExpr(src, patt); + assertBlockExpr(src, patt); +} + +function assertDecl(src, patt) { + assertLocalDecl(src, patt); + assertGlobalDecl(src, patt); + assertBlockDecl(src, patt); +} + +function assertError(src, errorType) { + try { + Reflect.parse(src); + } catch (e) { + return; + } + throw new Error("expected " + errorType.name + " for " + uneval(src)); +} + + +// general tests + +// NB: These are useful but for now jit-test doesn't do I/O reliably. + +//program(_).assert(Reflect.parse(snarf('data/flapjax.txt'))); +//program(_).assert(Reflect.parse(snarf('data/jquery-1.4.2.txt'))); +//program(_).assert(Reflect.parse(snarf('data/prototype.js'))); +//program(_).assert(Reflect.parse(snarf('data/dojo.js.uncompressed.js'))); +//program(_).assert(Reflect.parse(snarf('data/mootools-1.2.4-core-nc.js'))); + + +// declarations + +assertDecl("var x = 1, y = 2, z = 3", + varDecl([declarator(ident("x"), lit(1)), + declarator(ident("y"), lit(2)), + declarator(ident("z"), lit(3))])); +assertDecl("var x, y, z", + varDecl([declarator(ident("x"), null), + declarator(ident("y"), null), + declarator(ident("z"), null)])); +assertDecl("function foo() { }", + funDecl(ident("foo"), [], blockStmt([]))); +assertDecl("function foo() { return 42 }", + funDecl(ident("foo"), [], blockStmt([returnStmt(lit(42))]))); + + +// Bug 591437: rebound args have their defs turned into uses +assertDecl("function f(a) { function a() { } }", + funDecl(ident("f"), [ident("a")], blockStmt([funDecl(ident("a"), [], blockStmt([]))]))); +assertDecl("function f(a,b,c) { function b() { } }", + funDecl(ident("f"), [ident("a"),ident("b"),ident("c")], blockStmt([funDecl(ident("b"), [], blockStmt([]))]))); + +// expressions + +assertExpr("true", lit(true)); +assertExpr("false", lit(false)); +assertExpr("42", lit(42)); +assertExpr("(/asdf/)", lit(/asdf/)); +assertExpr("this", thisExpr); +assertExpr("foo", ident("foo")); +assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar"))); +assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar"))); +assertExpr("(function(){})", funExpr(null, [], blockStmt([]))); +assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([]))); +assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([]))); +assertExpr("(++x)", updExpr("++", ident("x"), true)); +assertExpr("(x++)", updExpr("++", ident("x"), false)); +assertExpr("(+x)", unExpr("+", ident("x"))); +assertExpr("(-x)", unExpr("-", ident("x"))); +assertExpr("(!x)", unExpr("!", ident("x"))); +assertExpr("(~x)", unExpr("~", ident("x"))); +assertExpr("(delete x)", unExpr("delete", ident("x"))); +assertExpr("(typeof x)", unExpr("typeof", ident("x"))); +assertExpr("(void x)", unExpr("void", ident("x"))); +assertExpr("(x == y)", binExpr("==", ident("x"), ident("y"))); +assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y"))); +assertExpr("(x === y)", binExpr("===", ident("x"), ident("y"))); +assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y"))); +assertExpr("(x < y)", binExpr("<", ident("x"), ident("y"))); +assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y"))); +assertExpr("(x > y)", binExpr(">", ident("x"), ident("y"))); +assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y"))); +assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y"))); +assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y"))); +assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y"))); +assertExpr("(x + y)", binExpr("+", ident("x"), ident("y"))); +assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z"))); +assertExpr("(x - y)", binExpr("-", ident("x"), ident("y"))); +assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z"))); +assertExpr("(x * y)", binExpr("*", ident("x"), ident("y"))); +assertExpr("(x / y)", binExpr("/", ident("x"), ident("y"))); +assertExpr("(x % y)", binExpr("%", ident("x"), ident("y"))); +assertExpr("(x | y)", binExpr("|", ident("x"), ident("y"))); +assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y"))); +assertExpr("(x & y)", binExpr("&", ident("x"), ident("y"))); +assertExpr("(x in y)", binExpr("in", ident("x"), ident("y"))); +assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y"))); +assertExpr("(x = y)", aExpr("=", ident("x"), ident("y"))); +assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y"))); +assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y"))); +assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y"))); +assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y"))); +assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y"))); +assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y"))); +assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y"))); +assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y"))); +assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y"))); +assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y"))); +assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y"))); +assertExpr("(x || y)", logExpr("||", ident("x"), ident("y"))); +assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y"))); +assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z"))) +assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z"))); +assertExpr("(x,y)", seqExpr([ident("x"),ident("y")])) +assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")])) +assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")])); +assertExpr("(new Object)", newExpr(ident("Object"), [])); +assertExpr("(new Object())", newExpr(ident("Object"), [])); +assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)])); +assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)])); +assertExpr("(String())", callExpr(ident("String"), [])); +assertExpr("(String(42))", callExpr(ident("String"), [lit(42)])); +assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)])); +assertExpr("[]", arrExpr([])); +assertExpr("[1]", arrExpr([lit(1)])); +assertExpr("[1,2]", arrExpr([lit(1),lit(2)])); +assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)])); +assertExpr("[1,,2,3]", arrExpr([lit(1),,lit(2),lit(3)])); +assertExpr("[1,,,2,3]", arrExpr([lit(1),,,lit(2),lit(3)])); +assertExpr("[1,,,2,,3]", arrExpr([lit(1),,,lit(2),,lit(3)])); +assertExpr("[1,,,2,,,3]", arrExpr([lit(1),,,lit(2),,,lit(3)])); +assertExpr("[,1,2,3]", arrExpr([,lit(1),lit(2),lit(3)])); +assertExpr("[,,1,2,3]", arrExpr([,,lit(1),lit(2),lit(3)])); +assertExpr("[,,,1,2,3]", arrExpr([,,,lit(1),lit(2),lit(3)])); +assertExpr("[,,,1,2,3,]", arrExpr([,,,lit(1),lit(2),lit(3)])); +assertExpr("[,,,1,2,3,,]", arrExpr([,,,lit(1),lit(2),lit(3),undefined])); +assertExpr("[,,,1,2,3,,,]", arrExpr([,,,lit(1),lit(2),lit(3),undefined,undefined])); +assertExpr("[,,,,,]", arrExpr([undefined,undefined,undefined,undefined,undefined])); +assertExpr("({})", objExpr([])); +assertExpr("({x:1})", objExpr([objProp(ident("x"), lit(1), "init")])); +assertExpr("({x:1, y:2})", objExpr([objProp(ident("x"), lit(1), "init"), + objProp(ident("y"), lit(2), "init")])); +assertExpr("({x:1, y:2, z:3})", objExpr([objProp(ident("x"), lit(1), "init"), + objProp(ident("y"), lit(2), "init"), + objProp(ident("z"), lit(3), "init") ])); +assertExpr("({x:1, 'y':2, z:3})", objExpr([objProp(ident("x"), lit(1), "init"), + objProp(lit("y"), lit(2), "init"), + objProp(ident("z"), lit(3), "init") ])); +assertExpr("({'x':1, 'y':2, z:3})", objExpr([objProp(lit("x"), lit(1), "init"), + objProp(lit("y"), lit(2), "init"), + objProp(ident("z"), lit(3), "init") ])); +assertExpr("({'x':1, 'y':2, 3:3})", objExpr([objProp(lit("x"), lit(1), "init"), + objProp(lit("y"), lit(2), "init"), + objProp(lit(3), lit(3), "init") ])); + +// Bug 571617: eliminate constant-folding +assertExpr("2 + 3", binExpr("+", lit(2), lit(3))); + +// Bug 632026: constant-folding +assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a")))); + +// Bug 632056: constant-folding +program([exprStmt(ident("f")), + ifStmt(lit(1), + funDecl(ident("f"), [], blockStmt([])), + null)]).assert(Reflect.parse("f; if (1) function f(){}")); + +// statements + +assertStmt("throw 42", throwStmt(lit(42))); +assertStmt("for (;;) break", forStmt(null, null, null, breakStmt(null))); +assertStmt("for (x; y; z) break", forStmt(ident("x"), ident("y"), ident("z"), breakStmt(null))); +assertStmt("for (var x; y; z) break", forStmt(varDecl([declarator(ident("x"), null)]), ident("y"), ident("z"), breakStmt(null))); +assertStmt("for (var x = 42; y; z) break", forStmt(varDecl([declarator(ident("x"), lit(42))]), ident("y"), ident("z"), breakStmt(null))); +assertStmt("for (x; ; z) break", forStmt(ident("x"), null, ident("z"), breakStmt(null))); +assertStmt("for (var x; ; z) break", forStmt(varDecl([declarator(ident("x"), null)]), null, ident("z"), breakStmt(null))); +assertStmt("for (var x = 42; ; z) break", forStmt(varDecl([declarator(ident("x"), lit(42))]), null, ident("z"), breakStmt(null))); +assertStmt("for (x; y; ) break", forStmt(ident("x"), ident("y"), null, breakStmt(null))); +assertStmt("for (var x; y; ) break", forStmt(varDecl([declarator(ident("x"), null)]), ident("y"), null, breakStmt(null))); +assertStmt("for (var x = 42; y; ) break", forStmt(varDecl([declarator(ident("x"),lit(42))]), ident("y"), null, breakStmt(null))); +assertStmt("for (var x in y) break", forInStmt(varDecl([declarator(ident("x"),null)]), ident("y"), breakStmt(null))); +assertStmt("for (x in y) break", forInStmt(ident("x"), ident("y"), breakStmt(null))); +assertStmt("{ }", blockStmt([])); +assertStmt("{ throw 1; throw 2; throw 3; }", blockStmt([ throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))])); +assertStmt(";", emptyStmt); +assertStmt("if (foo) throw 42;", ifStmt(ident("foo"), throwStmt(lit(42)), null)); +assertStmt("if (foo) throw 42; else true;", ifStmt(ident("foo"), throwStmt(lit(42)), exprStmt(lit(true)))); +assertStmt("if (foo) { throw 1; throw 2; throw 3; }", + ifStmt(ident("foo"), + blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]), + null)); +assertStmt("if (foo) { throw 1; throw 2; throw 3; } else true;", + ifStmt(ident("foo"), + blockStmt([throwStmt(lit(1)), throwStmt(lit(2)), throwStmt(lit(3))]), + exprStmt(lit(true)))); +assertStmt("foo: for(;;) break foo;", labStmt(ident("foo"), forStmt(null, null, null, breakStmt(ident("foo"))))); +assertStmt("foo: for(;;) continue foo;", labStmt(ident("foo"), forStmt(null, null, null, continueStmt(ident("foo"))))); +assertStmt("with (obj) { }", withStmt(ident("obj"), blockStmt([]))); +assertStmt("with (obj) { obj; }", withStmt(ident("obj"), blockStmt([exprStmt(ident("obj"))]))); +assertStmt("while (foo) { }", whileStmt(ident("foo"), blockStmt([]))); +assertStmt("while (foo) { foo; }", whileStmt(ident("foo"), blockStmt([exprStmt(ident("foo"))]))); +assertStmt("do { } while (foo);", doStmt(blockStmt([]), ident("foo"))); +assertStmt("do { foo; } while (foo)", doStmt(blockStmt([exprStmt(ident("foo"))]), ident("foo"))); +assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; }", + switchStmt(ident("foo"), + [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]), + caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]), + defaultClause([ exprStmt(lit(3)) ]) ])); +assertStmt("switch (foo) { case 1: 1; break; case 2: 2; break; default: 3; case 42: 42; }", + switchStmt(ident("foo"), + [ caseClause(lit(1), [ exprStmt(lit(1)), breakStmt(null) ]), + caseClause(lit(2), [ exprStmt(lit(2)), breakStmt(null) ]), + defaultClause([ exprStmt(lit(3)) ]), + caseClause(lit(42), [ exprStmt(lit(42)) ]) ])); +assertStmt("try { } catch (e) { }", + tryStmt(blockStmt([]), + [], + [ catchClause(ident("e"), null, blockStmt([])) ], + null)); +assertStmt("try { } catch (e) { } finally { }", + tryStmt(blockStmt([]), + [], + [ catchClause(ident("e"), null, blockStmt([])) ], + blockStmt([]))); +assertStmt("try { } finally { }", + tryStmt(blockStmt([]), + [], + [], + blockStmt([]))); + +// redeclarations (TOK_NAME nodes with lexdef) + +assertStmt("function f() { function g() { } function g() { } }", + funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])), + funDecl(ident("g"), [], blockStmt([]))]))); + +assertStmt("function f() { function g() { } function g() { return 42 } }", + funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])), + funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))]))); + +assertStmt("function f() { var x = 42; var x = 43; }", + funDecl(ident("f"), [], blockStmt([varDecl([declarator(ident("x"),lit(42))]), + varDecl([declarator(ident("x"),lit(43))])]))); + +// getters and setters + + assertExpr("({ get x() { return 42 } })", + objExpr([ objProp(ident("x"), + funExpr(null, [], blockStmt([returnStmt(lit(42))])), + "get" ) ])); + assertExpr("({ set x(v) { return 42 } })", + objExpr([ objProp(ident("x"), + funExpr(null, [ident("v")], blockStmt([returnStmt(lit(42))])), + "set" ) ])); + +} + +exports.testReflect = testReflect; + +}(typeof exports === 'undefined' ? this : exports)); diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/run.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/run.js new file mode 100644 index 0000000..32ca3fa --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/run.js @@ -0,0 +1,66 @@ +/* + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Ariya Hidayat + + 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 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 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. +*/ + +/*jslint node:true */ + +(function () { + 'use strict'; + + var child = require('child_process'), + nodejs = '"' + process.execPath + '"', + ret = 0, + suites, + index; + + suites = [ + 'runner', + 'compat' + ]; + + function nextTest() { + var suite = suites[index]; + + if (index < suites.length) { + child.exec(nodejs + ' ./test/' + suite + '.js', function (err, stdout, stderr) { + if (stdout) { + process.stdout.write(suite + ': ' + stdout); + } + if (stderr) { + process.stderr.write(suite + ': ' + stderr); + } + if (err) { + ret = err.code; + } + index += 1; + nextTest(); + }); + } else { + process.exit(ret); + } + } + + index = 0; + nextTest(); +}()); diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/runner.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/runner.js new file mode 100644 index 0000000..c1a3fc9 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/runner.js @@ -0,0 +1,387 @@ +/* + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Arpad Borsos + Copyright (C) 2011 Ariya Hidayat + Copyright (C) 2011 Yusuke Suzuki + Copyright (C) 2011 Arpad Borsos + + 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 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 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. +*/ + +/*jslint browser:true node:true */ +/*global esprima:true, testFixture:true */ + +var runTests; + +// Special handling for regular expression literal since we need to +// convert it to a string literal, otherwise it will be decoded +// as object "{}" and the regular expression would be lost. +function adjustRegexLiteral(key, value) { + 'use strict'; + if (key === 'value' && value instanceof RegExp) { + value = value.toString(); + } + return value; +} + +function NotMatchingError(expected, actual) { + 'use strict'; + Error.call(this, 'Expected '); + this.expected = expected; + this.actual = actual; +} +NotMatchingError.prototype = new Error(); + +function errorToObject(e) { + 'use strict'; + var msg = e.toString(); + + // Opera 9.64 produces an non-standard string in toString(). + if (msg.substr(0, 6) !== 'Error:') { + if (typeof e.message === 'string') { + msg = 'Error: ' + e.message; + } + } + + return { + index: e.index, + lineNumber: e.lineNumber, + column: e.column, + message: msg + }; +} + +function testParse(esprima, code, syntax) { + 'use strict'; + var expected, tree, actual, options, StringObject, i, len, err; + + // alias, so that JSLint does not complain. + StringObject = String; + + options = { + comment: (typeof syntax.comments !== 'undefined'), + range: true, + loc: true, + tokens: (typeof syntax.tokens !== 'undefined'), + raw: true, + tolerant: (typeof syntax.errors !== 'undefined') + }; + + if (typeof syntax.tokens !== 'undefined') { + if (syntax.tokens.length > 0) { + options.range = (typeof syntax.tokens[0].range !== 'undefined'); + options.loc = (typeof syntax.tokens[0].loc !== 'undefined'); + } + } + + if (typeof syntax.comments !== 'undefined') { + if (syntax.comments.length > 0) { + options.range = (typeof syntax.comments[0].range !== 'undefined'); + options.loc = (typeof syntax.comments[0].loc !== 'undefined'); + } + } + + expected = JSON.stringify(syntax, null, 4); + try { + tree = esprima.parse(code, options); + tree = (options.comment || options.tokens || options.tolerant) ? tree : tree.body[0]; + + if (options.tolerant) { + for (i = 0, len = tree.errors.length; i < len; i += 1) { + tree.errors[i] = errorToObject(tree.errors[i]); + } + } + + actual = JSON.stringify(tree, adjustRegexLiteral, 4); + + // Only to ensure that there is no error when using string object. + esprima.parse(new StringObject(code), options); + + } catch (e) { + throw new NotMatchingError(expected, e.toString()); + } + if (expected !== actual) { + throw new NotMatchingError(expected, actual); + } + + function filter(key, value) { + if (key === 'value' && value instanceof RegExp) { + value = value.toString(); + } + return (key === 'loc' || key === 'range') ? undefined : value; + } + + if (options.tolerant) { + return; + } + + + // Check again without any location info. + options.range = false; + options.loc = false; + expected = JSON.stringify(syntax, filter, 4); + try { + tree = esprima.parse(code, options); + tree = (options.comment || options.tokens) ? tree : tree.body[0]; + + if (options.tolerant) { + for (i = 0, len = tree.errors.length; i < len; i += 1) { + tree.errors[i] = errorToObject(tree.errors[i]); + } + } + + actual = JSON.stringify(tree, filter, 4); + } catch (e) { + throw new NotMatchingError(expected, e.toString()); + } + if (expected !== actual) { + throw new NotMatchingError(expected, actual); + } +} + +function testError(esprima, code, exception) { + 'use strict'; + var i, options, expected, actual, handleInvalidRegexFlag; + + // Different parsing options should give the same error. + options = [ + {}, + { comment: true }, + { raw: true }, + { raw: true, comment: true } + ]; + + // If handleInvalidRegexFlag is true, an invalid flag in a regular expression + // will throw an exception. In some old version V8, this is not the case + // and hence handleInvalidRegexFlag is false. + handleInvalidRegexFlag = false; + try { + 'test'.match(new RegExp('[a-z]', 'x')); + } catch (e) { + handleInvalidRegexFlag = true; + } + + expected = JSON.stringify(exception); + + for (i = 0; i < options.length; i += 1) { + + try { + esprima.parse(code, options[i]); + } catch (e) { + actual = JSON.stringify(errorToObject(e)); + } + + if (expected !== actual) { + + // Compensate for old V8 which does not handle invalid flag. + if (exception.message.indexOf('Invalid regular expression') > 0) { + if (typeof actual === 'undefined' && !handleInvalidRegexFlag) { + return; + } + } + + throw new NotMatchingError(expected, actual); + } + + } +} + +function testAPI(esprima, code, result) { + 'use strict'; + var expected, res, actual; + + expected = JSON.stringify(result.result, null, 4); + try { + if (typeof result.property !== 'undefined') { + res = esprima[result.property]; + } else { + res = esprima[result.call].apply(esprima, result.args); + } + actual = JSON.stringify(res, adjustRegexLiteral, 4); + } catch (e) { + throw new NotMatchingError(expected, e.toString()); + } + if (expected !== actual) { + throw new NotMatchingError(expected, actual); + } +} + +function runTest(esprima, code, result) { + 'use strict'; + if (result.hasOwnProperty('lineNumber')) { + testError(esprima, code, result); + } else if (result.hasOwnProperty('result')) { + testAPI(esprima, code, result); + } else { + testParse(esprima, code, result); + } +} + +if (typeof window !== 'undefined') { + // Run all tests in a browser environment. + runTests = function () { + 'use strict'; + var total = 0, + failures = 0, + category, + fixture, + source, + tick, + expected, + index, + len; + + function setText(el, str) { + if (typeof el.innerText === 'string') { + el.innerText = str; + } else { + el.textContent = str; + } + } + + function startCategory(category) { + var report, e; + report = document.getElementById('report'); + e = document.createElement('h4'); + setText(e, category); + report.appendChild(e); + } + + function reportSuccess(code) { + var report, e; + report = document.getElementById('report'); + e = document.createElement('pre'); + e.setAttribute('class', 'code'); + setText(e, code); + report.appendChild(e); + } + + function reportFailure(code, expected, actual) { + var report, e; + + report = document.getElementById('report'); + + e = document.createElement('p'); + setText(e, 'Code:'); + report.appendChild(e); + + e = document.createElement('pre'); + e.setAttribute('class', 'code'); + setText(e, code); + report.appendChild(e); + + e = document.createElement('p'); + setText(e, 'Expected'); + report.appendChild(e); + + e = document.createElement('pre'); + e.setAttribute('class', 'expected'); + setText(e, expected); + report.appendChild(e); + + e = document.createElement('p'); + setText(e, 'Actual'); + report.appendChild(e); + + e = document.createElement('pre'); + e.setAttribute('class', 'actual'); + setText(e, actual); + report.appendChild(e); + } + + setText(document.getElementById('version'), esprima.version); + + tick = new Date(); + for (category in testFixture) { + if (testFixture.hasOwnProperty(category)) { + startCategory(category); + fixture = testFixture[category]; + for (source in fixture) { + if (fixture.hasOwnProperty(source)) { + expected = fixture[source]; + total += 1; + try { + runTest(esprima, source, expected); + reportSuccess(source, JSON.stringify(expected, null, 4)); + } catch (e) { + failures += 1; + reportFailure(source, e.expected, e.actual); + } + } + } + } + } + tick = (new Date()) - tick; + + if (failures > 0) { + setText(document.getElementById('status'), total + ' tests. ' + + 'Failures: ' + failures + '. ' + tick + ' ms'); + } else { + setText(document.getElementById('status'), total + ' tests. ' + + 'No failure. ' + tick + ' ms'); + } + }; +} else { + (function () { + 'use strict'; + + var esprima = require('../esprima'), + vm = require('vm'), + fs = require('fs'), + total = 0, + failures = [], + tick = new Date(), + expected, + header; + + vm.runInThisContext(fs.readFileSync(__dirname + '/test.js', 'utf-8')); + + Object.keys(testFixture).forEach(function (category) { + Object.keys(testFixture[category]).forEach(function (source) { + total += 1; + expected = testFixture[category][source]; + try { + runTest(esprima, source, expected); + } catch (e) { + e.source = source; + failures.push(e); + } + }); + }); + tick = (new Date()) - tick; + + header = total + ' tests. ' + failures.length + ' failures. ' + + tick + ' ms'; + if (failures.length) { + console.error(header); + failures.forEach(function (failure) { + console.error(failure.source + ': Expected\n ' + + failure.expected.split('\n').join('\n ') + + '\nto match\n ' + failure.actual); + }); + } else { + console.log(header); + } + process.exit(failures.length === 0 ? 0 : 1); + }()); +} diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/test.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/test.js new file mode 100644 index 0000000..8ceee54 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/esprima/test/test.js @@ -0,0 +1,20238 @@ +/* + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Arpad Borsos + Copyright (C) 2011 Ariya Hidayat + Copyright (C) 2011 Yusuke Suzuki + Copyright (C) 2011 Arpad Borsos + + 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 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 BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +var testFixture = { + + 'Primary Expression': { + + 'this\n': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'ThisExpression', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 0 } + } + }], + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 0 } + }, + tokens: [{ + type: 'Keyword', + value: 'this', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }] + }, + + 'null\n': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: null, + raw: 'null', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 0 } + } + }], + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 0 } + }, + tokens: [{ + type: 'Null', + value: 'null', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }] + }, + + '\n 42\n\n': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }, + range: [5, 9], + loc: { + start: { line: 2, column: 4 }, + end: { line: 4, column: 0 } + } + }], + range: [5, 9], + loc: { + start: { line: 2, column: 4 }, + end: { line: 4, column: 0 } + }, + tokens: [{ + type: 'Numeric', + value: '42', + range: [5, 7], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }] + }, + + '(1 + 2 ) * 3': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Literal', + value: 1, + raw: '1', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'Literal', + value: 2, + raw: '2', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [1, 6], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'Literal', + value: 3, + raw: '3', + range: [11, 12], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + } + + }, + + 'Grouping Operator': { + + '(1) + (2 ) + 3': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Literal', + value: 1, + raw: '1', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'Literal', + value: 2, + raw: '2', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + right: { + type: 'Literal', + value: 3, + raw: '3', + range: [14, 15], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + + '4 + 5 << (6)': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '<<', + left: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Literal', + value: 4, + raw: '4', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 5, + raw: '5', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Literal', + value: 6, + raw: '6', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + } + + }, + + 'Array Initializer': { + + 'x = []': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }], + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + tokens: [{ + type: 'Identifier', + value: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, { + type: 'Punctuator', + value: '=', + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Punctuator', + value: '[', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: ']', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }] + }, + + 'x = [ ]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x = [ 42 ]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [{ + type: 'Literal', + value: 42, + raw: '42', + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + } + }], + range: [4, 10], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 10 } + } + }, + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + + 'x = [ 42, ]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [{ + type: 'Literal', + value: 42, + raw: '42', + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + } + }], + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'x = [ ,, 42 ]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [ + null, + null, + { + type: 'Literal', + value: 42, + raw: '42', + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + } + }], + range: [4, 13], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + 'x = [ 1, 2, 3, ]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [{ + type: 'Literal', + value: 1, + raw: '1', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'Literal', + value: 2, + raw: '2', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, { + type: 'Literal', + value: 3, + raw: '3', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }], + range: [4, 16], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + 'x = [ 1, 2,, 3, ]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ArrayExpression', + elements: [{ + type: 'Literal', + value: 1, + raw: '1', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'Literal', + value: 2, + raw: '2', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, null, { + type: 'Literal', + value: 3, + raw: '3', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }], + range: [4, 17], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + + '日本語 = []': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: '日本語', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + 'T\u203F = []': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'T\u203F', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'T\u200C = []': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'T\u200C', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'T\u200D = []': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'T\u200D', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + '\u2163\u2161 = []': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: '\u2163\u2161', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + '\u2163\u2161\u200A=\u2009[]': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: '\u2163\u2161', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + } + + }, + + 'Object Initializer': { + + 'x = {}': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [], + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x = { }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x = { answer: 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'answer', + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [14, 16], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 16 } + } + }, + kind: 'init', + range: [6, 16], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 16 } + } + }], + range: [4, 18], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 18 } + } + }, + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }, + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }, + + 'x = { if: 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'if', + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + kind: 'init', + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }], + range: [4, 14], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + 'x = { true: 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'true', + range: [6, 10], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 10 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + } + }, + kind: 'init', + range: [6, 14], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 14 } + } + }], + range: [4, 16], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + 'x = { false: 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'false', + range: [6, 11], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 11 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [13, 15], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 15 } + } + }, + kind: 'init', + range: [6, 15], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 15 } + } + }], + range: [4, 17], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + + 'x = { null: 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'null', + range: [6, 10], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 10 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + } + }, + kind: 'init', + range: [6, 14], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 14 } + } + }], + range: [4, 16], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + 'x = { "answer": 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Literal', + value: 'answer', + raw: '"answer"', + range: [6, 14], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 14 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [16, 18], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 18 } + } + }, + kind: 'init', + range: [6, 18], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 18 } + } + }], + range: [4, 20], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 20 } + } + }, + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + + 'x = { x: 1, x: 2 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [ + { + type: 'Property', + key: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + value: { + type: 'Literal', + value: 1, + raw: '1', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + kind: 'init', + range: [6, 10], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 10 } + } + }, + { + type: 'Property', + key: { + type: 'Identifier', + name: 'x', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }, + value: { + type: 'Literal', + value: 2, + raw: '2', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }, + kind: 'init', + range: [12, 16], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 16 } + } + } + ], + range: [4, 18], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 18 } + } + }, + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }, + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }, + + 'x = { get width() { return m_width } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'width', + range: [10, 15], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 15 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ReturnStatement', + argument: { + type: 'Identifier', + name: 'm_width', + range: [27, 34], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 34 } + } + }, + range: [20, 35], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 35 } + } + }], + range: [18, 36], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 36 } + } + }, + rest: null, + generator: false, + expression: false, + range: [18, 36], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 36 } + } + }, + kind: 'get', + range: [6, 36], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 36 } + } + }], + range: [4, 38], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 38 } + } + }, + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + }, + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + }, + + 'x = { get undef() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'undef', + range: [10, 15], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 15 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [18, 20], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 20 } + } + }, + rest: null, + generator: false, + expression: false, + range: [18, 20], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 20 } + } + }, + kind: 'get', + range: [6, 20], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 20 } + } + }], + range: [4, 22], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + + 'x = { get if() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'if', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + kind: 'get', + range: [6, 17], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 17 } + } + }], + range: [4, 19], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 19 } + } + }, + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + } + }, + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + } + }, + + 'x = { get true() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'true', + range: [10, 14], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 14 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [17, 19], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 19 } + } + }, + rest: null, + generator: false, + expression: false, + range: [17, 19], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 19 } + } + }, + kind: 'get', + range: [6, 19], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 19 } + } + }], + range: [4, 21], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + + 'x = { get false() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'false', + range: [10, 15], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 15 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [18, 20], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 20 } + } + }, + rest: null, + generator: false, + expression: false, + range: [18, 20], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 20 } + } + }, + kind: 'get', + range: [6, 20], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 20 } + } + }], + range: [4, 22], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + + 'x = { get null() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'null', + range: [10, 14], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 14 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [17, 19], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 19 } + } + }, + rest: null, + generator: false, + expression: false, + range: [17, 19], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 19 } + } + }, + kind: 'get', + range: [6, 19], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 19 } + } + }], + range: [4, 21], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + + 'x = { get "undef"() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Literal', + value: 'undef', + raw: '"undef"', + range: [10, 17], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 17 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [20, 22], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 22 } + } + }, + rest: null, + generator: false, + expression: false, + range: [20, 22], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 22 } + } + }, + kind: 'get', + range: [6, 22], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 22 } + } + }], + range: [4, 24], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 24 } + } + }, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + + 'x = { get 10() {} }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Literal', + value: 10, + raw: '10', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + kind: 'get', + range: [6, 17], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 17 } + } + }], + range: [4, 19], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 19 } + } + }, + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + } + }, + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + } + }, + + 'x = { set width(w) { m_width = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'width', + range: [10, 15], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 15 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_width', + range: [21, 28], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 28 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [31, 32], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 32 } + } + }, + range: [21, 32], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 32 } + } + }, + range: [21, 33], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 33 } + } + }], + range: [19, 34], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [19, 34], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 34 } + } + }, + kind: 'set', + range: [6, 34], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 34 } + } + }], + range: [4, 36], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + + 'x = { set if(w) { m_if = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'if', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_if', + range: [18, 22], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 22 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [25, 26], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 26 } + } + }, + range: [18, 26], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 26 } + } + }, + range: [18, 27], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 27 } + } + }], + range: [16, 28], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 28 } + } + }, + rest: null, + generator: false, + expression: false, + range: [16, 28], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 28 } + } + }, + kind: 'set', + range: [6, 28], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 28 } + } + }], + range: [4, 30], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 30 } + } + }, + range: [0, 30], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 30 } + } + }, + range: [0, 30], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 30 } + } + }, + + 'x = { set true(w) { m_true = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'true', + range: [10, 14], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 14 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_true', + range: [20, 26], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 26 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [29, 30], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 30 } + } + }, + range: [20, 30], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 30 } + } + }, + range: [20, 31], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 31 } + } + }], + range: [18, 32], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 32 } + } + }, + rest: null, + generator: false, + expression: false, + range: [18, 32], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 32 } + } + }, + kind: 'set', + range: [6, 32], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 32 } + } + }], + range: [4, 34], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 34 } + } + }, + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + + 'x = { set false(w) { m_false = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'false', + range: [10, 15], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 15 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_false', + range: [21, 28], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 28 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [31, 32], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 32 } + } + }, + range: [21, 32], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 32 } + } + }, + range: [21, 33], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 33 } + } + }], + range: [19, 34], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [19, 34], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 34 } + } + }, + kind: 'set', + range: [6, 34], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 34 } + } + }], + range: [4, 36], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + + 'x = { set null(w) { m_null = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'null', + range: [10, 14], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 14 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_null', + range: [20, 26], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 26 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [29, 30], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 30 } + } + }, + range: [20, 30], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 30 } + } + }, + range: [20, 31], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 31 } + } + }], + range: [18, 32], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 32 } + } + }, + rest: null, + generator: false, + expression: false, + range: [18, 32], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 32 } + } + }, + kind: 'set', + range: [6, 32], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 32 } + } + }], + range: [4, 34], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 34 } + } + }, + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + + 'x = { set "null"(w) { m_null = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Literal', + value: 'null', + raw: '"null"', + range: [10, 16], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 16 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [17, 18], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 18 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_null', + range: [22, 28], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 28 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [31, 32], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 32 } + } + }, + range: [22, 32], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 32 } + } + }, + range: [22, 33], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 33 } + } + }], + range: [20, 34], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [20, 34], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 34 } + } + }, + kind: 'set', + range: [6, 34], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 34 } + } + }], + range: [4, 36], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + + 'x = { set 10(w) { m_null = w } }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Literal', + value: 10, + raw: '10', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'w', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'm_null', + range: [18, 24], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 24 } + } + }, + right: { + type: 'Identifier', + name: 'w', + range: [27, 28], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 28 } + } + }, + range: [18, 28], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 28 } + } + }, + range: [18, 29], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 29 } + } + }], + range: [16, 30], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 30 } + } + }, + rest: null, + generator: false, + expression: false, + range: [16, 30], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 30 } + } + }, + kind: 'set', + range: [6, 30], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 30 } + } + }], + range: [4, 32], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 32 } + } + }, + range: [0, 32], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 32 } + } + }, + range: [0, 32], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 32 } + } + }, + + 'x = { get: 42 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'get', + range: [6, 9], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 9 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [11, 13], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 13 } + } + }, + kind: 'init', + range: [6, 13], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 13 } + } + }], + range: [4, 15], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + + 'x = { set: 43 }': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'set', + range: [6, 9], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 9 } + } + }, + value: { + type: 'Literal', + value: 43, + raw: '43', + range: [11, 13], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 13 } + } + }, + kind: 'init', + range: [6, 13], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 13 } + } + }], + range: [4, 15], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + } + + }, + + 'Comments': { + + '/* block comment */ 42': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [20, 22], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 22 } + } + }, + range: [20, 22], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 22 } + } + }, + + '42 /*The*/ /*Answer*/': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }], + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + }, + comments: [{ + type: 'Block', + value: 'The', + range: [3, 10], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 10 } + } + }, { + type: 'Block', + value: 'Answer', + range: [11, 21], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 21 } + } + }] + }, + + '42 /*the*/ /*answer*/': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [0, 2] + }, + range: [0, 21] + }], + range: [0, 21], + comments: [{ + type: 'Block', + value: 'the', + range: [3, 10] + }, { + type: 'Block', + value: 'answer', + range: [11, 21] + }] + }, + + '/* multiline\ncomment\nshould\nbe\nignored */ 42': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [42, 44], + loc: { + start: { line: 5, column: 11 }, + end: { line: 5, column: 13 } + } + }, + range: [42, 44], + loc: { + start: { line: 5, column: 11 }, + end: { line: 5, column: 13 } + } + }, + + '/*a\r\nb*/ 42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [9, 11], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }, + range: [9, 11], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }], + range: [9, 11], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + }, + comments: [{ + type: 'Block', + value: 'a\r\nb', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 3 } + } + }] + }, + + '/*a\rb*/ 42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [8, 10], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }, + range: [8, 10], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }], + range: [8, 10], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + }, + comments: [{ + type: 'Block', + value: 'a\rb', + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 3 } + } + }] + }, + + '/*a\nb*/ 42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [8, 10], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }, + range: [8, 10], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }], + range: [8, 10], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + }, + comments: [{ + type: 'Block', + value: 'a\nb', + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 3 } + } + }] + }, + + '/*a\nc*/ 42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }, + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + } + }], + loc: { + start: { line: 2, column: 4 }, + end: { line: 2, column: 6 } + }, + comments: [{ + type: 'Block', + value: 'a\nc', + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 3 } + } + }] + }, + + '// line comment\n42': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [16, 18], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }, + range: [16, 18], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }, + + '42 // line comment': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }], + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + comments: [{ + type: 'Line', + value: ' line comment', + range: [3, 18], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 18 } + } + }] + }, + + '// Hello, world!\n42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [17, 19], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }, + range: [17, 19], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }], + range: [17, 19], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + }, + comments: [{ + type: 'Line', + value: ' Hello, world!', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }] + }, + + '// Hello, world!\n': { + type: 'Program', + body: [], + range: [17, 17], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 0 } + }, + comments: [{ + type: 'Line', + value: ' Hello, world!', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }] + }, + + '// Hallo, world!\n': { + type: 'Program', + body: [], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 0 } + }, + comments: [{ + type: 'Line', + value: ' Hallo, world!', + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }] + }, + + '//\n42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [3, 5], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }, + range: [3, 5], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }], + range: [3, 5], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + }, + comments: [{ + type: 'Line', + value: '', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }] + }, + + '//': { + type: 'Program', + body: [], + range: [2, 2], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 2 } + }, + comments: [{ + type: 'Line', + value: '', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }] + }, + + '// ': { + type: 'Program', + body: [], + range: [3, 3], + comments: [{ + type: 'Line', + value: ' ', + range: [0, 3] + }] + }, + + '/**/42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }], + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + }, + comments: [{ + type: 'Block', + value: '', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }] + }, + + '// Hello, world!\n\n// Another hello\n42': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [37, 39], + loc: { + start: { line: 4, column: 0 }, + end: { line: 4, column: 2 } + } + }, + range: [37, 39], + loc: { + start: { line: 4, column: 0 }, + end: { line: 4, column: 2 } + } + }], + range: [37, 39], + loc: { + start: { line: 4, column: 0 }, + end: { line: 4, column: 2 } + }, + comments: [{ + type: 'Line', + value: ' Hello, world!', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, { + type: 'Line', + value: ' Another hello', + range: [18, 36], + loc: { + start: { line: 3, column: 0 }, + end: { line: 3, column: 18 } + } + }] + }, + + 'if (x) { // Some comment\ndoThat(); }': { + type: 'Program', + body: [{ + type: 'IfStatement', + test: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + consequent: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'doThat', + range: [25, 31], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }, + 'arguments': [], + range: [25, 33], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 8 } + } + }, + range: [25, 34], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 9 } + } + }], + range: [7, 36], + loc: { + start: { line: 1, column: 7 }, + end: { line: 2, column: 11 } + } + }, + alternate: null, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 11 } + } + }], + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 11 } + }, + comments: [{ + type: 'Line', + value: ' Some comment', + range: [9, 24], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 24 } + } + }] + }, + + 'switch (answer) { case 42: /* perfect */ bingo() }': { + type: 'Program', + body: [{ + type: 'SwitchStatement', + discriminant: { + type: 'Identifier', + name: 'answer', + range: [8, 14], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 14 } + } + }, + cases: [{ + type: 'SwitchCase', + test: { + type: 'Literal', + value: 42, + raw: '42', + range: [23, 25], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 25 } + } + }, + consequent: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'bingo', + range: [41, 46], + loc: { + start: { line: 1, column: 41 }, + end: { line: 1, column: 46 } + } + }, + 'arguments': [], + range: [41, 48], + loc: { + start: { line: 1, column: 41 }, + end: { line: 1, column: 48 } + } + }, + range: [41, 49], + loc: { + start: { line: 1, column: 41 }, + end: { line: 1, column: 49 } + } + }], + range: [18, 49], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 49 } + } + }], + range: [0, 50], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 50 } + } + }], + range: [0, 50], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 50 } + }, + comments: [{ + type: 'Block', + value: ' perfect ', + range: [27, 40], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 40 } + } + }] + } + + }, + + 'Numeric Literals': { + + '0': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0, + raw: '0', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + + '42': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42, + raw: '42', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + + '3': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 3, + raw: '3', + range: [0, 1] + }, + range: [0, 1] + }], + range: [0, 1], + tokens: [{ + type: 'Numeric', + value: '3', + range: [0, 1] + }] + }, + + '5': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 5, + raw: '5', + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + }, + tokens: [{ + type: 'Numeric', + value: '5', + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }] + }, + + '.14': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0.14, + raw: '.14', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + '3.14159': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 3.14159, + raw: '3.14159', + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + '6.02214179e+23': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 6.02214179e+23, + raw: '6.02214179e+23', + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + '1.492417830e-10': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 1.49241783e-10, + raw: '1.492417830e-10', + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + + '0x0': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0, + raw: '0x0', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + '0e+100': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0, + raw: '0e+100', + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + '0xabc': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0xabc, + raw: '0xabc', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + '0xdef': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0xdef, + raw: '0xdef', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + '0X1A': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0x1A, + raw: '0X1A', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + + '0x10': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0x10, + raw: '0x10', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + + '0x100': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0x100, + raw: '0x100', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + '0X04': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 0X04, + raw: '0X04', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + + '02': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 2, + raw: '02', + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + + '012': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 10, + raw: '012', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + '0012': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 10, + raw: '0012', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + } + + }, + + 'String Literals': { + + '"Hello"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello', + raw: '"Hello"', + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + '"\\n\\r\\t\\v\\b\\f\\\\\\\'\\"\\0"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: '\n\r\t\x0B\b\f\\\'"\x00', + raw: '"\\n\\r\\t\\v\\b\\f\\\\\\\'\\"\\0"', + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + + '"\\u0061"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'a', + raw: '"\\u0061"', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + '"\\x61"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'a', + raw: '"\\x61"', + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + '"\\u00"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'u00', + raw: '"\\u00"', + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + '"\\xt"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'xt', + raw: '"\\xt"', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + '"Hello\\nworld"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\nworld', + raw: '"Hello\\nworld"', + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + '"Hello\\\nworld"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Helloworld', + raw: '"Hello\\\nworld"', + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 14 } + } + }, + + '"Hello\\02World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\u0002World', + raw: '"Hello\\02World"', + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + + '"Hello\\012World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\u000AWorld', + raw: '"Hello\\012World"', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '"Hello\\122World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\122World', + raw: '"Hello\\122World"', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '"Hello\\0122World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\u000A2World', + raw: '"Hello\\0122World"', + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + + '"Hello\\312World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\u00CAWorld', + raw: '"Hello\\312World"', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '"Hello\\412World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\412World', + raw: '"Hello\\412World"', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '"Hello\\812World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello812World', + raw: '"Hello\\812World"', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '"Hello\\712World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\712World', + raw: '"Hello\\712World"', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '"Hello\\0World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\u0000World', + raw: '"Hello\\0World"', + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + '"Hello\\\r\nworld"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Helloworld', + raw: '"Hello\\\r\nworld"', + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 15 } + } + }, + + '"Hello\\1World"': { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'Hello\u0001World', + raw: '"Hello\\1World"', + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + } + }, + + 'Regular Expression Literals': { + + 'var x = /[a-z]/i': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/[a-z]/i', + raw: '/[a-z]/i', + range: [8, 16], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 16 } + } + }, + range: [4, 16], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 16 } + } + }], + kind: 'var', + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }], + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/[a-z]/i', + range: [8, 16], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 16 } + } + }] + }, + + 'var x = /[x-z]/i': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5] + }, + init: { + type: 'Literal', + value: '/[x-z]/i', + raw: '/[x-z]/i', + range: [8, 16] + }, + range: [4, 16] + }], + kind: 'var', + range: [0, 16] + }], + range: [0, 16], + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3] + }, { + type: 'Identifier', + value: 'x', + range: [4, 5] + }, { + type: 'Punctuator', + value: '=', + range: [6, 7] + }, { + type: 'RegularExpression', + value: '/[x-z]/i', + range: [8, 16] + }] + }, + + 'var x = /[a-c]/i': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/[a-c]/i', + raw: '/[a-c]/i', + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 16 } + } + }, + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 16 } + } + }], + kind: 'var', + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/[a-c]/i', + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 16 } + } + }] + }, + + 'var x = /[P QR]/i': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/[P QR]/i', + raw: '/[P QR]/i', + range: [8, 17], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 17 } + } + }, + range: [4, 17], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 17 } + } + }], + kind: 'var', + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }], + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/[P QR]/i', + range: [8, 17], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 17 } + } + }] + }, + + 'var x = /[\\]/]/': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: new RegExp('[\\]/]').toString(), + raw: '/[\\]/]/', + range: [8, 15], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 15 } + } + }, + range: [4, 15], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 15 } + } + }], + kind: 'var', + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }], + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/[\\]/]/', + range: [8, 15], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 15 } + } + }] + }, + + 'var x = /foo\\/bar/': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/foo\\/bar/', + raw: '/foo\\/bar/', + range: [8, 18], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 18 } + } + }, + range: [4, 18], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 18 } + } + }], + kind: 'var', + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }], + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/foo\\/bar/', + range: [8, 18], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 18 } + } + }] + }, + + 'var x = /=([^=\\s])+/g': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/=([^=\\s])+/g', + raw: '/=([^=\\s])+/g', + range: [8, 21], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 21 } + } + }, + range: [4, 21], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 21 } + } + }], + kind: 'var', + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }], + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/=([^=\\s])+/g', + range: [8, 21], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 21 } + } + }] + }, + + 'var x = /[P QR]/\\u0067': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/[P QR]/g', + raw: '/[P QR]/\\u0067', + range: [8, 22], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 22 } + } + }, + range: [4, 22], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 22 } + } + }], + kind: 'var', + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }], + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/[P QR]/\\u0067', + range: [8, 22], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 22 } + } + }] + }, + + 'var x = /[P QR]/\\g': { + type: 'Program', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: '/[P QR]/g', + raw: '/[P QR]/\\g', + range: [8, 18], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 18 } + } + }, + range: [4, 18], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 18 } + } + }], + kind: 'var', + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }], + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + }, + tokens: [{ + type: 'Keyword', + value: 'var', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, { + type: 'Identifier', + value: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'Punctuator', + value: '=', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, { + type: 'RegularExpression', + value: '/[P QR]/\\g', + range: [8, 18], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 18 } + } + }] + } + + }, + + 'Left-Hand-Side Expression': { + + 'new Button': { + type: 'ExpressionStatement', + expression: { + type: 'NewExpression', + callee: { + type: 'Identifier', + name: 'Button', + range: [4, 10], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 10 } + } + }, + 'arguments': [], + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + + 'new Button()': { + type: 'ExpressionStatement', + expression: { + type: 'NewExpression', + callee: { + type: 'Identifier', + name: 'Button', + range: [4, 10], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 10 } + } + }, + 'arguments': [], + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + + 'new new foo': { + type: 'ExpressionStatement', + expression: { + type: 'NewExpression', + callee: { + type: 'NewExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [8, 11], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 11 } + } + }, + 'arguments': [], + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + 'arguments': [], + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'new new foo()': { + type: 'ExpressionStatement', + expression: { + type: 'NewExpression', + callee: { + type: 'NewExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [8, 11], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 11 } + } + }, + 'arguments': [], + range: [4, 13], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 13 } + } + }, + 'arguments': [], + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + 'new foo().bar()': { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + computed: false, + object: { + type: 'NewExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + 'arguments': [], + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + property: { + type: 'Identifier', + name: 'bar', + range: [10, 13], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + 'arguments': [], + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + range: [0, 15], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 15 } + } + }, + + 'new foo[bar]': { + type: 'ExpressionStatement', + expression: { + type: 'NewExpression', + callee: { + type: 'MemberExpression', + computed: true, + object: { + type: 'Identifier', + name: 'foo', + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + property: { + type: 'Identifier', + name: 'bar', + range: [8, 11], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 11 } + } + }, + range: [4, 12], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 12 } + } + }, + 'arguments': [], + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + + 'new foo.bar()': { + type: 'ExpressionStatement', + expression: { + type: 'NewExpression', + callee: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'foo', + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + property: { + type: 'Identifier', + name: 'bar', + range: [8, 11], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 11 } + } + }, + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + 'arguments': [], + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + '( new foo).bar()': { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + computed: false, + object: { + type: 'NewExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [6, 9], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 9 } + } + }, + 'arguments': [], + range: [2, 9], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 9 } + } + }, + property: { + type: 'Identifier', + name: 'bar', + range: [11, 14], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + 'arguments': [], + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + 'foo(bar, baz)': { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'bar', + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, { + type: 'Identifier', + name: 'baz', + range: [9, 12], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 12 } + } + }], + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + '( foo )()': { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [5, 8], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 8 } + } + }, + 'arguments': [], + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + 'universe.milkyway': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'milkyway', + range: [9, 17], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + + 'universe.milkyway.solarsystem': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'milkyway', + range: [9, 17], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + property: { + type: 'Identifier', + name: 'solarsystem', + range: [18, 29], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 29 } + } + }, + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + + 'universe.milkyway.solarsystem.Earth': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'MemberExpression', + computed: false, + object: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'milkyway', + range: [9, 17], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + property: { + type: 'Identifier', + name: 'solarsystem', + range: [18, 29], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 29 } + } + }, + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + property: { + type: 'Identifier', + name: 'Earth', + range: [30, 35], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 35 } + } + }, + range: [0, 35], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 35 } + } + }, + range: [0, 35], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 35 } + } + }, + + 'universe[galaxyName, otherUselessName]': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: true, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'SequenceExpression', + expressions: [{ + type: 'Identifier', + name: 'galaxyName', + range: [9, 19], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 19 } + } + }, { + type: 'Identifier', + name: 'otherUselessName', + range: [21, 37], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 37 } + } + }], + range: [9, 37], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 37 } + } + }, + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + }, + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + }, + + 'universe[galaxyName]': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: true, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'galaxyName', + range: [9, 19], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 19 } + } + }, + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + + 'universe[42].galaxies': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'MemberExpression', + computed: true, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Literal', + value: 42, + raw: '42', + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + property: { + type: 'Identifier', + name: 'galaxies', + range: [13, 21], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + + 'universe(42).galaxies': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + 'arguments': [{ + type: 'Literal', + value: 42, + raw: '42', + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + } + }], + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + property: { + type: 'Identifier', + name: 'galaxies', + range: [13, 21], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + + 'universe(42).galaxies(14, 3, 77).milkyway': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + computed: false, + object: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + 'arguments': [{ + type: 'Literal', + value: 42, + raw: '42', + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + } + }], + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + property: { + type: 'Identifier', + name: 'galaxies', + range: [13, 21], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + 'arguments': [{ + type: 'Literal', + value: 14, + raw: '14', + range: [22, 24], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 24 } + } + }, { + type: 'Literal', + value: 3, + raw: '3', + range: [26, 27], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 27 } + } + }, { + type: 'Literal', + value: 77, + raw: '77', + range: [29, 31], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 31 } + } + }], + range: [0, 32], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 32 } + } + }, + property: { + type: 'Identifier', + name: 'milkyway', + range: [33, 41], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 41 } + } + }, + range: [0, 41], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 41 } + } + }, + range: [0, 41], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 41 } + } + }, + + 'earth.asia.Indonesia.prepareForElection(2014)': { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'MemberExpression', + computed: false, + object: { + type: 'MemberExpression', + computed: false, + object: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'earth', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + property: { + type: 'Identifier', + name: 'asia', + range: [6, 10], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 10 } + } + }, + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + property: { + type: 'Identifier', + name: 'Indonesia', + range: [11, 20], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 20 } + } + }, + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + property: { + type: 'Identifier', + name: 'prepareForElection', + range: [21, 39], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 39 } + } + }, + range: [0, 39], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 39 } + } + }, + 'arguments': [{ + type: 'Literal', + value: 2014, + raw: '2014', + range: [40, 44], + loc: { + start: { line: 1, column: 40 }, + end: { line: 1, column: 44 } + } + }], + range: [0, 45], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 45 } + } + }, + range: [0, 45], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 45 } + } + }, + + 'universe.if': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'if', + range: [9, 11], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'universe.true': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'true', + range: [9, 13], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + 'universe.false': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'false', + range: [9, 14], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + 'universe.null': { + type: 'ExpressionStatement', + expression: { + type: 'MemberExpression', + computed: false, + object: { + type: 'Identifier', + name: 'universe', + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + property: { + type: 'Identifier', + name: 'null', + range: [9, 13], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + } + + }, + + 'Postfix Expressions': { + + 'x++': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + prefix: false, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + 'x--': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + prefix: false, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + 'eval++': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'eval', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + prefix: false, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'eval--': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'eval', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + prefix: false, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'arguments++': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'arguments', + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + prefix: false, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'arguments--': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'arguments', + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + prefix: false, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + } + + }, + + 'Unary Operators': { + + '++x': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'x', + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + } + }, + prefix: true, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + '--x': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'x', + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + } + }, + prefix: true, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + '++eval': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'eval', + range: [2, 6], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 6 } + } + }, + prefix: true, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + '--eval': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'eval', + range: [2, 6], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 6 } + } + }, + prefix: true, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + '++arguments': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'arguments', + range: [2, 11], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 11 } + } + }, + prefix: true, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + '--arguments': { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'arguments', + range: [2, 11], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 11 } + } + }, + prefix: true, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + '+x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: '+', + argument: { + type: 'Identifier', + name: 'x', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }, + prefix: true, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + + '-x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: '-', + argument: { + type: 'Identifier', + name: 'x', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }, + prefix: true, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + + '~x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: '~', + argument: { + type: 'Identifier', + name: 'x', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }, + prefix: true, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + + '!x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: '!', + argument: { + type: 'Identifier', + name: 'x', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }, + prefix: true, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + }, + + 'void x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: 'void', + argument: { + type: 'Identifier', + name: 'x', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + prefix: true, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'delete x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: 'delete', + argument: { + type: 'Identifier', + name: 'x', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + prefix: true, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + 'typeof x': { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: 'typeof', + argument: { + type: 'Identifier', + name: 'x', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + prefix: true, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + } + + }, + + 'Multiplicative Operators': { + + 'x * y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x / y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '/', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x % y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '%', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + } + + }, + + 'Additive Operators': { + + 'x + y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x - y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '-', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + } + + }, + + 'Bitwise Shift Operator': { + + 'x << y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '<<', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x >> y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '>>', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x >>> y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '>>>', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + } + + }, + + 'Relational Operators': { + + 'x < y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x > y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '>', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x <= y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '<=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x >= y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '>=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x in y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: 'in', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x instanceof y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: 'instanceof', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + 'x < y < z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + } + + }, + + 'Equality Operators': { + + 'x == y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '==', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x != y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '!=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x === y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '===', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x !== y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '!==', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + } + + }, + + 'Binary Bitwise Operators': { + + 'x & y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '&', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x ^ y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '^', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'x | y': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '|', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + } + + }, + + 'Binary Expressions': { + + 'x + y + z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x - y + z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'BinaryExpression', + operator: '-', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x + y - z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '-', + left: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x - y - z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '-', + left: { + type: 'BinaryExpression', + operator: '-', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x + y * z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x + y / z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '+', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'BinaryExpression', + operator: '/', + left: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x - y % z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '-', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'BinaryExpression', + operator: '%', + left: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x * y * z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x * y / z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '/', + left: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x * y % z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '%', + left: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x % y * z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'BinaryExpression', + operator: '%', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x << y << z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '<<', + left: { + type: 'BinaryExpression', + operator: '<<', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'x | y | z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '|', + left: { + type: 'BinaryExpression', + operator: '|', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x & y & z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '&', + left: { + type: 'BinaryExpression', + operator: '&', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x ^ y ^ z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '^', + left: { + type: 'BinaryExpression', + operator: '^', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x & y | z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '|', + left: { + type: 'BinaryExpression', + operator: '&', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x | y ^ z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '|', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'BinaryExpression', + operator: '^', + left: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x | y & z': { + type: 'ExpressionStatement', + expression: { + type: 'BinaryExpression', + operator: '|', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'BinaryExpression', + operator: '&', + left: { + type: 'Identifier', + name: 'y', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + } + + }, + + 'Binary Logical Operators': { + + 'x || y': { + type: 'ExpressionStatement', + expression: { + type: 'LogicalExpression', + operator: '||', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x && y': { + type: 'ExpressionStatement', + expression: { + type: 'LogicalExpression', + operator: '&&', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'x || y || z': { + type: 'ExpressionStatement', + expression: { + type: 'LogicalExpression', + operator: '||', + left: { + type: 'LogicalExpression', + operator: '||', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'x && y && z': { + type: 'ExpressionStatement', + expression: { + type: 'LogicalExpression', + operator: '&&', + left: { + type: 'LogicalExpression', + operator: '&&', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'x || y && z': { + type: 'ExpressionStatement', + expression: { + type: 'LogicalExpression', + operator: '||', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'LogicalExpression', + operator: '&&', + left: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + range: [5, 11], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'x || y ^ z': { + type: 'ExpressionStatement', + expression: { + type: 'LogicalExpression', + operator: '||', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'BinaryExpression', + operator: '^', + left: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'Identifier', + name: 'z', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + range: [5, 10], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 10 } + } + }, + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + } + + }, + + 'Conditional Operator': { + + 'y ? 1 : 2': { + type: 'ExpressionStatement', + expression: { + type: 'ConditionalExpression', + test: { + type: 'Identifier', + name: 'y', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + consequent: { + type: 'Literal', + value: 1, + raw: '1', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + alternate: { + type: 'Literal', + value: 2, + raw: '2', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x && y ? 1 : 2': { + type: 'ExpressionStatement', + expression: { + type: 'ConditionalExpression', + test: { + type: 'LogicalExpression', + operator: '&&', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + consequent: { + type: 'Literal', + value: 1, + raw: '1', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + alternate: { + type: 'Literal', + value: 2, + raw: '2', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + } + + }, + + 'Assignment Operators': { + + 'x = 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'eval = 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'eval', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [7, 9], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'arguments = 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'arguments', + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + 'x *= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '*=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x /= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '/=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x %= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '%=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x += 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '+=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x -= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '-=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x <<= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '<<=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + 'x >>= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '>>=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [6, 8], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + 'x >>>= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '>>>=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [7, 9], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'x &= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '&=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x ^= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '^=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + 'x |= 42': { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '|=', + left: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [5, 7], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + } + + }, + + 'Block': { + + '{ foo }': { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'foo', + range: [2, 5], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 5 } + } + }, + range: [2, 6], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 6 } + } + }], + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + '{ doThis(); doThat(); }': { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'doThis', + range: [2, 8], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 8 } + } + }, + 'arguments': [], + range: [2, 10], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 10 } + } + }, + range: [2, 11], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 11 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'doThat', + range: [12, 18], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 18 } + } + }, + 'arguments': [], + range: [12, 20], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 20 } + } + }, + range: [12, 21], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 21 } + } + }], + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + } + }, + + '{}': { + type: 'BlockStatement', + body: [], + range: [0, 2], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 2 } + } + } + + }, + + 'Variable Statement': { + + 'var x': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: null, + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }], + kind: 'var', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + 'var x, y;': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: null, + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'y', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + init: null, + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }], + kind: 'var', + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'var x = 42': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [8, 10], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 10 } + } + }, + range: [4, 10], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 10 } + } + }], + kind: 'var', + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + + 'var eval = 42, arguments = 42': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'eval', + range: [4, 8], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 8 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [11, 13], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 13 } + } + }, + range: [4, 13], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'arguments', + range: [15, 24], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 24 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [27, 29], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 29 } + } + }, + range: [15, 29], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 29 } + } + }], + kind: 'var', + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + + 'var x = 14, y = 3, z = 1977': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: { + type: 'Literal', + value: 14, + raw: '14', + range: [8, 10], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 10 } + } + }, + range: [4, 10], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 10 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'y', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }, + init: { + type: 'Literal', + value: 3, + raw: '3', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }, + range: [12, 17], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 17 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'z', + range: [19, 20], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 20 } + } + }, + init: { + type: 'Literal', + value: 1977, + raw: '1977', + range: [23, 27], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 27 } + } + }, + range: [19, 27], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 27 } + } + }], + kind: 'var', + range: [0, 27], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 27 } + } + }, + + 'var implements, interface, package': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'implements', + range: [4, 14], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 14 } + } + }, + init: null, + range: [4, 14], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 14 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'interface', + range: [16, 25], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 25 } + } + }, + init: null, + range: [16, 25], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 25 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'package', + range: [27, 34], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 34 } + } + }, + init: null, + range: [27, 34], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 34 } + } + }], + kind: 'var', + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + + 'var private, protected, public, static': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'private', + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + init: null, + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'protected', + range: [13, 22], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 22 } + } + }, + init: null, + range: [13, 22], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 22 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'public', + range: [24, 30], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 30 } + } + }, + init: null, + range: [24, 30], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 30 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'static', + range: [32, 38], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 38 } + } + }, + init: null, + range: [32, 38], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 38 } + } + }], + kind: 'var', + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + } + + }, + + 'Let Statement': { + + 'let x': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: null, + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }], + kind: 'let', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + + '{ let x }': { + type: 'BlockStatement', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + init: null, + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }], + kind: 'let', + range: [2, 8], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 8 } + } + }], + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + '{ let x = 42 }': { + type: 'BlockStatement', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }], + kind: 'let', + range: [2, 13], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 13 } + } + }], + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + + '{ let x = 14, y = 3, z = 1977 }': { + type: 'BlockStatement', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + init: { + type: 'Literal', + value: 14, + raw: '14', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'y', + range: [14, 15], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 15 } + } + }, + init: { + type: 'Literal', + value: 3, + raw: '3', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + range: [14, 19], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 19 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'z', + range: [21, 22], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 22 } + } + }, + init: { + type: 'Literal', + value: 1977, + raw: '1977', + range: [25, 29], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 29 } + } + }, + range: [21, 29], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 29 } + } + }], + kind: 'let', + range: [2, 30], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 30 } + } + }], + range: [0, 31], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 31 } + } + } + + }, + + 'Const Statement': { + + 'const x = 42': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }], + kind: 'const', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + + '{ const x = 42 }': { + type: 'BlockStatement', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + } + }, + range: [8, 14], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 14 } + } + }], + kind: 'const', + range: [2, 15], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 15 } + } + }], + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + + '{ const x = 14, y = 3, z = 1977 }': { + type: 'BlockStatement', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + init: { + type: 'Literal', + value: 14, + raw: '14', + range: [12, 14], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 14 } + } + }, + range: [8, 14], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 14 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'y', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }, + init: { + type: 'Literal', + value: 3, + raw: '3', + range: [20, 21], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 21 } + } + }, + range: [16, 21], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 21 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'z', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }, + init: { + type: 'Literal', + value: 1977, + raw: '1977', + range: [27, 31], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 31 } + } + }, + range: [23, 31], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 31 } + } + }], + kind: 'const', + range: [2, 32], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 32 } + } + }], + range: [0, 33], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 33 } + } + } + + }, + + 'Empty Statement': { + + ';': { + type: 'EmptyStatement', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + } + + }, + + 'Expression Statement': { + + 'x': { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + + 'x, y': { + type: 'ExpressionStatement', + expression: { + type: 'SequenceExpression', + expressions: [{ + type: 'Identifier', + name: 'x', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, { + type: 'Identifier', + name: 'y', + range: [3, 4], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 4 } + } + }], + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + + '\\u0061': { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'a', + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }, + + 'a\\u0061': { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'aa', + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 7], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 7 } + } + }, + + '\\ua': { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'ua', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + + 'a\\u': { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'au', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + } + + }, + + 'If Statement': { + + 'if (morning) goodMorning()': { + type: 'IfStatement', + test: { + type: 'Identifier', + name: 'morning', + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + consequent: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'goodMorning', + range: [13, 24], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 24 } + } + }, + 'arguments': [], + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + }, + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + }, + alternate: null, + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + } + }, + + 'if (morning) (function(){})': { + type: 'IfStatement', + test: { + type: 'Identifier', + name: 'morning', + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + consequent: { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [24, 26], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 26 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 26], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 26 } + } + }, + range: [13, 27], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 27 } + } + }, + alternate: null, + range: [0, 27], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 27 } + } + }, + + 'if (morning) var x = 0;': { + type: 'IfStatement', + test: { + type: 'Identifier', + name: 'morning', + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + consequent: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [17, 18], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 18 } + } + }, + init: { + type: 'Literal', + value: 0, + raw: '0', + range: [21, 22], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 22 } + } + }, + range: [17, 22], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 22 } + } + }], + kind: 'var', + range: [13, 23], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 23 } + } + }, + alternate: null, + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + } + }, + + 'if (morning) function a(){}': { + type: 'IfStatement', + test: { + type: 'Identifier', + name: 'morning', + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + consequent: { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'a', + range: [22, 23], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 23 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [25, 27], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 27 } + } + }, + rest: null, + generator: false, + expression: false, + range: [13, 27], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 27 } + } + }, + alternate: null, + range: [0, 27], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 27 } + } + }, + + 'if (morning) goodMorning(); else goodDay()': { + type: 'IfStatement', + test: { + type: 'Identifier', + name: 'morning', + range: [4, 11], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 11 } + } + }, + consequent: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'goodMorning', + range: [13, 24], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 24 } + } + }, + 'arguments': [], + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + }, + range: [13, 27], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 27 } + } + }, + alternate: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'goodDay', + range: [33, 40], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 40 } + } + }, + 'arguments': [], + range: [33, 42], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 42 } + } + }, + range: [33, 42], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 42 } + } + }, + range: [0, 42], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 42 } + } + } + + }, + + 'Iteration Statements': { + + 'do keep(); while (true)': { + type: 'DoWhileStatement', + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'keep', + range: [3, 7], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 7 } + } + }, + 'arguments': [], + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + } + }, + range: [3, 10], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 10 } + } + }, + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [18, 22], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + } + }, + + 'do keep(); while (true);': { + type: 'DoWhileStatement', + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'keep', + range: [3, 7], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 7 } + } + }, + 'arguments': [], + range: [3, 9], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 9 } + } + }, + range: [3, 10], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 10 } + } + }, + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [18, 22], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + + 'do { x++; y--; } while (x < 10)': { + type: 'DoWhileStatement', + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'x', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + prefix: false, + range: [5, 8], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 8 } + } + }, + range: [5, 9], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 9 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'y', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + prefix: false, + range: [10, 13], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 13 } + } + }, + range: [10, 14], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 14 } + } + }], + range: [3, 16], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 16 } + } + }, + test: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + right: { + type: 'Literal', + value: 10, + raw: '10', + range: [28, 30], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 30 } + } + }, + range: [24, 30], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 30 } + } + }, + range: [0, 31], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 31 } + } + }, + + '{ do { } while (false) false }': { + type: 'BlockStatement', + body: [{ + type: 'DoWhileStatement', + body: { + type: 'BlockStatement', + body: [], + range: [5, 8], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 8 } + } + }, + test: { + type: 'Literal', + value: false, + raw: 'false', + range: [16, 21], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 21 } + } + }, + range: [2, 22], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 22 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: false, + raw: 'false', + range: [23, 28], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 28 } + } + }, + range: [23, 29], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 29 } + } + }], + range: [0, 30], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 30 } + } + }, + + 'while (true) doSomething()': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'doSomething', + range: [13, 24], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 24 } + } + }, + 'arguments': [], + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + }, + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + }, + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + } + }, + + 'while (x < 10) { x++; y--; }': { + type: 'WhileStatement', + test: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + right: { + type: 'Literal', + value: 10, + raw: '10', + range: [11, 13], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 13 } + } + }, + range: [7, 13], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 13 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'x', + range: [17, 18], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 18 } + } + }, + prefix: false, + range: [17, 20], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 20 } + } + }, + range: [17, 21], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 21 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'y', + range: [22, 23], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 23 } + } + }, + prefix: false, + range: [22, 25], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 25 } + } + }, + range: [22, 26], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 26 } + } + }], + range: [15, 28], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 28 } + } + }, + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + } + }, + + 'for(;;);': { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: { + type: 'EmptyStatement', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + 'for(;;){}': { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: { + type: 'BlockStatement', + body: [], + range: [7, 9], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 9 } + } + }, + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + }, + + 'for(x = 0;;);': { + type: 'ForStatement', + init: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Literal', + value: 0, + raw: '0', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + test: null, + update: null, + body: { + type: 'EmptyStatement', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + 'for(var x = 0;;);': { + type: 'ForStatement', + init: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + init: { + type: 'Literal', + value: 0, + raw: '0', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }, + range: [8, 13], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 13 } + } + }], + kind: 'var', + range: [4, 13], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 13 } + } + }, + test: null, + update: null, + body: { + type: 'EmptyStatement', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + + 'for(let x = 0;;);': { + type: 'ForStatement', + init: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + init: { + type: 'Literal', + value: 0, + raw: '0', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }, + range: [8, 13], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 13 } + } + }], + kind: 'let', + range: [4, 13], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 13 } + } + }, + test: null, + update: null, + body: { + type: 'EmptyStatement', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }, + + 'for(var x = 0, y = 1;;);': { + type: 'ForStatement', + init: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + init: { + type: 'Literal', + value: 0, + raw: '0', + range: [12, 13], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 13 } + } + }, + range: [8, 13], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'y', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }, + init: { + type: 'Literal', + value: 1, + raw: '1', + range: [19, 20], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 20 } + } + }, + range: [15, 20], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 20 } + } + }], + kind: 'var', + range: [4, 20], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 20 } + } + }, + test: null, + update: null, + body: { + type: 'EmptyStatement', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + + 'for(x = 0; x < 42;);': { + type: 'ForStatement', + init: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Literal', + value: 0, + raw: '0', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + test: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [11, 12], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 12 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + range: [11, 17], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 17 } + } + }, + update: null, + body: { + type: 'EmptyStatement', + range: [19, 20], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 20 } + } + }, + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + + 'for(x = 0; x < 42; x++);': { + type: 'ForStatement', + init: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Literal', + value: 0, + raw: '0', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + test: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [11, 12], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 12 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + range: [11, 17], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 17 } + } + }, + update: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'x', + range: [19, 20], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 20 } + } + }, + prefix: false, + range: [19, 22], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 22 } + } + }, + body: { + type: 'EmptyStatement', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + + 'for(x = 0; x < 42; x++) process(x);': { + type: 'ForStatement', + init: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Literal', + value: 0, + raw: '0', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + test: { + type: 'BinaryExpression', + operator: '<', + left: { + type: 'Identifier', + name: 'x', + range: [11, 12], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 12 } + } + }, + right: { + type: 'Literal', + value: 42, + raw: '42', + range: [15, 17], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 17 } + } + }, + range: [11, 17], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 17 } + } + }, + update: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'x', + range: [19, 20], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 20 } + } + }, + prefix: false, + range: [19, 22], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 22 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [24, 31], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 31 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [32, 33], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 33 } + } + }], + range: [24, 34], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 34 } + } + }, + range: [24, 35], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 35 } + } + }, + range: [0, 35], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 35 } + } + }, + + 'for(x in list) process(x);': { + type: 'ForInStatement', + left: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + right: { + type: 'Identifier', + name: 'list', + range: [9, 13], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 13 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [15, 22], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 22 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }], + range: [15, 25], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 25 } + } + }, + range: [15, 26], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 26 } + } + }, + each: false, + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + } + }, + + 'for (var x in list) process(x);': { + type: 'ForInStatement', + left: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + init: null, + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }], + kind: 'var', + range: [5, 10], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 10 } + } + }, + right: { + type: 'Identifier', + name: 'list', + range: [14, 18], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 18 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [20, 27], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 27 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [28, 29], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 29 } + } + }], + range: [20, 30], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 30 } + } + }, + range: [20, 31], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 31 } + } + }, + each: false, + range: [0, 31], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 31 } + } + }, + + 'for (var x = 42 in list) process(x);': { + type: 'ForInStatement', + left: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [13, 15], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 15 } + } + }, + range: [9, 15], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 15 } + } + }], + kind: 'var', + range: [5, 15], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 15 } + } + }, + right: { + type: 'Identifier', + name: 'list', + range: [19, 23], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 23 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [25, 32], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 32 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [33, 34], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 34 } + } + }], + range: [25, 35], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 35 } + } + }, + range: [25, 36], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 36 } + } + }, + each: false, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + + 'for (let x in list) process(x);': { + type: 'ForInStatement', + left: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + init: null, + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }], + kind: 'let', + range: [5, 10], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 10 } + } + }, + right: { + type: 'Identifier', + name: 'list', + range: [14, 18], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 18 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [20, 27], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 27 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [28, 29], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 29 } + } + }], + range: [20, 30], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 30 } + } + }, + range: [20, 31], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 31 } + } + }, + each: false, + range: [0, 31], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 31 } + } + }, + + 'for (let x = 42 in list) process(x);': { + type: 'ForInStatement', + left: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + init: { + type: 'Literal', + value: 42, + raw: '42', + range: [13, 15], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 15 } + } + }, + range: [9, 15], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 15 } + } + }], + kind: 'let', + range: [5, 15], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 15 } + } + }, + right: { + type: 'Identifier', + name: 'list', + range: [19, 23], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 23 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [25, 32], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 32 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [33, 34], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 34 } + } + }], + range: [25, 35], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 35 } + } + }, + range: [25, 36], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 36 } + } + }, + each: false, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + + 'for (var i = function() { return 10 in [] } in list) process(x);': { + type: 'ForInStatement', + left: { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'i', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + init: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ReturnStatement', + argument: { + type: 'BinaryExpression', + operator: 'in', + left: { + type: 'Literal', + value: 10, + raw: '10', + range: [33, 35], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 35 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [39, 41], + loc: { + start: { line: 1, column: 39 }, + end: { line: 1, column: 41 } + } + }, + range: [33, 41], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 41 } + } + }, + range: [26, 42], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 42 } + } + }], + range: [24, 43], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 43 } + } + }, + rest: null, + generator: false, + expression: false, + range: [13, 43], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 43 } + } + }, + range: [9, 43], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 43 } + } + }], + kind: 'var', + range: [5, 43], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 43 } + } + }, + right: { + type: 'Identifier', + name: 'list', + range: [47, 51], + loc: { + start: { line: 1, column: 47 }, + end: { line: 1, column: 51 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'process', + range: [53, 60], + loc: { + start: { line: 1, column: 53 }, + end: { line: 1, column: 60 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'x', + range: [61, 62], + loc: { + start: { line: 1, column: 61 }, + end: { line: 1, column: 62 } + } + }], + range: [53, 63], + loc: { + start: { line: 1, column: 53 }, + end: { line: 1, column: 63 } + } + }, + range: [53, 64], + loc: { + start: { line: 1, column: 53 }, + end: { line: 1, column: 64 } + } + }, + each: false, + range: [0, 64], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 64 } + } + } + + }, + + 'continue statement': { + + 'while (true) { continue; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'ContinueStatement', + label: null, + range: [15, 24], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 24 } + } + } + ], + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + }, + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + } + }, + + 'while (true) { continue }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'ContinueStatement', + label: null, + range: [15, 24], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 24 } + } + } + ], + range: [13, 25], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 25 } + } + }, + range: [0, 25], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 25 } + } + }, + + 'done: while (true) { continue done }': { + type: 'LabeledStatement', + label: { + type: 'Identifier', + name: 'done', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + body: { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [13, 17], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 17 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'ContinueStatement', + label: { + type: 'Identifier', + name: 'done', + range: [30, 34], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 34 } + } + }, + range: [21, 35], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 35 } + } + } + ], + range: [19, 36], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 36 } + } + }, + range: [6, 36], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + } + }, + + 'done: while (true) { continue done; }': { + type: 'LabeledStatement', + label: { + type: 'Identifier', + name: 'done', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + body: { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [13, 17], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 17 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'ContinueStatement', + label: { + type: 'Identifier', + name: 'done', + range: [30, 34], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 34 } + } + }, + range: [21, 35], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 35 } + } + } + ], + range: [19, 37], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 37 } + } + }, + range: [6, 37], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 37 } + } + }, + range: [0, 37], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 37 } + } + } + + }, + + 'break statement': { + + 'while (true) { break }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'BreakStatement', + label: null, + range: [15, 21], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 21 } + } + } + ], + range: [13, 22], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + + 'done: while (true) { break done }': { + type: 'LabeledStatement', + label: { + type: 'Identifier', + name: 'done', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + body: { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [13, 17], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 17 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'BreakStatement', + label: { + type: 'Identifier', + name: 'done', + range: [27, 31], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 31 } + } + }, + range: [21, 32], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 32 } + } + } + ], + range: [19, 33], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 33 } + } + }, + range: [6, 33], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 33 } + } + }, + range: [0, 33], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 33 } + } + }, + + 'done: while (true) { break done; }': { + type: 'LabeledStatement', + label: { + type: 'Identifier', + name: 'done', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + body: { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [13, 17], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 17 } + } + }, + body: { + type: 'BlockStatement', + body: [ + { + type: 'BreakStatement', + label: { + type: 'Identifier', + name: 'done', + range: [27, 31], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 31 } + } + }, + range: [21, 32], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 32 } + } + } + ], + range: [19, 34], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 34 } + } + }, + range: [6, 34], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 34 } + } + }, + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + } + + }, + + 'return statement': { + + '(function(){ return })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: null, + range: [13, 20], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 20 } + } + } + ], + range: [11, 21], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 21 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 21], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 21 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + }, + + '(function(){ return; })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: null, + range: [13, 20], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 20 } + } + } + ], + range: [11, 22], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 22 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 22], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + } + }, + + '(function(){ return x; })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: { + type: 'Identifier', + name: 'x', + range: [20, 21], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 21 } + } + }, + range: [13, 22], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 22 } + } + } + ], + range: [11, 24], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 24 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 24], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 24 } + } + }, + range: [0, 25], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 25 } + } + }, + + '(function(){ return x * y })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [20, 21], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 21 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + range: [20, 25], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 25 } + } + }, + range: [13, 26], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 26 } + } + } + ], + range: [11, 27], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 27 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 27], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 27 } + } + }, + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + } + } + }, + + 'with statement': { + + 'with (x) foo = bar': { + type: 'WithStatement', + object: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'foo', + range: [9, 12], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 12 } + } + }, + right: { + type: 'Identifier', + name: 'bar', + range: [15, 18], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 18 } + } + }, + range: [9, 18], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 18 } + } + }, + range: [9, 18], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 18 } + } + }, + range: [0, 18], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 18 } + } + }, + + 'with (x) foo = bar;': { + type: 'WithStatement', + object: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + body: { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'foo', + range: [9, 12], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 12 } + } + }, + right: { + type: 'Identifier', + name: 'bar', + range: [15, 18], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 18 } + } + }, + range: [9, 18], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 18 } + } + }, + range: [9, 19], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 19 } + } + }, + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + } + }, + + 'with (x) { foo = bar }': { + type: 'WithStatement', + object: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'foo', + range: [11, 14], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 14 } + } + }, + right: { + type: 'Identifier', + name: 'bar', + range: [17, 20], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 20 } + } + }, + range: [11, 20], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 20 } + } + }, + range: [11, 21], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 21 } + } + }], + range: [9, 22], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 22 } + } + }, + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + } + } + + }, + + 'switch statement': { + + 'switch (x) {}': { + type: 'SwitchStatement', + discriminant: { + type: 'Identifier', + name: 'x', + range: [8, 9], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 9 } + } + }, + cases:[], + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, + + 'switch (answer) { case 42: hi(); break; }': { + type: 'SwitchStatement', + discriminant: { + type: 'Identifier', + name: 'answer', + range: [8, 14], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 14 } + } + }, + cases: [{ + type: 'SwitchCase', + test: { + type: 'Literal', + value: 42, + raw: '42', + range: [23, 25], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 25 } + } + }, + consequent: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'hi', + range: [27, 29], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 29 } + } + }, + 'arguments': [], + range: [27, 31], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 31 } + } + }, + range: [27, 32], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 32 } + } + }, { + type: 'BreakStatement', + label: null, + range: [33, 39], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 39 } + } + }], + range: [18, 39], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 39 } + } + }], + range: [0, 41], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 41 } + } + }, + + 'switch (answer) { case 42: hi(); break; default: break }': { + type: 'SwitchStatement', + discriminant: { + type: 'Identifier', + name: 'answer', + range: [8, 14], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 14 } + } + }, + cases: [{ + type: 'SwitchCase', + test: { + type: 'Literal', + value: 42, + raw: '42', + range: [23, 25], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 25 } + } + }, + consequent: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'hi', + range: [27, 29], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 29 } + } + }, + 'arguments': [], + range: [27, 31], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 31 } + } + }, + range: [27, 32], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 32 } + } + }, { + type: 'BreakStatement', + label: null, + range: [33, 39], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 39 } + } + }], + range: [18, 39], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 39 } + } + }, { + type: 'SwitchCase', + test: null, + consequent: [{ + type: 'BreakStatement', + label: null, + range: [49, 55], + loc: { + start: { line: 1, column: 49 }, + end: { line: 1, column: 55 } + } + }], + range: [40, 55], + loc: { + start: { line: 1, column: 40 }, + end: { line: 1, column: 55 } + } + }], + range: [0, 56], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 56 } + } + } + + }, + + 'Labelled Statements': { + + 'start: for (;;) break start': { + type: 'LabeledStatement', + label: { + type: 'Identifier', + name: 'start', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + body: { + type: 'ForStatement', + init: null, + test: null, + update: null, + body: { + type: 'BreakStatement', + label: { + type: 'Identifier', + name: 'start', + range: [22, 27], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 27 } + } + }, + range: [16, 27], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 27 } + } + }, + range: [7, 27], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 27 } + } + }, + range: [0, 27], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 27 } + } + }, + + 'start: while (true) break start': { + type: 'LabeledStatement', + label: { + type: 'Identifier', + name: 'start', + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + body: { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [14, 18], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 18 } + } + }, + body: { + type: 'BreakStatement', + label: { + type: 'Identifier', + name: 'start', + range: [26, 31], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 31 } + } + }, + range: [20, 31], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 31 } + } + }, + range: [7, 31], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 31 } + } + }, + range: [0, 31], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 31 } + } + } + + }, + + 'throw statement': { + + 'throw x;': { + type: 'ThrowStatement', + argument: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + range: [0, 8], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 8 } + } + }, + + 'throw x * y': { + type: 'ThrowStatement', + argument: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + right: { + type: 'Identifier', + name: 'y', + range: [10, 11], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 11 } + } + }, + range: [6, 11], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 11 } + } + }, + range: [0, 11], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 11 } + } + }, + + 'throw { message: "Error" }': { + type: 'ThrowStatement', + argument: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'message', + range: [8, 15], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 15 } + } + }, + value: { + type: 'Literal', + value: 'Error', + raw: '"Error"', + range: [17, 24], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 24 } + } + }, + kind: 'init', + range: [8, 24], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 24 } + } + }], + range: [6, 26], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 26 } + } + }, + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + } + } + + }, + + 'try statement': { + + 'try { } catch (e) { }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'e', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }, + body: { + type: 'BlockStatement', + body: [], + range: [18, 21], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 21 } + } + }, + range: [8, 21], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 21 } + } + }], + finalizer: null, + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + } + }, + + 'try { } catch (eval) { }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'eval', + range: [15, 19], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 19 } + } + }, + body: { + type: 'BlockStatement', + body: [], + range: [21, 24], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 24 } + } + }, + range: [8, 24], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 24 } + } + }], + finalizer: null, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + + 'try { } catch (arguments) { }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'arguments', + range: [15, 24], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 24 } + } + }, + body: { + type: 'BlockStatement', + body: [], + range: [26, 29], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 29 } + } + }, + range: [8, 29], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 29 } + } + }], + finalizer: null, + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + + 'try { } catch (e) { say(e) }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'e', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'say', + range: [20, 23], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 23 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'e', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }], + range: [20, 26], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 26 } + } + }, + range: [20, 27], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 27 } + } + }], + range: [18, 28], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 28 } + } + }, + range: [8, 28], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 28 } + } + }], + finalizer: null, + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + } + }, + + 'try { } finally { cleanup(stuff) }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [4, 7], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 7 } + } + }, + guardedHandlers: [], + handlers: [], + finalizer: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'cleanup', + range: [18, 25], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 25 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'stuff', + range: [26, 31], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 31 } + } + }], + range: [18, 32], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 32 } + } + }, + range: [18, 33], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 33 } + } + }], + range: [16, 34], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 34 } + } + }, + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + + 'try { doThat(); } catch (e) { say(e) }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'doThat', + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }, + 'arguments': [], + range: [6, 14], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 14 } + } + }, + range: [6, 15], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 15 } + } + }], + range: [4, 17], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 17 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'e', + range: [25, 26], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 26 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'say', + range: [30, 33], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 33 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'e', + range: [34, 35], + loc: { + start: { line: 1, column: 34 }, + end: { line: 1, column: 35 } + } + }], + range: [30, 36], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 36 } + } + }, + range: [30, 37], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 37 } + } + }], + range: [28, 38], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 38 } + } + }, + range: [18, 38], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 38 } + } + }], + finalizer: null, + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + }, + + 'try { doThat(); } catch (e) { say(e) } finally { cleanup(stuff) }': { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'doThat', + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }, + 'arguments': [], + range: [6, 14], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 14 } + } + }, + range: [6, 15], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 15 } + } + }], + range: [4, 17], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 17 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'e', + range: [25, 26], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 26 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'say', + range: [30, 33], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 33 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'e', + range: [34, 35], + loc: { + start: { line: 1, column: 34 }, + end: { line: 1, column: 35 } + } + }], + range: [30, 36], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 36 } + } + }, + range: [30, 37], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 37 } + } + }], + range: [28, 38], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 38 } + } + }, + range: [18, 38], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 38 } + } + }], + finalizer: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'cleanup', + range: [49, 56], + loc: { + start: { line: 1, column: 49 }, + end: { line: 1, column: 56 } + } + }, + 'arguments': [{ + type: 'Identifier', + name: 'stuff', + range: [57, 62], + loc: { + start: { line: 1, column: 57 }, + end: { line: 1, column: 62 } + } + }], + range: [49, 63], + loc: { + start: { line: 1, column: 49 }, + end: { line: 1, column: 63 } + } + }, + range: [49, 64], + loc: { + start: { line: 1, column: 49 }, + end: { line: 1, column: 64 } + } + }], + range: [47, 65], + loc: { + start: { line: 1, column: 47 }, + end: { line: 1, column: 65 } + } + }, + range: [0, 65], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 65 } + } + } + + }, + + 'debugger statement': { + + 'debugger;': { + type: 'DebuggerStatement', + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 9 } + } + } + + }, + + 'Function Definition': { + + 'function hello() { sayHi(); }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'hello', + range: [9, 14], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 14 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'sayHi', + range: [19, 24], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 24 } + } + }, + 'arguments': [], + range: [19, 26], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 26 } + } + }, + range: [19, 27], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 27 } + } + }], + range: [17, 29], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 29 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + + 'function eval() { }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'eval', + range: [9, 13], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 13 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [16, 19], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 19 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + } + }, + + 'function arguments() { }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'arguments', + range: [9, 18], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 18 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [21, 24], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 24 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + } + }, + + 'function test(t, t) { }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'test', + range: [9, 13], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 13 } + } + }, + params: [{ + type: 'Identifier', + name: 't', + range: [14, 15], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 15 } + } + }, { + type: 'Identifier', + name: 't', + range: [17, 18], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 18 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [20, 23], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 23 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + } + }, + + '(function test(t, t) { })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'test', + range: [10, 14], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 14 } + } + }, + params: [{ + type: 'Identifier', + name: 't', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }, { + type: 'Identifier', + name: 't', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [21, 24], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 24 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 24], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 24 } + } + }, + range: [0, 25], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 25 } + } + }, + + 'function eval() { function inner() { "use strict" } }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'eval', + range: [9, 13], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 13 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'inner', + range: [27, 32], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 32 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '\"use strict\"', + range: [37, 49], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 49 } + } + }, + range: [37, 50], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 50 } + } + }], + range: [35, 51], + loc: { + start: { line: 1, column: 35 }, + end: { line: 1, column: 51 } + } + }, + rest: null, + generator: false, + expression: false, + range: [18, 51], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 51 } + } + }], + range: [16, 53], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 53 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 53], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 53 } + } + }, + + 'function hello(a) { sayHi(); }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'hello', + range: [9, 14], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 14 } + } + }, + params: [{ + type: 'Identifier', + name: 'a', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'sayHi', + range: [20, 25], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 25 } + } + }, + 'arguments': [], + range: [20, 27], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 27 } + } + }, + range: [20, 28], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 28 } + } + }], + range: [18, 30], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 30 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 30], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 30 } + } + }, + + 'function hello(a, b) { sayHi(); }': { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'hello', + range: [9, 14], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 14 } + } + }, + params: [{ + type: 'Identifier', + name: 'a', + range: [15, 16], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 16 } + } + }, { + type: 'Identifier', + name: 'b', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'sayHi', + range: [23, 28], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 28 } + } + }, + 'arguments': [], + range: [23, 30], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 30 } + } + }, + range: [23, 31], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 31 } + } + }], + range: [21, 33], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 33 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 33], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 33 } + } + }, + + 'var hi = function() { sayHi() };': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'hi', + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + init: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'sayHi', + range: [22, 27], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 27 } + } + }, + 'arguments': [], + range: [22, 29], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 29 } + } + }, + range: [22, 30], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 30 } + } + }], + range: [20, 31], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 31 } + } + }, + rest: null, + generator: false, + expression: false, + range: [9, 31], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 31 } + } + }, + range: [4, 31], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 31 } + } + }], + kind: 'var', + range: [0, 32], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 32 } + } + }, + + 'var hi = function eval() { };': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'hi', + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + init: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'eval', + range: [18, 22], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 22 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [25, 28], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 28 } + } + }, + rest: null, + generator: false, + expression: false, + range: [9, 28], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 28 } + } + }, + range: [4, 28], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 28 } + } + }], + kind: 'var', + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 29 } + } + }, + + 'var hi = function arguments() { };': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'hi', + range: [4, 6], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 6 } + } + }, + init: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'arguments', + range: [18, 27], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 27 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [30, 33], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 33 } + } + }, + rest: null, + generator: false, + expression: false, + range: [9, 33], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 33 } + } + }, + range: [4, 33], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 33 } + } + }], + kind: 'var', + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + } + }, + + 'var hello = function hi() { sayHi() };': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'hello', + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }, + init: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'hi', + range: [21, 23], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 23 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'sayHi', + range: [28, 33], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 33 } + } + }, + 'arguments': [], + range: [28, 35], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 35 } + } + }, + range: [28, 36], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 36 } + } + }], + range: [26, 37], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 37 } + } + }, + rest: null, + generator: false, + expression: false, + range: [12, 37], + loc: { + start: { line: 1, column: 12 }, + end: { line: 1, column: 37 } + } + }, + range: [4, 37], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 37 } + } + }], + kind: 'var', + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + } + }, + + '(function(){})': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [11, 13], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 13 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 13], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 13 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + } + + }, + + 'Automatic semicolon insertion': { + + '{ x\n++y }': { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'x', + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + } + }, + range: [2, 4], + loc: { + start: { line: 1, column: 2 }, + end: { line: 2, column: 0 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'y', + range: [6, 7], + loc: { + start: { line: 2, column: 2 }, + end: { line: 2, column: 3 } + } + }, + prefix: true, + range: [4, 7], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 3 } + } + }, + range: [4, 8], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 4 } + } + }], + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 5 } + } + }, + + '{ x\n--y }': { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'x', + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + } + }, + range: [2, 4], + loc: { + start: { line: 1, column: 2 }, + end: { line: 2, column: 0 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'y', + range: [6, 7], + loc: { + start: { line: 2, column: 2 }, + end: { line: 2, column: 3 } + } + }, + prefix: true, + range: [4, 7], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 3 } + } + }, + range: [4, 8], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 4 } + } + }], + range: [0, 9], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 5 } + } + }, + + 'var x /* comment */;': { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + init: null, + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }], + kind: 'var', + range: [0, 20], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 20 } + } + }, + + '{ var x = 14, y = 3\nz; }': { + type: 'BlockStatement', + body: [{ + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [6, 7], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 7 } + } + }, + init: { + type: 'Literal', + value: 14, + raw: '14', + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + range: [6, 12], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 12 } + } + }, { + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'y', + range: [14, 15], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 15 } + } + }, + init: { + type: 'Literal', + value: 3, + raw: '3', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + range: [14, 19], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 19 } + } + }], + kind: 'var', + range: [2, 20], + loc: { + start: { line: 1, column: 2 }, + end: { line: 2, column: 0 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'z', + range: [20, 21], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 1 } + } + }, + range: [20, 22], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + }], + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 4 } + } + }, + + 'while (true) { continue\nthere; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ContinueStatement', + label: null, + range: [15, 23], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 23 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'there', + range: [24, 29], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 5 } + } + }, + range: [24, 30], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }], + range: [13, 32], + loc: { + start: { line: 1, column: 13 }, + end: { line: 2, column: 8 } + } + }, + range: [0, 32], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 8 } + } + }, + + 'while (true) { continue // Comment\nthere; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ContinueStatement', + label: null, + range: [15, 23], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 23 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'there', + range: [35, 40], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 5 } + } + }, + range: [35, 41], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }], + range: [13, 43], + loc: { + start: { line: 1, column: 13 }, + end: { line: 2, column: 8 } + } + }, + range: [0, 43], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 8 } + } + }, + + 'while (true) { continue /* Multiline\nComment */there; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'ContinueStatement', + label: null, + range: [15, 23], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 23 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'there', + range: [47, 52], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 15 } + } + }, + range: [47, 53], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 16 } + } + }], + range: [13, 55], + loc: { + start: { line: 1, column: 13 }, + end: { line: 2, column: 18 } + } + }, + range: [0, 55], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 18 } + } + }, + + 'while (true) { break\nthere; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'BreakStatement', + label: null, + range: [15, 20], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 20 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'there', + range: [21, 26], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 5 } + } + }, + range: [21, 27], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }], + range: [13, 29], + loc: { + start: { line: 1, column: 13 }, + end: { line: 2, column: 8 } + } + }, + range: [0, 29], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 8 } + } + }, + + 'while (true) { break // Comment\nthere; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'BreakStatement', + label: null, + range: [15, 20], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 20 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'there', + range: [32, 37], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 5 } + } + }, + range: [32, 38], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }], + range: [13, 40], + loc: { + start: { line: 1, column: 13 }, + end: { line: 2, column: 8 } + } + }, + range: [0, 40], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 8 } + } + }, + + 'while (true) { break /* Multiline\nComment */there; }': { + type: 'WhileStatement', + test: { + type: 'Literal', + value: true, + raw: 'true', + range: [7, 11], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 11 } + } + }, + body: { + type: 'BlockStatement', + body: [{ + type: 'BreakStatement', + label: null, + range: [15, 20], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 20 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'there', + range: [44, 49], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 15 } + } + }, + range: [44, 50], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 16 } + } + }], + range: [13, 52], + loc: { + start: { line: 1, column: 13 }, + end: { line: 2, column: 18 } + } + }, + range: [0, 52], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 18 } + } + }, + + '(function(){ return\nx; })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: null, + range: [13, 19], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 19 } + } + }, + { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'x', + range: [20, 21], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 1 } + } + }, + range: [20, 22], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + } + ], + range: [11, 24], + loc: { + start: { line: 1, column: 11 }, + end: { line: 2, column: 4 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 24], + loc: { + start: { line: 1, column: 1 }, + end: { line: 2, column: 4 } + } + }, + range: [0, 25], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 5 } + } + }, + + '(function(){ return // Comment\nx; })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: null, + range: [13, 19], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 19 } + } + }, + { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'x', + range: [31, 32], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 1 } + } + }, + range: [31, 33], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 2 } + } + } + ], + range: [11, 35], + loc: { + start: { line: 1, column: 11 }, + end: { line: 2, column: 4 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 35], + loc: { + start: { line: 1, column: 1 }, + end: { line: 2, column: 4 } + } + }, + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 5 } + } + }, + + '(function(){ return/* Multiline\nComment */x; })': { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [ + { + type: 'ReturnStatement', + argument: null, + range: [13, 19], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 19 } + } + }, + { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'x', + range: [42, 43], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 11 } + } + }, + range: [42, 44], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 12 } + } + } + ], + range: [11, 46], + loc: { + start: { line: 1, column: 11 }, + end: { line: 2, column: 14 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 46], + loc: { + start: { line: 1, column: 1 }, + end: { line: 2, column: 14 } + } + }, + range: [0, 47], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 15 } + } + }, + + '{ throw error\nerror; }': { + type: 'BlockStatement', + body: [{ + type: 'ThrowStatement', + argument: { + type: 'Identifier', + name: 'error', + range: [8, 13], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 13 } + } + }, + range: [2, 14], + loc: { + start: { line: 1, column: 2 }, + end: { line: 2, column: 0 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'error', + range: [14, 19], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 5 } + } + }, + range: [14, 20], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }], + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 8 } + } + }, + + '{ throw error// Comment\nerror; }': { + type: 'BlockStatement', + body: [{ + type: 'ThrowStatement', + argument: { + type: 'Identifier', + name: 'error', + range: [8, 13], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 13 } + } + }, + range: [2, 24], + loc: { + start: { line: 1, column: 2 }, + end: { line: 2, column: 0 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'error', + range: [24, 29], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 5 } + } + }, + range: [24, 30], + loc: { + start: { line: 2, column: 0 }, + end: { line: 2, column: 6 } + } + }], + range: [0, 32], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 8 } + } + }, + + '{ throw error/* Multiline\nComment */error; }': { + type: 'BlockStatement', + body: [{ + type: 'ThrowStatement', + argument: { + type: 'Identifier', + name: 'error', + range: [8, 13], + loc: { + start: { line: 1, column: 8 }, + end: { line: 1, column: 13 } + } + }, + range: [2, 36], + loc: { + start: { line: 1, column: 2 }, + end: { line: 2, column: 10 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'error', + range: [36, 41], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 15 } + } + }, + range: [36, 42], + loc: { + start: { line: 2, column: 10 }, + end: { line: 2, column: 16 } + } + }], + range: [0, 44], + loc: { + start: { line: 1, column: 0 }, + end: { line: 2, column: 18 } + } + } + + }, + + 'Source elements': { + + '': { + type: 'Program', + body: [], + range: [0, 0], + loc: { + start: { line: 0, column: 0 }, + end: { line: 0, column: 0 } + }, + tokens: [] + } + }, + + 'Invalid syntax': { + + '{': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected end of input' + }, + + '}': { + index: 0, + lineNumber: 1, + column: 1, + message: 'Error: Line 1: Unexpected token }' + }, + + '3ea': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3in []': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3e': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3e+': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3e-': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3x': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3x0': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '0x': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '09': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '018': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '01a': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '3in[]': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '0x3in[]': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '"Hello\nWorld"': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'x\\': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'x\\u005c': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'x\\u002a': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'var x = /(s/g': { + index: 13, + lineNumber: 1, + column: 14, + message: 'Error: Line 1: Invalid regular expression' + }, + + '/': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Invalid regular expression: missing /' + }, + + '/test': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Invalid regular expression: missing /' + }, + + 'var x = /[a-z]/\\ux': { + index: 18, + lineNumber: 1, + column: 19, + message: 'Error: Line 1: Invalid regular expression' + }, + + '3 = 4': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + 'func() = 4': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '(1 + 1) = 10': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '1++': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '1--': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '++1': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '--1': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + 'for((1 + 1) in list) process(x);': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Invalid left-hand side in for-in' + }, + + '[': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected end of input' + }, + + '[,': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected end of input' + }, + + '1 + {': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Unexpected end of input' + }, + + '1 + { t:t ': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Unexpected end of input' + }, + + '1 + { t:t,': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'var x = /\n/': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Invalid regular expression: missing /' + }, + + 'var x = "\n': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'var if = 42': { + index: 4, + lineNumber: 1, + column: 5, + message: 'Error: Line 1: Unexpected token if' + }, + + 'i + 2 = 42': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '+i = 42': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }, + + '1 + (': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Unexpected end of input' + }, + + '\n\n\n{': { + index: 4, + lineNumber: 4, + column: 2, + message: 'Error: Line 4: Unexpected end of input' + }, + + '\n/* Some multiline\ncomment */\n)': { + index: 30, + lineNumber: 4, + column: 1, + message: 'Error: Line 4: Unexpected token )' + }, + + '{ set 1 }': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Unexpected number' + }, + + '{ get 2 }': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Unexpected number' + }, + + '({ set: s(if) { } })': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Unexpected token if' + }, + + '({ set s(.) { } })': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token .' + }, + + '({ set s() { } })': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token )' + }, + + '({ set: s() { } })': { + index: 12, + lineNumber: 1, + column: 13, + message: 'Error: Line 1: Unexpected token {' + }, + + '({ set: s(a, b) { } })': { + index: 16, + lineNumber: 1, + column: 17, + message: 'Error: Line 1: Unexpected token {' + }, + + '({ get: g(d) { } })': { + index: 13, + lineNumber: 1, + column: 14, + message: 'Error: Line 1: Unexpected token {' + }, + + '({ get i() { }, i: 42 })': { + index: 21, + lineNumber: 1, + column: 22, + message: 'Error: Line 1: Object literal may not have data and accessor property with the same name' + }, + + '({ i: 42, get i() { } })': { + index: 21, + lineNumber: 1, + column: 22, + message: 'Error: Line 1: Object literal may not have data and accessor property with the same name' + }, + + '({ set i(x) { }, i: 42 })': { + index: 22, + lineNumber: 1, + column: 23, + message: 'Error: Line 1: Object literal may not have data and accessor property with the same name' + }, + + '({ i: 42, set i(x) { } })': { + index: 22, + lineNumber: 1, + column: 23, + message: 'Error: Line 1: Object literal may not have data and accessor property with the same name' + }, + + '({ get i() { }, get i() { } })': { + index: 27, + lineNumber: 1, + column: 28, + message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name' + }, + + '({ set i(x) { }, set i(x) { } })': { + index: 29, + lineNumber: 1, + column: 30, + message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name' + }, + + 'function t(if) { }': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Unexpected token if' + }, + + 'function t(true) { }': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Unexpected token true' + }, + + 'function t(false) { }': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Unexpected token false' + }, + + 'function t(null) { }': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Unexpected token null' + }, + + 'function null() { }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token null' + }, + + 'function true() { }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token true' + }, + + 'function false() { }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token false' + }, + + 'function if() { }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token if' + }, + + 'a b;': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected identifier' + }, + + 'if.a;': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token .' + }, + + 'a if;': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token if' + }, + + 'a class;': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected reserved word' + }, + + 'break\n': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Illegal break statement' + }, + + 'break 1;': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Unexpected number' + }, + + 'continue\n': { + index: 8, + lineNumber: 1, + column: 9, + message: 'Error: Line 1: Illegal continue statement' + }, + + 'continue 2;': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected number' + }, + + 'throw': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'throw;': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Unexpected token ;' + }, + + 'throw\n': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Illegal newline after throw' + }, + + 'for (var i, i2 in {});': { + index: 15, + lineNumber: 1, + column: 16, + message: 'Error: Line 1: Unexpected token in' + }, + + 'for ((i in {}));': { + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Unexpected token )' + }, + + 'for (i + 1 in {});': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Invalid left-hand side in for-in' + }, + + 'for (+i in {});': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Invalid left-hand side in for-in' + }, + + 'if(false)': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'if(false) doThis(); else': { + index: 24, + lineNumber: 1, + column: 25, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'do': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'while(false)': { + index: 12, + lineNumber: 1, + column: 13, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'for(;;)': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'with(x)': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'try { }': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Missing catch or finally after try' + }, + + 'try {} catch (42) {} ': { + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Unexpected number' + }, + + 'try {} catch (answer()) {} ': { + index: 20, + lineNumber: 1, + column: 21, + message: 'Error: Line 1: Unexpected token (' + }, + + 'try {} catch (-x) {} ': { + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Unexpected token -' + }, + + + '\u203F = 10': { + index: 0, + lineNumber: 1, + column: 1, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'const x = 12, y;': { + index: 15, + lineNumber: 1, + column: 16, + message: 'Error: Line 1: Unexpected token ;' + }, + + 'const x, y = 12;': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected token ,' + }, + + 'const x;': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected token ;' + }, + + 'if(true) let a = 1;': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token let' + }, + + 'if(true) const a = 1;': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token const' + }, + + 'switch (c) { default: default: }': { + index: 30, + lineNumber: 1, + column: 31, + message: 'Error: Line 1: More than one default clause in switch statement' + }, + + 'new X()."s"': { + index: 8, + lineNumber: 1, + column: 9, + message: 'Error: Line 1: Unexpected string' + }, + + '/*': { + index: 2, + lineNumber: 1, + column: 3, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '/*\n\n\n': { + index: 5, + lineNumber: 4, + column: 1, + message: 'Error: Line 4: Unexpected token ILLEGAL' + }, + + '/**': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '/*\n\n*': { + index: 5, + lineNumber: 3, + column: 2, + message: 'Error: Line 3: Unexpected token ILLEGAL' + }, + + '/*hello': { + index: 7, + lineNumber: 1, + column: 8, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '/*hello *': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '\n]': { + index: 1, + lineNumber: 2, + column: 1, + message: 'Error: Line 2: Unexpected token ]' + }, + + '\r]': { + index: 1, + lineNumber: 2, + column: 1, + message: 'Error: Line 2: Unexpected token ]' + }, + + '\r\n]': { + index: 2, + lineNumber: 2, + column: 1, + message: 'Error: Line 2: Unexpected token ]' + }, + + '\n\r]': { + index: 2, + lineNumber: 3, + column: 1, + message: 'Error: Line 3: Unexpected token ]' + }, + + '//\r\n]': { + index: 4, + lineNumber: 2, + column: 1, + message: 'Error: Line 2: Unexpected token ]' + }, + + '//\n\r]': { + index: 4, + lineNumber: 3, + column: 1, + message: 'Error: Line 3: Unexpected token ]' + }, + + '/a\\\n/': { + index: 4, + lineNumber: 1, + column: 5, + message: 'Error: Line 1: Invalid regular expression: missing /' + }, + + '//\r \n]': { + index: 5, + lineNumber: 3, + column: 1, + message: 'Error: Line 3: Unexpected token ]' + }, + + '/*\r\n*/]': { + index: 6, + lineNumber: 2, + column: 3, + message: 'Error: Line 2: Unexpected token ]' + }, + + '/*\n\r*/]': { + index: 6, + lineNumber: 3, + column: 3, + message: 'Error: Line 3: Unexpected token ]' + }, + + '/*\r \n*/]': { + index: 7, + lineNumber: 3, + column: 3, + message: 'Error: Line 3: Unexpected token ]' + }, + + '\\\\': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '\\u005c': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + + '\\x': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '\\u0000': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '\u200C = []': { + index: 0, + lineNumber: 1, + column: 1, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '\u200D = []': { + index: 0, + lineNumber: 1, + column: 1, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '"\\': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + '"\\u': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected token ILLEGAL' + }, + + 'try { } catch() {}': { + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Unexpected token )' + }, + + 'return': { + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Illegal return statement' + }, + + 'break': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Illegal break statement' + }, + + 'continue': { + index: 8, + lineNumber: 1, + column: 9, + message: 'Error: Line 1: Illegal continue statement' + }, + + 'switch (x) { default: continue; }': { + index: 31, + lineNumber: 1, + column: 32, + message: 'Error: Line 1: Illegal continue statement' + }, + + 'do { x } *': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token *' + }, + + 'while (true) { break x; }': { + index: 22, + lineNumber: 1, + column: 23, + message: 'Error: Line 1: Undefined label \'x\'' + }, + + 'while (true) { continue x; }': { + index: 25, + lineNumber: 1, + column: 26, + message: 'Error: Line 1: Undefined label \'x\'' + }, + + 'x: while (true) { (function () { break x; }); }': { + index: 40, + lineNumber: 1, + column: 41, + message: 'Error: Line 1: Undefined label \'x\'' + }, + + 'x: while (true) { (function () { continue x; }); }': { + index: 43, + lineNumber: 1, + column: 44, + message: 'Error: Line 1: Undefined label \'x\'' + }, + + 'x: while (true) { (function () { break; }); }': { + index: 39, + lineNumber: 1, + column: 40, + message: 'Error: Line 1: Illegal break statement' + }, + + 'x: while (true) { (function () { continue; }); }': { + index: 42, + lineNumber: 1, + column: 43, + message: 'Error: Line 1: Illegal continue statement' + }, + + 'x: while (true) { x: while (true) { } }': { + index: 20, + lineNumber: 1, + column: 21, + message: 'Error: Line 1: Label \'x\' has already been declared' + }, + + '(function () { \'use strict\'; delete i; }())': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Delete of an unqualified identifier in strict mode.' + }, + + '(function () { \'use strict\'; with (i); }())': { + index: 28, + lineNumber: 1, + column: 29, + message: 'Error: Line 1: Strict mode code may not include a with statement' + }, + + 'function hello() {\'use strict\'; ({ i: 42, i: 42 }) }': { + index: 47, + lineNumber: 1, + column: 48, + message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode' + }, + + 'function hello() {\'use strict\'; ({ hasOwnProperty: 42, hasOwnProperty: 42 }) }': { + index: 73, + lineNumber: 1, + column: 74, + message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode' + }, + + 'function hello() {\'use strict\'; var eval = 10; }': { + index: 40, + lineNumber: 1, + column: 41, + message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; var arguments = 10; }': { + index: 45, + lineNumber: 1, + column: 46, + message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; try { } catch (eval) { } }': { + index: 51, + lineNumber: 1, + column: 52, + message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; try { } catch (arguments) { } }': { + index: 56, + lineNumber: 1, + column: 57, + message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; eval = 10; }': { + index: 32, + lineNumber: 1, + column: 33, + message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode' + }, + + 'function hello() {\'use strict\'; arguments = 10; }': { + index: 32, + lineNumber: 1, + column: 33, + message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode' + }, + + 'function hello() {\'use strict\'; ++eval; }': { + index: 38, + lineNumber: 1, + column: 39, + message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; --eval; }': { + index: 38, + lineNumber: 1, + column: 39, + message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; ++arguments; }': { + index: 43, + lineNumber: 1, + column: 44, + message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; --arguments; }': { + index: 43, + lineNumber: 1, + column: 44, + message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; eval++; }': { + index: 36, + lineNumber: 1, + column: 37, + message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; eval--; }': { + index: 36, + lineNumber: 1, + column: 37, + message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; arguments++; }': { + index: 41, + lineNumber: 1, + column: 42, + message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; arguments--; }': { + index: 41, + lineNumber: 1, + column: 42, + message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode' + }, + + 'function hello() {\'use strict\'; function eval() { } }': { + index: 41, + lineNumber: 1, + column: 42, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; function arguments() { } }': { + index: 41, + lineNumber: 1, + column: 42, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + 'function eval() {\'use strict\'; }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + 'function arguments() {\'use strict\'; }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; (function eval() { }()) }': { + index: 42, + lineNumber: 1, + column: 43, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; (function arguments() { }()) }': { + index: 42, + lineNumber: 1, + column: 43, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + '(function eval() {\'use strict\'; })()': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + '(function arguments() {\'use strict\'; })()': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + 'function hello() {\'use strict\'; ({ s: function eval() { } }); }': { + index: 47, + lineNumber: 1, + column: 48, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }, + + '(function package() {\'use strict\'; })()': { + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() {\'use strict\'; ({ i: 10, set s(eval) { } }); }': { + index: 48, + lineNumber: 1, + column: 49, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function hello() {\'use strict\'; ({ set s(eval) { } }); }': { + index: 41, + lineNumber: 1, + column: 42, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function hello() {\'use strict\'; ({ s: function s(eval) { } }); }': { + index: 49, + lineNumber: 1, + column: 50, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function hello(eval) {\'use strict\';}': { + index: 15, + lineNumber: 1, + column: 16, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function hello(arguments) {\'use strict\';}': { + index: 15, + lineNumber: 1, + column: 16, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function hello() { \'use strict\'; function inner(eval) {} }': { + index: 48, + lineNumber: 1, + column: 49, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function hello() { \'use strict\'; function inner(arguments) {} }': { + index: 48, + lineNumber: 1, + column: 49, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + ' "\\1"; \'use strict\';': { + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { \'use strict\'; "\\1"; }': { + index: 33, + lineNumber: 1, + column: 34, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { \'use strict\'; 021; }': { + index: 33, + lineNumber: 1, + column: 34, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { \'use strict\'; ({ "\\1": 42 }); }': { + index: 36, + lineNumber: 1, + column: 37, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { \'use strict\'; ({ 021: 42 }); }': { + index: 36, + lineNumber: 1, + column: 37, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { "octal directive\\1"; "use strict"; }': { + index: 19, + lineNumber: 1, + column: 20, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { "octal directive\\1"; "octal directive\\2"; "use strict"; }': { + index: 19, + lineNumber: 1, + column: 20, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { "use strict"; function inner() { "octal directive\\1"; } }': { + index: 52, + lineNumber: 1, + column: 53, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }, + + 'function hello() { "use strict"; var implements; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var interface; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var package; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var private; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var protected; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var public; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var static; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var yield; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello() { "use strict"; var let; }': { + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function hello(static) { "use strict"; }': { + index: 15, + lineNumber: 1, + column: 16, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function static() { "use strict"; }': { + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'var yield': { + index: 4, + lineNumber: 1, + column: 5, + message: 'Error: Line 1: Unexpected token yield' + }, + + 'var let': { + index: 4, + lineNumber: 1, + column: 5, + message: 'Error: Line 1: Unexpected token let' + }, + + '"use strict"; function static() { }': { + index: 23, + lineNumber: 1, + column: 24, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function a(t, t) { "use strict"; }': { + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Strict mode function may not have duplicate parameter names' + }, + + 'function a(eval) { "use strict"; }': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + 'function a(package) { "use strict"; }': { + index: 11, + lineNumber: 1, + column: 12, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'function a() { "use strict"; function b(t, t) { }; }': { + index: 43, + lineNumber: 1, + column: 44, + message: 'Error: Line 1: Strict mode function may not have duplicate parameter names' + }, + + '(function a(t, t) { "use strict"; })': { + index: 15, + lineNumber: 1, + column: 16, + message: 'Error: Line 1: Strict mode function may not have duplicate parameter names' + }, + + 'function a() { "use strict"; (function b(t, t) { }); }': { + index: 44, + lineNumber: 1, + column: 45, + message: 'Error: Line 1: Strict mode function may not have duplicate parameter names' + }, + + '(function a(eval) { "use strict"; })': { + index: 12, + lineNumber: 1, + column: 13, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }, + + '(function a(package) { "use strict"; })': { + index: 12, + lineNumber: 1, + column: 13, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }, + + 'var': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'let': { + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Unexpected end of input' + }, + + 'const': { + index: 5, + lineNumber: 1, + column: 6, + message: 'Error: Line 1: Unexpected end of input' + } + + }, + + 'API': { + 'parse()': { + call: 'parse', + args: [], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'undefined' + } + }] + } + }, + + 'parse(null)': { + call: 'parse', + args: [null], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: null + } + }] + } + }, + + 'parse(42)': { + call: 'parse', + args: [42], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42 + } + }] + } + }, + + 'parse(true)': { + call: 'parse', + args: [true], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: true + } + }] + } + }, + + 'parse(undefined)': { + call: 'parse', + args: [void 0], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'undefined' + } + }] + } + }, + + 'parse(new String("test"))': { + call: 'parse', + args: [new String('test')], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Identifier', + name: 'test' + } + }] + } + }, + + 'parse(new Number(42))': { + call: 'parse', + args: [new Number(42)], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 42 + } + }] + } + }, + + 'parse(new Boolean(true))': { + call: 'parse', + args: [new Boolean(true)], + result: { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: true + } + }] + } + }, + + 'Syntax': { + property: 'Syntax', + result: { + AssignmentExpression: 'AssignmentExpression', + ArrayExpression: 'ArrayExpression', + BlockStatement: 'BlockStatement', + BinaryExpression: 'BinaryExpression', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ConditionalExpression: 'ConditionalExpression', + ContinueStatement: 'ContinueStatement', + DoWhileStatement: 'DoWhileStatement', + DebuggerStatement: 'DebuggerStatement', + EmptyStatement: 'EmptyStatement', + ExpressionStatement: 'ExpressionStatement', + ForStatement: 'ForStatement', + ForInStatement: 'ForInStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + Literal: 'Literal', + LabeledStatement: 'LabeledStatement', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SwitchStatement: 'SwitchStatement', + SwitchCase: 'SwitchCase', + ThisExpression: 'ThisExpression', + ThrowStatement: 'ThrowStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement', + WithStatement: 'WithStatement' + } + } + + }, + + 'Tolerant parse': { + 'return': { + type: 'Program', + body: [{ + type: 'ReturnStatement', + 'argument': null, + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + } + }], + range: [0, 6], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 6 } + }, + errors: [{ + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Illegal return statement' + }] + }, + + '(function () { \'use strict\'; with (i); }())': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '\'use strict\'', + range: [15, 27], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 27 } + } + }, + range: [15, 28], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 28 } + } + }, { + type: 'WithStatement', + object: { + type: 'Identifier', + name: 'i', + range: [35, 36], + loc: { + start: { line: 1, column: 35 }, + end: { line: 1, column: 36 } + } + }, + body: { + type: 'EmptyStatement', + range: [37, 38], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 38 } + } + }, + range: [29, 38], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 38 } + } + }], + range: [13, 40], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 40 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 40], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 40 } + } + }, + 'arguments': [], + range: [1, 42], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 42 } + } + }, + range: [0, 43], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 43 } + } + }], + range: [0, 43], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 43 } + }, + errors: [{ + index: 29, + lineNumber: 1, + column: 30, + message: 'Error: Line 1: Strict mode code may not include a with statement' + }] + }, + + '(function () { \'use strict\'; 021 }())': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'CallExpression', + callee: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '\'use strict\'', + range: [15, 27], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 27 } + } + }, + range: [15, 28], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 28 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 17, + raw: "021", + range: [29, 32], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 32 } + } + }, + range: [29, 33], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 33 } + } + }], + range: [13, 34], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [1, 34], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 34 } + } + }, + 'arguments': [], + range: [1, 36], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 36 } + } + }, + range: [0, 37], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 37 } + } + }], + range: [0, 37], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 37 } + }, + errors: [{ + index: 29, + lineNumber: 1, + column: 30, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }] + }, + + '"use strict"; delete x': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UnaryExpression', + operator: 'delete', + argument: { + type: 'Identifier', + name: 'x', + range: [21, 22], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 22 } + } + }, + prefix: true, + range: [14, 22], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 22 } + } + }, + range: [14, 22], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 22 } + } + }], + range: [0, 22], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 22 } + }, + errors: [{ + index: 22, + lineNumber: 1, + column: 23, + message: 'Error: Line 1: Delete of an unqualified identifier in strict mode.' + }] + }, + + '"use strict"; try {} catch (eval) {}': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [18, 20], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 20 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'eval', + range: [28, 32], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 32 } + } + }, + body: { + type: 'BlockStatement', + body: [], + range: [34, 36], + loc: { + start: { line: 1, column: 34 }, + end: { line: 1, column: 36 } + } + }, + range: [21, 36], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 36 } + } + }], + finalizer: null, + range: [14, 36], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 36 } + } + }], + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + }, + errors: [{ + index: 32, + lineNumber: 1, + column: 33, + message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; try {} catch (arguments) {}': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'TryStatement', + block: { + type: 'BlockStatement', + body: [], + range: [18, 20], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 20 } + } + }, + guardedHandlers: [], + handlers: [{ + type: 'CatchClause', + param: { + type: 'Identifier', + name: 'arguments', + range: [28, 37], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 37 } + } + }, + body: { + type: 'BlockStatement', + body: [], + range: [39, 41], + loc: { + start: { line: 1, column: 39 }, + end: { line: 1, column: 41 } + } + }, + range: [21, 41], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 41 } + } + }], + finalizer: null, + range: [14, 41], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 41 } + } + }], + range: [0, 41], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 41 } + }, + errors: [{ + index: 37, + lineNumber: 1, + column: 38, + message: 'Error: Line 1: Catch variable may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; var eval;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'eval', + range: [18, 22], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 22 } + } + }, + init: null, + range: [18, 22], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 22 } + } + }], + kind: 'var', + range: [14, 23], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 23 } + } + }], + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + }, + errors: [{ + index: 22, + lineNumber: 1, + column: 23, + message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; var arguments;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'arguments', + range: [18, 27], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 27 } + } + }, + init: null, + range: [18, 27], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 27 } + } + }], + kind: 'var', + range: [14, 28], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 28 } + } + }], + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + }, + errors: [{ + index: 27, + lineNumber: 1, + column: 28, + message: 'Error: Line 1: Variable name may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; eval = 0;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'eval', + range: [14, 18], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 18 } + } + }, + right: { + type: 'Literal', + value: 0, + raw: '0', + range: [21, 22], + loc: { + start: { line: 1, column: 21 }, + end: { line: 1, column: 22 } + } + }, + range: [14, 22], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 22 } + } + }, + range: [14, 23], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 23 } + } + }], + range: [0, 23], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 23 } + }, + errors: [{ + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode' + }] + }, + + '"use strict"; eval++;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'eval', + range: [14, 18], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 18 } + } + }, + prefix: false, + range: [14, 20], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 20 } + } + }, + range: [14, 21], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 21 } + } + }], + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + }, + errors: [{ + index: 18, + lineNumber: 1, + column: 19, + message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode' + }] + }, + + '"use strict"; --eval;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'eval', + range: [16, 20], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 20 } + } + }, + prefix: true, + range: [14, 20], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 20 } + } + }, + range: [14, 21], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 21 } + } + }], + range: [0, 21], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 21 } + }, + errors: [{ + index: 20, + lineNumber: 1, + column: 21, + message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode' + }] + }, + + '"use strict"; arguments = 0;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'arguments', + range: [14, 23], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 23 } + } + }, + right: { + type: 'Literal', + value: 0, + raw: '0', + range: [26, 27], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 27 } + } + }, + range: [14, 27], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 27 } + } + }, + range: [14, 28], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 28 } + } + }], + range: [0, 28], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 28 } + }, + errors: [{ + index: 14, + lineNumber: 1, + column: 15, + message: 'Error: Line 1: Assignment to eval or arguments is not allowed in strict mode' + }] + }, + + '"use strict"; arguments--;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Identifier', + name: 'arguments', + range: [14, 23], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 23 } + } + }, + prefix: false, + range: [14, 25], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 25 } + } + }, + range: [14, 26], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 26 } + } + }], + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + }, + errors: [{ + index: 23, + lineNumber: 1, + column: 24, + message: 'Error: Line 1: Postfix increment/decrement may not have eval or arguments operand in strict mode' + }] + }, + + '"use strict"; ++arguments;': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Identifier', + name: 'arguments', + range: [16, 25], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 25 } + } + }, + prefix: true, + range: [14, 25], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 25 } + } + }, + range: [14, 26], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 26 } + } + }], + range: [0, 26], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 26 } + }, + errors: [{ + index: 25, + lineNumber: 1, + column: 26, + message: 'Error: Line 1: Prefix increment/decrement may not have eval or arguments operand in strict mode' + }] + }, + + + '"use strict";x={y:1,y:1}': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'y', + range: [16, 17], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 17 } + } + }, + value: { + type: 'Literal', + value: 1, + raw: '1', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + kind: 'init', + range: [16, 19], + loc: { + start: { line: 1, column: 16 }, + end: { line: 1, column: 19 } + } + }, { + type: 'Property', + key: { + type: 'Identifier', + name: 'y', + range: [20, 21], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 21 } + } + }, + value: { + type: 'Literal', + value: 1, + raw: '1', + range: [22, 23], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 23 } + } + }, + kind: 'init', + range: [20, 23], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 23 } + } + }], + range: [15, 24], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 24 } + } + }, + range: [13, 24], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 24 } + } + }, + range: [13, 24], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 24 } + } + }], + range: [0, 24], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 24 } + }, + errors: [{ + index: 23, + lineNumber: 1, + column: 24, + message: 'Error: Line 1: Duplicate data property in object literal not allowed in strict mode' + }] + }, + + '"use strict"; function eval() {};': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'eval', + range: [23, 27], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 27 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [30, 32], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 32 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 32], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 32 } + } + }, { + type: 'EmptyStatement', + range: [32, 33], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 33 } + } + }], + range: [0, 33], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 33 } + }, + errors: [{ + index: 23, + lineNumber: 1, + column: 24, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; function arguments() {};': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'arguments', + range: [23, 32], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 32 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [35, 37], + loc: { + start: { line: 1, column: 35 }, + end: { line: 1, column: 37 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 37], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 37 } + } + }, { + type: 'EmptyStatement', + range: [37, 38], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 38 } + } + }], + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + }, + errors: [{ + index: 23, + lineNumber: 1, + column: 24, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; function interface() {};': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'interface', + range: [23, 32], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 32 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [35, 37], + loc: { + start: { line: 1, column: 35 }, + end: { line: 1, column: 37 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 37], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 37 } + } + }, { + type: 'EmptyStatement', + range: [37, 38], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 38 } + } + }], + range: [0, 38], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 38 } + }, + errors: [{ + index: 23, + lineNumber: 1, + column: 24, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }] + }, + + '"use strict"; (function eval() {});': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'eval', + range: [24, 28], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 28 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [31, 33], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 33 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 33], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 33 } + } + }, + range: [14, 35], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 35 } + } + }], + range: [0, 35], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 35 } + }, + errors: [{ + index: 24, + lineNumber: 1, + column: 25, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; (function arguments() {});': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'arguments', + range: [24, 33], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 33 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [36, 38], + loc: { + start: { line: 1, column: 36 }, + end: { line: 1, column: 38 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 38], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 38 } + } + }, + range: [14, 40], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 40 } + } + }], + range: [0, 40], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 40 } + }, + errors: [{ + index: 24, + lineNumber: 1, + column: 25, + message: 'Error: Line 1: Function name may not be eval or arguments in strict mode' + }] + }, + + '"use strict"; (function interface() {});': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'interface', + range: [24, 33], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 33 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [36, 38], + loc: { + start: { line: 1, column: 36 }, + end: { line: 1, column: 38 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 38], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 38 } + } + }, + range: [14, 40], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 40 } + } + }], + range: [0, 40], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 40 } + }, + errors: [{ + index: 24, + lineNumber: 1, + column: 25, + message: 'Error: Line 1: Use of future reserved word in strict mode' + }] + }, + + '"use strict"; function f(eval) {};': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'f', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }, + params: [{ + type: 'Identifier', + name: 'eval', + range: [25, 29], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 29 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [31, 33], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 33 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 33], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 33 } + } + }, { + type: 'EmptyStatement', + range: [33, 34], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 34 } + } + }], + range: [0, 34], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 34 } + }, + errors: [{ + index: 25, + lineNumber: 1, + column: 26, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }] + }, + + '"use strict"; function f(arguments) {};': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'f', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }, + params: [{ + type: 'Identifier', + name: 'arguments', + range: [25, 34], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 34 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [36, 38], + loc: { + start: { line: 1, column: 36 }, + end: { line: 1, column: 38 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 38], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 38 } + } + }, { + type: 'EmptyStatement', + range: [38, 39], + loc: { + start: { line: 1, column: 38 }, + end: { line: 1, column: 39 } + } + }], + range: [0, 39], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 39 } + }, + errors: [{ + index: 25, + lineNumber: 1, + column: 26, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }] + }, + + '"use strict"; function f(foo, foo) {};': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'f', + range: [23, 24], + loc: { + start: { line: 1, column: 23 }, + end: { line: 1, column: 24 } + } + }, + params: [{ + type: 'Identifier', + name: 'foo', + range: [25, 28], + loc: { + start: { line: 1, column: 25 }, + end: { line: 1, column: 28 } + } + }, { + type: 'Identifier', + name: 'foo', + range: [31, 34], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 34 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [36, 38], + loc: { + start: { line: 1, column: 36 }, + end: { line: 1, column: 38 } + } + }, + rest: null, + generator: false, + expression: false, + range: [14, 38], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 38 } + } + }, { + type: 'EmptyStatement', + range: [38, 39], + loc: { + start: { line: 1, column: 38 }, + end: { line: 1, column: 39 } + } + }], + range: [0, 39], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 39 } + }, + errors: [{ + index: 31, + lineNumber: 1, + column: 32, + message: 'Error: Line 1: Strict mode function may not have duplicate parameter names' + }] + }, + + '"use strict"; (function f(eval) {});': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'f', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + params: [{ + type: 'Identifier', + name: 'eval', + range: [26, 30], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 30 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [32, 34], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 34], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 34 } + } + }, + range: [14, 36], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 36 } + } + }], + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + }, + errors: [{ + index: 26, + lineNumber: 1, + column: 27, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }] + }, + + + '"use strict"; (function f(arguments) {});': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'f', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + params: [{ + type: 'Identifier', + name: 'arguments', + range: [26, 35], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 35 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [37, 39], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 39 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 39], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 39 } + } + }, + range: [14, 41], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 41 } + } + }], + range: [0, 41], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 41 } + }, + errors: [{ + index: 26, + lineNumber: 1, + column: 27, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }] + }, + + '"use strict"; (function f(foo, foo) {});': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'FunctionExpression', + id: { + type: 'Identifier', + name: 'f', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + params: [{ + type: 'Identifier', + name: 'foo', + range: [26, 29], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 29 } + } + }, { + type: 'Identifier', + name: 'foo', + range: [32, 35], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 35 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [37, 39], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 39 } + } + }, + rest: null, + generator: false, + expression: false, + range: [15, 39], + loc: { + start: { line: 1, column: 15 }, + end: { line: 1, column: 39 } + } + }, + range: [14, 41], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 41 } + } + }], + range: [0, 41], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 41 } + }, + errors: [{ + index: 32, + lineNumber: 1, + column: 33, + message: 'Error: Line 1: Strict mode function may not have duplicate parameter names' + }] + }, + + '"use strict"; x = { set f(eval) {} }' : { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Identifier', + name: 'x', + range: [14, 15], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 15 } + } + }, + right: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'f', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + value : { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'eval', + range: [26, 30], + loc: { + start: { line: 1, column: 26 }, + end: { line: 1, column: 30 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [32, 34], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [32, 34], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 34 } + } + }, + kind: 'set', + range: [20, 34], + loc: { + start: { line: 1, column: 20 }, + end: { line: 1, column: 34 } + } + }], + range: [18, 36], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 36 } + } + }, + range: [14, 36], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 36 } + } + }, + range: [14, 36], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 36 } + } + }], + range: [0, 36], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 36 } + }, + errors: [{ + index: 26, + lineNumber: 1, + column: 27, + message: 'Error: Line 1: Parameter name eval or arguments is not allowed in strict mode' + }] + }, + + 'function hello() { "octal directive\\1"; "use strict"; }': { + type: 'Program', + body: [{ + type: 'FunctionDeclaration', + id: { + type: 'Identifier', + name: 'hello', + range: [9, 14], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 14 } + } + }, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'octal directive\u0001', + raw: '"octal directive\\1"', + range: [19, 38], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 38 } + } + }, + range: [19, 39], + loc: { + start: { line: 1, column: 19 }, + end: { line: 1, column: 39 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [40, 52], + loc: { + start: { line: 1, column: 40 }, + end: { line: 1, column: 52 } + } + }, + range: [40, 53], + loc: { + start: { line: 1, column: 40 }, + end: { line: 1, column: 53 } + } + }], + range: [17, 55], + loc: { + start: { line: 1, column: 17 }, + end: { line: 1, column: 55 } + } + }, + rest: null, + generator: false, + expression: false, + range: [0, 55], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 55 } + } + }], + range: [0, 55], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 55 } + }, + errors: [{ + index: 19, + lineNumber: 1, + column: 20, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }] + }, + + '"\\1"; \'use strict\';': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: '\u0001', + raw: '"\\1"', + range: [0, 4], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 4 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, { + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '\'use strict\'', + range: [6, 18], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 18 } + } + }, + range: [6, 19], + loc: { + start: { line: 1, column: 6 }, + end: { line: 1, column: 19 } + } + }], + range: [0, 19], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 19 } + }, + errors: [{ + index: 0, + lineNumber: 1, + column: 1, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }] + }, + + '"use strict"; var x = { 014: 3}': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + init: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Literal', + value: 12, + raw: '014', + range: [24, 27], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 27 } + } + }, + value: { + type: 'Literal', + value: 3, + raw: '3', + range: [29, 30], + loc: { + start: { line: 1, column: 29 }, + end: { line: 1, column: 30 } + } + }, + kind: 'init', + range: [24, 30], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 30 } + } + }], + range: [22, 31], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 31 } + } + }, + range: [18, 31], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 31 } + } + }], + kind: 'var', + range: [14, 31], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 31 } + } + }], + range: [0, 31], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 31 } + }, + errors: [{ + index: 24, + lineNumber: 1, + column: 25, + message: 'Error: Line 1: Octal literals are not allowed in strict mode.' + }] + }, + + '"use strict"; var x = { get i() {}, get i() {} }': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + init: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'i', + range: [28, 29], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 29 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [32, 34], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 34 } + } + }, + rest: null, + generator: false, + expression: false, + range: [32, 34], + loc: { + start: { line: 1, column: 32 }, + end: { line: 1, column: 34 } + } + }, + kind: 'get', + range: [24, 34], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 34 } + } + }, { + type: 'Property', + key: { + type: 'Identifier', + name: 'i', + range: [40, 41], + loc: { + start: { line: 1, column: 40 }, + end: { line: 1, column: 41 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [44, 46], + loc: { + start: { line: 1, column: 44 }, + end: { line: 1, column: 46 } + } + }, + rest: null, + generator: false, + expression: false, + range: [44, 46], + loc: { + start: { line: 1, column: 44 }, + end: { line: 1, column: 46 } + } + }, + kind: 'get', + range: [36, 46], + loc: { + start: { line: 1, column: 36 }, + end: { line: 1, column: 46 } + } + }], + range: [22, 48], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 48 } + } + }, + range: [18, 48], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 48 } + } + }], + kind: 'var', + range: [14, 48], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 48 } + } + }], + range: [0, 48], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 48 } + }, + errors: [{ + index: 46, + lineNumber: 1, + column: 47, + message: 'Error: Line 1: Object literal may not have multiple get/set accessors with the same name' + }] + }, + + '"use strict"; var x = { i: 42, get i() {} }': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + init: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'i', + range: [24, 25], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 25 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [27, 29], + loc: { + start: { line: 1, column: 27 }, + end: { line: 1, column: 29 } + } + }, + kind: 'init', + range: [24, 29], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 29 } + } + }, { + type: 'Property', + key: { + type: 'Identifier', + name: 'i', + range: [35, 36], + loc: { + start: { line: 1, column: 35 }, + end: { line: 1, column: 36 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [39, 41], + loc: { + start: { line: 1, column: 39 }, + end: { line: 1, column: 41 } + } + }, + rest: null, + generator: false, + expression: false, + range: [39, 41], + loc: { + start: { line: 1, column: 39 }, + end: { line: 1, column: 41 } + } + }, + kind: 'get', + range: [31, 41], + loc: { + start: { line: 1, column: 31 }, + end: { line: 1, column: 41 } + } + }], + range: [22, 43], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 43 } + } + }, + range: [18, 43], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 43 } + } + }], + kind: 'var', + range: [14, 43], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 43 } + } + }], + range: [0, 43], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 43 } + }, + errors: [{ + index: 41, + lineNumber: 1, + column: 42, + message: 'Error: Line 1: Object literal may not have data and accessor property with the same name' + }] + }, + + '"use strict"; var x = { set i(x) {}, i: 42 }': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'Literal', + value: 'use strict', + raw: '"use strict"', + range: [0, 12], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 12 } + } + }, + range: [0, 13], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 13 } + } + }, { + type: 'VariableDeclaration', + declarations: [{ + type: 'VariableDeclarator', + id: { + type: 'Identifier', + name: 'x', + range: [18, 19], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 19 } + } + }, + init: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'i', + range: [28, 29], + loc: { + start: { line: 1, column: 28 }, + end: { line: 1, column: 29 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'x', + range: [30, 31], + loc: { + start: { line: 1, column: 30 }, + end: { line: 1, column: 31 } + } + }], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [33, 35], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 35 } + } + }, + rest: null, + generator: false, + expression: false, + range: [33, 35], + loc: { + start: { line: 1, column: 33 }, + end: { line: 1, column: 35 } + } + }, + kind: 'set', + range: [24, 35], + loc: { + start: { line: 1, column: 24 }, + end: { line: 1, column: 35 } + } + }, { + type: 'Property', + key: { + type: 'Identifier', + name: 'i', + range: [37, 38], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 38 } + } + }, + value: { + type: 'Literal', + value: 42, + raw: '42', + range: [40, 42], + loc: { + start: { line: 1, column: 40 }, + end: { line: 1, column: 42 } + } + }, + kind: 'init', + range: [37, 42], + loc: { + start: { line: 1, column: 37 }, + end: { line: 1, column: 42 } + } + }], + range: [22, 44], + loc: { + start: { line: 1, column: 22 }, + end: { line: 1, column: 44 } + } + }, + range: [18, 44], + loc: { + start: { line: 1, column: 18 }, + end: { line: 1, column: 44 } + } + }], + kind: 'var', + range: [14, 44], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 44 } + } + }], + range: [0, 44], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 44 } + }, + errors: [{ + index: 42, + lineNumber: 1, + column: 43, + message: 'Error: Line 1: Object literal may not have data and accessor property with the same name' + }] + + + }, + + '({ set s() { } })': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'ObjectExpression', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 's', + range: [7, 8], + loc: { + start: { line: 1, column: 7 }, + end: { line: 1, column: 8 } + } + }, + value: { + type: 'FunctionExpression', + id: null, + params: [], + defaults: [], + body: { + type: 'BlockStatement', + body: [], + range: [11, 14], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 14 } + } + }, + rest: null, + generator: false, + expression: false, + range: [11, 14], + loc: { + start: { line: 1, column: 11 }, + end: { line: 1, column: 14 } + } + }, + kind: 'set', + range: [3, 14], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 14 } + } + }], + range: [1, 16], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + } + }], + range: [0, 17], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 17 } + }, + errors: [{ + index: 9, + lineNumber: 1, + column: 10, + message: 'Error: Line 1: Unexpected token )' + }] + }, + + 'foo("bar") = baz': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'foo', + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + 'arguments': [{ + type: 'Literal', + value: 'bar', + raw: '"bar"', + range: [4, 9], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 9 } + } + }], + range: [0, 10], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 10 } + } + }, + right: { + type: 'Identifier', + name: 'baz', + range: [13, 16], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }], + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + }, + errors: [{ + index: 10, + lineNumber: 1, + column: 11, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }] + }, + + '1 = 2': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'AssignmentExpression', + operator: '=', + left: { + type: 'Literal', + value: 1, + raw: '1', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + right: { + type: 'Literal', + value: 2, + raw: '2', + range: [4, 5], + loc: { + start: { line: 1, column: 4 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }, + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + } + }], + range: [0, 5], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 5 } + }, + errors: [{ + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }] + }, + + '3++': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '++', + argument: { + type: 'Literal', + value: 3, + raw: '3', + range: [0, 1], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 1 } + } + }, + prefix: false, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }], + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + }, + errors: [{ + index: 1, + lineNumber: 1, + column: 2, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }] + }, + + '--4': { + type: 'Program', + body: [{ + type: 'ExpressionStatement', + expression: { + type: 'UpdateExpression', + operator: '--', + argument: { + type: 'Literal', + value: 4, + raw: '4', + range: [2, 3], + loc: { + start: { line: 1, column: 2 }, + end: { line: 1, column: 3 } + } + }, + prefix: true, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }, + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + } + }], + range: [0, 3], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 3 } + }, + errors: [{ + index: 3, + lineNumber: 1, + column: 4, + message: 'Error: Line 1: Invalid left-hand side in assignment' + }] + }, + + 'for (5 in []) {}': { + type: 'Program', + body: [{ + type: 'ForInStatement', + left: { + type: 'Literal', + value: 5, + raw: '5', + range: [5, 6], + loc: { + start: { line: 1, column: 5 }, + end: { line: 1, column: 6 } + } + }, + right: { + type: 'ArrayExpression', + elements: [], + range: [10, 12], + loc: { + start: { line: 1, column: 10 }, + end: { line: 1, column: 12 } + } + }, + body: { + type: 'BlockStatement', + body: [], + range: [14, 16], + loc: { + start: { line: 1, column: 14 }, + end: { line: 1, column: 16 } + } + }, + each: false, + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + } + }], + range: [0, 16], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 16 } + }, + errors: [{ + index: 6, + lineNumber: 1, + column: 7, + message: 'Error: Line 1: Invalid left-hand side in for-in' + }] + } + + + } +}; + diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/.npmignore b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/.npmignore new file mode 100644 index 0000000..0d1b0b0 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/.npmignore @@ -0,0 +1,15 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +npm-debug.log +node_modules/* \ No newline at end of file diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/README.md b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/README.md new file mode 100644 index 0000000..9e0abaf --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/README.md @@ -0,0 +1,46 @@ +uniq +==== +Removes all duplicates from an array in place. + +Usage +===== +First install using npm: + + npm install uniq + +Then use it as follows: + +```javascript + +var arr = [1, 1, 2, 2, 3, 5] + +require("uniq")(arr) +console.log(arr) + +//Prints: +// +// 1,2,3,5 +// +``` + +## `require("uniq")(array[, compare, sorted])` +Removes all duplicates from a sorted array in place. + +* `array` is the array to remove items from +* `compare` is an optional comparison function that returns 0 when two items are equal, and something non-zero when they are different. If unspecified, then the default equals will be used. +* `sorted` if true, then assume array is already sorted + +**Returns:** A reference to `array` + +**Time Complexity:** `O(array.length * log(arra.length))` or `O(array.length)` if `sorted` + + +## Why use this instead of underscore.uniq[ue]? +A few reasons: + +* This library updates the array in place without making an extra copy (and so it is faster for large arrays) +* It also accepts a custom comparison function so you can remove duplicates from arrays containing object +* It is more modular in the sense that it doesn't come with a bazillion other utility grab bag functions. + +# Credits +(c) 2013 Mikola Lysenko. MIT License diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/package.json b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/package.json new file mode 100644 index 0000000..9628362 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/package.json @@ -0,0 +1,49 @@ +{ + "name": "uniq", + "version": "0.0.2", + "description": "Removes duplicates from a sorted array in place", + "main": "uniq.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.4.0" + }, + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/mikolalysenko/uniq.git" + }, + "keywords": [ + "array", + "duplicate", + "unique", + "uniq", + "remove", + "sort", + "in", + "place", + "no", + "copy" + ], + "author": { + "name": "Mikola Lysenko" + }, + "license": "MIT", + "readmeFilename": "README.md", + "gitHead": "e9828cfcb97e25a351f95b39fdf3c31876ff3985", + "readme": "uniq\n====\nRemoves all duplicates from an array in place.\n\nUsage\n=====\nFirst install using npm:\n\n npm install uniq\n \nThen use it as follows:\n\n```javascript\n\nvar arr = [1, 1, 2, 2, 3, 5]\n\nrequire(\"uniq\")(arr)\nconsole.log(arr)\n\n//Prints:\n//\n// 1,2,3,5\n//\n```\n\n## `require(\"uniq\")(array[, compare, sorted])`\nRemoves all duplicates from a sorted array in place.\n\n* `array` is the array to remove items from\n* `compare` is an optional comparison function that returns 0 when two items are equal, and something non-zero when they are different. If unspecified, then the default equals will be used.\n* `sorted` if true, then assume array is already sorted\n\n**Returns:** A reference to `array`\n\n**Time Complexity:** `O(array.length * log(arra.length))` or `O(array.length)` if `sorted`\n\n\n## Why use this instead of underscore.uniq[ue]?\nA few reasons:\n\n* This library updates the array in place without making an extra copy (and so it is faster for large arrays)\n* It also accepts a custom comparison function so you can remove duplicates from arrays containing object\n* It is more modular in the sense that it doesn't come with a bazillion other utility grab bag functions.\n\n# Credits\n(c) 2013 Mikola Lysenko. MIT License\n", + "bugs": { + "url": "https://github.com/mikolalysenko/uniq/issues" + }, + "homepage": "https://github.com/mikolalysenko/uniq", + "_id": "uniq@0.0.2", + "dist": { + "shasum": "04fca561bef1c2279d5ca0d162d79ef769dace57" + }, + "_from": "uniq@~0.0.2", + "_resolved": "https://registry.npmjs.org/uniq/-/uniq-0.0.2.tgz" +} diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/test/test.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/test/test.js new file mode 100644 index 0000000..cb7ebd5 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/test/test.js @@ -0,0 +1,11 @@ +var unique = require("../uniq.js") + +require("tap").test("unique", function(t) { + + t.equals(unique([1,1,2,3,5,5,7]).join(), [1,2,3,5,7].join()) + t.equals(unique([]).join(), [].join()) + t.equals(unique([1,1,1]).join(), [1].join()) + t.equals(unique([1,1,1,2,2,2], function(a,b) { return (a^b)&1 }).join(), [2,1].join()) + + t.end() +}) \ No newline at end of file diff --git a/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/uniq.js b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/uniq.js new file mode 100644 index 0000000..a1bfa20 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ndarray-pack/node_modules/cwise/node_modules/cwise-parser/node_modules/uniq/uniq.js @@ -0,0 +1,57 @@ +"use strict" + +function unique_pred(list, compare) { + var ptr = 1 + , len = list.length + , a=list[0], b=list[0] + for(var i=1; iMath.abs(this._stride1))?[1,0]:[0,1]}})") + } else if(dimension === 3) { + code.push( +"var s0=Math.abs(this._stride0),s1=Math.abs(this._stride1),s2=Math.abs(this._stride2);\ +if(s0>s1){\ +if(s1>s2){\ +return [2,1,0];\ +}else if(s0>s2){\ +return [1,2,0];\ +}else{\ +return [1,0,2];\ +}\ +}else if(s0>s2){\ +return [2,0,1];\ +}else if(s2>s1){\ +return [0,1,2];\ +}else{\ +return [0,2,1];\ +}}})") + } + } else { + code.push("ORDER})") + } + } + + //view.set(i0, ..., v): + code.push([ +"proto.set=function ",className,"_set(", args.join(","), ",v){"].join("")) + if(useGetters) { + code.push(["return this.data.set(", index_str, ",v)}"].join("")) + } else { + code.push(["return this.data[", index_str, "]=v}"].join("")) + } + + //view.get(i0, ...): + code.push(["proto.get=function ",className,"_get(", args.join(","), "){"].join("")) + if(useGetters) { + code.push(["return this.data.get(", index_str, ")}"].join("")) + } else { + code.push(["return this.data[", index_str, "]}"].join("")) + } + + //view.index: + code.push([ + "proto.index=function ", + className, + "_index(", args.join(), "){return ", + index_str, "}"].join("")) + + //view.hi(): + code.push(["proto.hi=function ",className,"_hi(",args.join(","),"){return new ", className, "(this.data,", + indices.map(function(i) { + return ["(typeof i",i,"!=='number'||i",i,"<0)?this._shape", i, ":i", i,"|0"].join("") + }).join(","), ",", + indices.map(function(i) { + return "this._stride"+i + }).join(","), ",this.offset)}"].join("")) + + //view.lo(): + var a_vars = indices.map(function(i) { return "a"+i+"=this._shape"+i }) + var c_vars = indices.map(function(i) { return "c"+i+"=this._stride"+i }) + code.push(["proto.lo=function ",className,"_lo(",args.join(","),"){var b=this.offset,d=0,", a_vars.join(","), ",", c_vars.join(",")].join("")) + for(var i=0; i=0){\ +d=i",i,"|0;\ +b+=c",i,"*d;\ +a",i,"-=d}"].join("")) + } + code.push(["return new ", className, "(this.data,", + indices.map(function(i) { + return "a"+i + }).join(","),",", + indices.map(function(i) { + return "c"+i + }).join(","), ",b)}"].join("")) + + //view.step(): + code.push(["proto.step=function ",className,"_step(",args.join(","),"){var ", + indices.map(function(i) { + return "a"+i+"=this._shape"+i + }).join(","), ",", + indices.map(function(i) { + return "b"+i+"=this._stride"+i + }).join(","),",c=this.offset,d=0,ceil=Math.ceil"].join("")) + for(var i=0; i=0){c=(c+this._stride",i,"*i",i,")|0}else{a.push(this._shape",i,");b.push(this._stride",i,")}"].join("")) + } + code.push("var ctor=CTOR_LIST[a.length];return ctor(this.data,a,b,c)}") + + //Add return statement + code.push(["return function construct_",className,"(data,shape,stride,offset){return new ", className,"(data,", + indices.map(function(i) { + return "shape["+i+"]" + }).join(","), ",", + indices.map(function(i) { + return "stride["+i+"]" + }).join(","), ",offset)}"].join("")) + + //Compile procedure + var procedure = new Function("CTOR_LIST", "ORDER", code.join("\n")) + return procedure(CACHED_CONSTRUCTORS[dtype], order) +} + +function arrayDType(data) { + if(data instanceof Float64Array) { + return "float64"; + } else if(data instanceof Float32Array) { + return "float32" + } else if(data instanceof Int32Array) { + return "int32" + } else if(data instanceof Uint32Array) { + return "uint32" + } else if(data instanceof Uint8Array) { + return "uint8" + } else if(data instanceof Uint16Array) { + return "uint16" + } else if(data instanceof Int16Array) { + return "int16" + } else if(data instanceof Int8Array) { + return "int8" + } else if(data instanceof Uint8ClampedArray) { + return "uint8_clamped" + } else if((typeof Buffer !== "undefined") && (data instanceof Buffer)) { + return "buffer" + } else if(data instanceof Array) { + return "array" + } + return "generic" +} + +var CACHED_CONSTRUCTORS = { + "float32":[], + "float64":[], + "int8":[], + "int16":[], + "int32":[], + "uint8":[], + "uint16":[], + "uint32":[], + "array":[], + "uint8_clamped":[], + "buffer":[], + "generic":[] +} + +function wrappedNDArrayCtor(data, shape, stride, offset) { + if(shape === undefined) { + shape = [ data.length ] + } + var d = shape.length + if(stride === undefined) { + stride = new Array(d) + for(var i=d-1, sz=1; i>=0; --i) { + stride[i] = sz + sz *= shape[i] + } + } + if(offset === undefined) { + offset = 0 + for(var i=0; i^b{9&pH2RcYn2~W3L(aykK7L&;9wne7@i7 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%0A`@?+_J@_@^0Ot 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 literal 0 HcmV?d00001 diff --git a/node_modules/get-pixels/node_modules/pngparse/grayscale.png b/node_modules/get-pixels/node_modules/pngparse/grayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..da49bb08b0bc1919558e302118e7691c79ccc316 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UA7>k44ofy`glX(f`D3-WJlmzFe zm6RtIr82k|B^G34COhZnm8BMyq!uY?c;=O)=4h6;|B?hM?(lSR45^so(&s36KtX^x znUOo<0F&5;23DN}5c5zZkhjj)I`jU_ySxHPr= this.width || y >= this.height) + return 0 + + return this.data.readUInt32BE((y * this.width + x) * 4) +} + +function paeth(a, b, c) { + var p = a + b - c, + pa = Math.abs(p - a), + pb = Math.abs(p - b), + pc = Math.abs(p - c) + + if((pa <= pb) && (pa <= pc)) + return a + + if(pb <= pc) + return b + + return c +} + +exports.parseStream = function(stream, callback) { + var inflate = zlib.createInflate(), + state = 0, + off = 0, + buf = new Buffer(13), + waiting = 2, + b = -1, + p = 0, + pngPaletteEntries = 0, + pngAlphaEntries = 0, + chunkLength, pngWidth, pngHeight, pngBitDepth, pngDepthMult, + pngColorType, pngPixels, pngSamplesPerPixel, pngBytesPerPixel, + pngBytesPerScanline, pngSamples, currentScanline, priorScanline, + scanlineFilter, pngTrailer, pngPalette, pngAlpha + + function error(err) { + /* FIXME: stream.destroy no longer exists in node 0.10. I can't actually + * find what the right way to say "hey stream, I am no longer going to read + * from you ever" or "hey stream, I am never going to write to you ever + * again", so I'm really not sure what the right way to handle this is. + * + * I would appreciate pull requests from somebody who actually understands + * how node streams are supposed to function. */ + if(stream.destroy) + stream.destroy() + + if(inflate.destroy) + inflate.destroy() + + return callback(err) + } + + function end() { + if(!--waiting) + return callback( + undefined, + new ImageData(pngWidth, pngHeight, pngPixels, pngTrailer) + ) + } + + stream.on("error", error) + inflate.on("error", error) + + stream.on("end", function() { + stream.destroy() + + if(!pngPixels) + return error(new Error("Missing IHDR chunk. (Corrupt PNG?)")) + + if(!pngTrailer) + return error(new Error("Missing IEND chunk. (Corrupt PNG?)")) + + return end() + }) + + inflate.on("end", function() { + if(inflate.destroy) + inflate.destroy() + + if(p !== pngPixels.length) + return error(new Error("Too little pixel data! (Corrupt PNG?)")) + + return end() + }) + + stream.on("data", function(data) { + /* If an error occurred, bail. */ + if(!stream.readable) + return + + var len = data.length, + i = 0, + tmp + + while(i !== len) + switch(state) { + case 0: /* PNG header */ + if(data[i++] !== HEADER[off++]) + return error(new Error("Invalid PNG header.")) + + if(off === HEADER.length) { + state = 1 + off = 0 + } + break + + case 1: /* PNG chunk length and type */ + if(len - i < 8 - off) { + data.copy(buf, off, i) + off += len - i + i = len + } + + else { + data.copy(buf, off, i, i + 8 - off) + + i += 8 - off + off = 0 + chunkLength = buf.readUInt32BE(0) + + switch(buf.toString("ascii", 4, 8)) { + case "IHDR": + state = 2 + break + + case "PLTE": + /* The PNG spec states that PLTE is only required for type 3. + * It may appear in other types, but is only useful if the + * display does not support true color. Since we're just a data + * storage format, we don't have to worry about it. */ + if(pngColorType !== 3) + state = 7 + + else { + if(chunkLength % 3 !== 0) + return error(new Error("Invalid PLTE size.")) + + pngPaletteEntries = chunkLength / 3 + pngPalette = new Buffer(chunkLength) + state = 3 + } + break + + case "tRNS": + if(pngColorType !== 3) + return error(new Error("tRNS for non-paletted images not yet supported.")) + + pngAlphaEntries = chunkLength + pngAlpha = new Buffer(chunkLength) + state = 4 + break + + case "IDAT": + state = 5 + break + + case "IEND": + state = 6 + break + + default: + state = 7 + break + } + } + break + + case 2: /* IHDR */ + if(chunkLength !== 13) + return error(new Error("Invalid IHDR chunk.")) + + else if(len - i < chunkLength - off) { + data.copy(buf, off, i) + off += len - i + i = len + } + + else { + data.copy(buf, off, i, i + chunkLength - off) + + if(buf.readUInt8(10) !== 0) + return error(new Error("Unsupported compression method.")) + + if(buf.readUInt8(11) !== 0) + return error(new Error("Unsupported filter method.")) + + if(buf.readUInt8(12) !== 0) + return error(new Error("Unsupported interlace method.")) + + i += chunkLength - off + state = 8 + off = 0 + pngWidth = buf.readUInt32BE(0) + pngHeight = buf.readUInt32BE(4) + pngBitDepth = buf.readUInt8(8) + pngDepthMult = 255 / ((1 << pngBitDepth) - 1) + pngColorType = buf.readUInt8(9) + pngPixels = new Buffer(pngWidth * pngHeight * 4) + + switch(pngColorType) { + case 0: + pngSamplesPerPixel = 1 + pngBytesPerPixel = Math.ceil(pngBitDepth * 0.125) + break + + case 2: + pngSamplesPerPixel = 3 + pngBytesPerPixel = Math.ceil(pngBitDepth * 0.375) + break + + case 3: + pngSamplesPerPixel = 1 + pngBytesPerPixel = 1 + break + + case 4: + pngSamplesPerPixel = 2 + pngBytesPerPixel = Math.ceil(pngBitDepth * 0.250) + break + + case 6: + pngSamplesPerPixel = 4 + pngBytesPerPixel = Math.ceil(pngBitDepth * 0.5) + break + + default: + return error( + new Error("Unsupported color type: " + pngColorType) + ) + } + + pngBytesPerScanline = Math.ceil( + pngWidth * pngBitDepth * pngSamplesPerPixel * 0.125 + ) + pngSamples = new Buffer(pngSamplesPerPixel) + currentScanline = new Buffer(pngBytesPerScanline) + priorScanline = new Buffer(pngBytesPerScanline) + currentScanline.fill(0) + } + break + + case 3: /* PLTE */ + if(len - i < chunkLength - off) { + data.copy(pngPalette, off, i) + off += len - i + i = len + } + + else { + data.copy(pngPalette, off, i, i + chunkLength - off) + i += chunkLength - off + state = 8 + off = 0 + } + break + + case 4: /* tRNS */ + if(len - i < chunkLength - off) { + data.copy(pngAlpha, off, i) + off += len - i + i = len + } + + else { + data.copy(pngAlpha, off, i, i + chunkLength - off) + i += chunkLength - off + state = 8 + off = 0 + } + break + + case 5: /* IDAT */ + /* If the amount available is less than the amount remaining, then + * feed as much as we can to the inflator. */ + if(len - i < chunkLength - off) { + /* FIXME: Do I need to be smart and check the return value? */ + inflate.write(data.slice(i)) + off += len - i + i = len + } + + /* Otherwise, write the last bit of the data to the inflator, and + * finish processing the chunk. */ + else { + /* FIXME: Do I need to be smart and check the return value? */ + inflate.write(data.slice(i, i + chunkLength - off)) + i += chunkLength - off + state = 8 + off = 0 + } + break + + case 6: /* IEND */ + if(chunkLength !== 0) + return error(new Error("Invalid IEND chunk.")) + + else if(len - i < 4 - off) { + off += len - i + i = len + } + + else { + pngTrailer = new Buffer(0) + i += 4 - off + state = 9 + off = 0 + + inflate.end() + } + break + + case 7: /* unrecognized chunk */ + if(len - i < chunkLength - off) { + off += len - i + i = len + } + + else { + i += chunkLength - off + state = 8 + off = 0 + } + break + + case 8: /* chunk crc */ + /* FIXME: CRC is blatantly ignored */ + if(len - i < 4 - off) { + off += len - i + i = len + } + + else { + i += 4 - off + state = 1 + off = 0 + } + break + + case 9: /* trailing data */ + /* FIXME: It is inefficient to create a trailer buffer of length zero + * and keep reallocating it every time we want to add more data. */ + tmp = new Buffer(off + len - i) + pngTrailer.copy(tmp) + data.copy(tmp, off, i, len) + pngTrailer = tmp + off += len - i + i = len + break + } + }) + + inflate.on("data", function(data) { + /* If an error occurred, bail. */ + if(!inflate.readable) + return + + var len = data.length, + i, tmp, x, j, k + + for(i = 0; i !== len; ++i) { + if(b === -1) { + scanlineFilter = data[i] + tmp = currentScanline + currentScanline = priorScanline + priorScanline = tmp + } + + else + switch(scanlineFilter) { + case 0: + currentScanline[b] = data[i] + break + + case 1: + currentScanline[b] = + b < pngBytesPerPixel ? + data[i] : + (data[i] + currentScanline[b - pngBytesPerPixel]) & 255 + break + + case 2: + currentScanline[b] = (data[i] + priorScanline[b]) & 255 + break + + case 3: + currentScanline[b] = (data[i] + (( + b < pngBytesPerPixel ? + priorScanline[b] : + currentScanline[b - pngBytesPerPixel] + priorScanline[b] + ) >>> 1)) & 255 + break + + case 4: + currentScanline[b] = (data[i] + ( + b < pngBytesPerPixel ? + priorScanline[b] : + paeth( + currentScanline[b - pngBytesPerPixel], + priorScanline[b], + priorScanline[b - pngBytesPerPixel] + ) + )) & 255 + break + + default: + return error( + new Error("Unsupported scanline filter: " + scanlineFilter) + ) + } + + if(++b === pngBytesPerScanline) { + /* One scanline too many? */ + if(p === pngPixels.length) + return error(new Error("Too much pixel data! (Corrupt PNG?)")) + + /* We have now read a complete scanline, so unfilter it and write it + * into the pixel array. */ + for(j = 0, x = 0; x !== pngWidth; ++x) { + /* Read all of the samples into the sample buffer. */ + for(k = 0; k !== pngSamplesPerPixel; ++j, ++k) + switch(pngBitDepth) { + case 1: + pngSamples[k] = + (currentScanline[(j >>> 3)] >> (7 - (j & 7))) & 1 + break + + case 2: + pngSamples[k] = + (currentScanline[(j >>> 2)] >> ((3 - (j & 3)) << 1)) & 3 + break + + case 4: + pngSamples[k] = + (currentScanline[(j >>> 1)] >> ((1 - (j & 1)) << 2)) & 15 + break + + case 8: + pngSamples[k] = currentScanline[j] + break + + default: + return error(new Error("Unsupported bit depth: " + pngBitDepth)) + } + + /* Write the pixel based off of the samples so collected. */ + switch(pngColorType) { + case 0: + pngPixels[p++] = + pngPixels[p++] = + pngPixels[p++] = pngSamples[0] * pngDepthMult + pngPixels[p++] = 255 + break + + case 2: + pngPixels[p++] = pngSamples[0] * pngDepthMult + pngPixels[p++] = pngSamples[1] * pngDepthMult + pngPixels[p++] = pngSamples[2] * pngDepthMult + pngPixels[p++] = 255 + break + + case 3: + if(pngSamples[0] >= pngPaletteEntries) + return error(new Error("Invalid palette index.")) + + pngPixels[p++] = pngPalette[pngSamples[0] * 3 + 0] + pngPixels[p++] = pngPalette[pngSamples[0] * 3 + 1] + pngPixels[p++] = pngPalette[pngSamples[0] * 3 + 2] + pngPixels[p++] = + pngSamples[0] < pngAlphaEntries ? + pngAlpha[pngSamples[0]] : + 255 + break + + case 4: + pngPixels[p++] = + pngPixels[p++] = + pngPixels[p++] = pngSamples[0] * pngDepthMult + pngPixels[p++] = pngSamples[1] * pngDepthMult + break + + case 6: + pngPixels[p++] = pngSamples[0] * pngDepthMult + pngPixels[p++] = pngSamples[1] * pngDepthMult + pngPixels[p++] = pngSamples[2] * pngDepthMult + pngPixels[p++] = pngSamples[3] * pngDepthMult + break + } + } + + b = -1 + } + } + }) +} + +exports.parseFile = function(pathname, callback) { + return exports.parseStream(fs.createReadStream(pathname), callback) +} + +exports.parseBuffer = function(buf, callback) { + /* Create a mock stream. */ + var s = new stream.Stream() + + /* Set up the destroy functionality. */ + s.readable = true + s.destroy = function() { s.readable = false } + + /* Set up the PNG parsing hooks. */ + exports.parseStream(s, callback) + + /* Send the data down the stream. */ + s.emit("data", buf) + + /* If no errors occurred in the data, close the stream. */ + if(s.readable) + s.emit("end") +} + +/* FIXME: This is deprecated. Remove it in 2.0. */ +exports.parse = exports.parseBuffer diff --git a/node_modules/get-pixels/node_modules/pngparse/indexed.png b/node_modules/get-pixels/node_modules/pngparse/indexed.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7a1b8af58e0d7f2a34c76c7ba57b6fcef054e2 GIT binary patch literal 2814 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 F{{fw^4r~Ab literal 0 HcmV?d00001 diff --git a/node_modules/get-pixels/node_modules/pngparse/test.js b/node_modules/get-pixels/node_modules/pngparse/test.js new file mode 100644 index 0000000..646fb0e --- /dev/null +++ b/node_modules/get-pixels/node_modules/pngparse/test.js @@ -0,0 +1,237 @@ +var assert = require("chai").assert, + fs = require("fs"), + path = require("path"), + png = require("./index") + +describe("PNG", function() { + describe("parseStream", function() { + /* FIXME: Technically, this is tested through all of the other methods, but + * it would be nice to forcibly ensure that it works. One simple way would + * be just to mock parseStream in calls to parseFile and parseBuffer, + * making sure that parseStream gets called. */ + }) + + describe("parseFile", function() { + it("should error out if given a nonexistent file", function(done) { + return png.parseFile(path.join(__dirname, "nonexist.png"), function(err) { + assert.instanceOf(err, Error) + done() + }) + }) + + it("should correctly parse an 8-bit grayscale png", function(done) { + return png.parseFile(path.join(__dirname, "grayscale.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 16) + assert.equal(id.height, 16) + assert.equal(id.data.length, 16 * 16 * 4) + assert.equal(id.trailer.toString(), "Hello, world!\n") + + var y = 16, + x + + while(y--) { + x = 16 + while(x--) + assert.equal(id.getPixel(x, y), (x ^ y) * 286331136 + 255) + } + + done() + }) + }) + + it("should correctly parse an 8-bit truecolor png", function(done) { + return png.parseFile(path.join(__dirname, "truecolor.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 16) + assert.equal(id.height, 16) + assert.equal(id.data.length, 16 * 16 * 4) + assert.equal(id.trailer.length, 0) + + var y = 16, + x + + while(y--) { + x = 16 + while(x--) + assert.equal( + id.getPixel(x, y), + x * 285212672 + y * 1114112 + (x ^ y) * 4352 + 255 + ) + } + + done() + }) + }) + + it("should correctly parse an 8-bit truecolor png with alpha", function(done) { + return png.parseFile(path.join(__dirname, "truecoloralpha.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 16) + assert.equal(id.height, 16) + assert.equal(id.data.length, 16 * 16 * 4) + assert.equal(id.trailer.length, 0) + + var y = 16, + x + + while(y--) { + x = 16 + while(x--) + assert.equal( + id.getPixel(x, y), + x * 285212672 + y * 1114112 + (x ^ y) * 17 + ) + } + + done() + }) + }) + + it("should correctly read image with scanline filter", function(done) { + return png.parseFile(path.join(__dirname, "accum.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 1024) + assert.equal(id.height, 1024) + assert.equal(id.data.length, 1024 * 1024 * 4) + assert.equal(id.trailer.length, 0) + + assert.equal(id.getPixel( 0, 0), 0xFF0000FF) + assert.equal(id.getPixel( 1, 0), 0xFF0000FF) + assert.equal(id.getPixel(420, 308), 0xFF0029FF) + assert.equal(id.getPixel(433, 308), 0x0A299DFF) + assert.equal(id.getPixel(513, 308), 0x0066FFFF) + assert.equal(id.getPixel(728, 552), 0xFF0047FF) + + done() + }) + }) + + it("should correctly read an indexed color image", function(done) { + return png.parseFile(path.join(__dirname, "indexed.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 16) + assert.equal(id.height, 16) + assert.equal(id.data.length, 16 * 16 * 4) + assert.equal(id.trailer.length, 0) + + var y = 16, + x + + while(y--) { + x = 16 + while(x--) + if(x + y < 8) + assert.equal(id.getPixel(x, y), 0xFF0000FF) + + else if(x + y < 16) + assert.equal(id.getPixel(x, y), 0x00FF00FF) + + else if(x + y < 24) + assert.equal(id.getPixel(x, y), 0x0000FFFF) + + else + assert.equal(id.getPixel(x, y), 0x000000FF) + } + + done() + }) + }) + + it("should correctly read an indexed color image with alpha", function(done) { + return png.parseFile(path.join(__dirname, "indexedalpha.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 16) + assert.equal(id.height, 16) + assert.equal(id.data.length, 16 * 16 * 4) + assert.equal(id.trailer.length, 0) + + var y = 16, + x + + while(y--) { + x = 16 + while(x--) + if(x >= 4 && x < 12) + assert.equal(id.getPixel(x, y), 0x00000000) + + else if(x + y < 8) + assert.equal(id.getPixel(x, y), 0xFF0000FF) + + else if(x + y < 16) + assert.equal(id.getPixel(x, y), 0x00FF00FF) + + else if(x + y < 24) + assert.equal(id.getPixel(x, y), 0x0000FFFF) + + else + assert.equal(id.getPixel(x, y), 0x000000FF) + } + + done() + }) + }) + + it("should correctly support crazily-filtered images", function(done) { + return png.parseFile(path.join(__dirname, "paeth.png"), function(err, id) { + assert.isUndefined(err) + assert.equal(id.width, 512) + assert.equal(id.height, 512) + assert.equal(id.data.length, 512 * 512 * 4) + + assert.equal(id.getPixel( 0, 0), 0xFF000000) + assert.equal(id.getPixel( 1, 0), 0xFF000000) + assert.equal(id.getPixel( 0, 1), 0xFF000000) + assert.equal(id.getPixel( 2, 2), 0xFF000000) + assert.equal(id.getPixel( 0, 50), 0xFF000000) + assert.equal(id.getPixel(219, 248), 0xFF000D00) + assert.equal(id.getPixel(220, 248), 0xFF000D00) + assert.equal(id.getPixel(215, 249), 0xFF000C00) + assert.equal(id.getPixel(216, 249), 0xFF000C00) + assert.equal(id.getPixel(217, 249), 0xFF000D00) + assert.equal(id.getPixel(218, 249), 0xFF000D00) + assert.equal(id.getPixel(219, 249), 0xFF000E00) + assert.equal(id.getPixel(220, 249), 0xFF000E00) + assert.equal(id.getPixel(263, 319), 0xFF002100) + assert.equal(id.getPixel(145, 318), 0x05535A00) + assert.equal(id.getPixel(395, 286), 0x0007FF00) + assert.equal(id.getPixel(152, 167), 0x052C3500) + assert.equal(id.getPixel(153, 167), 0x04303600) + assert.equal(id.getPixel(154, 167), 0x042F3700) + assert.equal(id.getPixel(100, 168), 0xFF000400) + assert.equal(id.getPixel(120, 168), 0xFF000900) + assert.equal(id.getPixel(140, 168), 0xFF001B00) + assert.equal(id.getPixel(150, 168), 0x05313600) + assert.equal(id.getPixel(152, 168), 0x04343C00) + assert.equal(id.getPixel(153, 168), 0x03343F00) + assert.equal(id.getPixel(154, 168), 0x03344100) + assert.equal(id.getPixel(155, 168), 0x02344300) + assert.equal(id.getPixel(156, 168), 0x02314400) + assert.equal(id.getPixel(157, 168), 0x02323F00) + assert.equal(id.getPixel(158, 168), 0x03313900) + + done() + }) + }) + }) + + describe("parseBuffer", function() { + it("should bail with an error given an invalid PNG", function(done) { + var buf = new Buffer("I AM NOT ACTUALLY A PNG", "utf8") + + return png.parseBuffer(buf, function(err) { + assert.instanceOf(err, Error) + done() + }) + }) + + it("should return an error if a PNG is normal except for a missing IEND", function(done) { + var buf = new Buffer("89504e470d0a1a0a0000000d49484452000000100000001008000000003a98a0bd000000017352474200aece1ce90000002174455874536f6674776172650047726170686963436f6e7665727465722028496e74656c297787fa190000008849444154789c448e4111c020100363010b58c00216b080052c60010b58c0c259c00216ae4d3b69df99dd0d1062caa5b63ee6b27d1c012996dceae86b6ef38398106acb65ae3e8edbbef780564b5e73743fdb409e1ef2f4803c3de4e901797ac8d3f3f0f490a7077ffffd03f5f507eaeb0fd4d71fa8af3f505f7fa0befe7c7dfdb9000000ffff0300c0fd7f8179301408", "hex") + + return png.parseBuffer(buf, function(err) { + assert.instanceOf(err, Error) + done() + }) + }) + }) +}) diff --git a/node_modules/get-pixels/node_modules/pngparse/truecolor.png b/node_modules/get-pixels/node_modules/pngparse/truecolor.png new file mode 100644 index 0000000000000000000000000000000000000000..838a005375d3e18ca43dca5bafa6ff226837c04b GIT binary patch literal 511 zcmV|?iU8A%=x5izll96CyBWKRCk7ZgcZ zRF`g356#j(dML+3!soCko3T27AA4{nNAbN}%`@D~@9`3eupALO!YXd^x#%YrQYp72 zu4K!Oyp?`3L}-nAybkI4?6@EMj>frps!rY$ecqhiGw(E!Dyxb5(NC33*;PJ0p`ALV zd-b)(Xs*`NO9b1df~Mw*Pa`)7N!X-y*}JxFITma8SrNIjf8u)F)Wsa0=yML=^jF^3 zr@hASdOS}eAVE%;ha-b`(oKjuQ5Dyfic_hzR?n-ynkdNvSGvVr zJ_UdJ%7`#Z%m>hKC@>%!4Brk&q7N=F^+gol3uH>v%{|h4`e}!Cde_%CTC=U%ZzDBL z^R~P`L|Bt)!4PK^=qDUtrUG$B3u5DqlA#?8T!?mgpKPBU-Li#te4DYJ3zmA7 zL2sD|D~P?qvS0%+R?G?m09BwueuRQk$fG9;AN_O?evn-jf1LmT002ovPDHLkV1lSH B;!6Mk literal 0 HcmV?d00001 diff --git a/node_modules/get-pixels/node_modules/pngparse/truecoloralpha.png b/node_modules/get-pixels/node_modules/pngparse/truecoloralpha.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed13ee8d9602089032ce82f56e8967d8ebe0f1a GIT binary patch literal 625 zcmV-%0*?KOP)yv}Wjv55-IwuJozIQubC>DDx>g<*i}OaIsQv^|>L1K&>#i(Wdd1k=r<7++*x(#4~0Z1<3K{ zm^ee7-W?r|6vO7laXPu2x1Af#IZj+>KWC-$Q)afwlF8Od^vM~MYm-+Y$XQ3$r0t2s zM9-w($#@gXS>Kn4)fQ70p^M!YcPx%A(ig8%)K&@I3yp=G#kh<97M`mNC>wU$glwj6 zR^Pm_N!uLX+_{m8q3*IPHtlTeZv1U}?m|!?q6J%mrNQh$j^J5vJvcMa6-ec{ML|1( z-@sllGAaZWh0_jK4o?r+4|5!r9kw509{M_reXuHmpNh^sw0Dp^6~hYSZI>gL)XVFa zH7?UG;g>xxV_o{bcwDTS)NTd%T{LeMq3ZD3Bjs`Qar9H<9Xc%PR8+0cd`ZyuI=O00000 LNkvXXu0mjf*bXEn literal 0 HcmV?d00001 diff --git a/node_modules/get-pixels/node_modules/ppm/.npmignore b/node_modules/get-pixels/node_modules/ppm/.npmignore new file mode 100644 index 0000000..0d1b0b0 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/.npmignore @@ -0,0 +1,15 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +npm-debug.log +node_modules/* \ No newline at end of file diff --git a/node_modules/get-pixels/node_modules/ppm/README.md b/node_modules/get-pixels/node_modules/ppm/README.md new file mode 100644 index 0000000..98b49f2 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/README.md @@ -0,0 +1,38 @@ +ppm +=== +This code implements a streaming parser/serializer for ascii [PPM formatted](http://netpbm.sourceforge.net/doc/ppm.html) images in JavaScript. The PPM file format is very simple and human readable, so it can be useful when debugging graphics applications. The downside though is that PPM is not a very efficient format, and so it is not really suitable for long term archival or transmission of images. For those applications, you should use a standard network image format like PNG or JPEG, depending on your requirements. + +Usage/Installation +================== +To install, first you do: + + npm install ppm + +And here is how you can use it to write/read back an image: + + var ppm = require("ppm"); + + var image = [ + [[255, 0, 0], [255, 0, 0], [255, 0, 0]], + [[0, 255, 0], [0, 255, 0], [0, 255, 0]], + [[0, 0, 255], [0, 0, 255], [0, 0, 255]] + ]; + + ppm.parse(ppm.serialize(image), function(err, img) { + console.log(err, img); + }); + +The API is streaming, and should be compatible with all the stand node.js features from fs/net/etc.. + +`ppm.parse(stream, cb(err, result))` +------------------------------------ +Parses an ASCII ppm file from the stream. When finished, calls result with the error/result of parsing the file. + +`ppm.serialize(image)` +---------------------- +Converts an image into an ASCII ppm stream + + +Credits +======= +(c) 2013 Mikola Lysenko. BSD diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/.travis.yml b/node_modules/get-pixels/node_modules/ppm/node_modules/through/.travis.yml new file mode 100644 index 0000000..895dbd3 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.6 + - 0.8 diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.APACHE2 b/node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.APACHE2 new file mode 100644 index 0000000..6366c04 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.APACHE2 @@ -0,0 +1,15 @@ +Apache License, Version 2.0 + +Copyright (c) 2011 Dominic Tarr + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.MIT b/node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.MIT new file mode 100644 index 0000000..6eafbd7 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/LICENSE.MIT @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2011 Dominic Tarr + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/index.js b/node_modules/get-pixels/node_modules/ppm/node_modules/through/index.js new file mode 100644 index 0000000..d916560 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/index.js @@ -0,0 +1,103 @@ +var Stream = require('stream') + +// through +// +// a stream that does nothing but re-emit the input. +// useful for aggregating a series of changing but not ending streams into one stream) + + + +exports = module.exports = through +through.through = through + +//create a readable writable stream. + +function through (write, end) { + write = write || function (data) { this.queue(data) } + end = end || function () { this.queue(null) } + + var ended = false, destroyed = false, buffer = [] + var stream = new Stream() + stream.readable = stream.writable = true + stream.paused = false + + stream.write = function (data) { + write.call(this, data) + return !stream.paused + } + + function drain() { + while(buffer.length && !stream.paused) { + var data = buffer.shift() + if(null === data) + return stream.emit('end') + else + stream.emit('data', data) + } + } + + stream.queue = stream.push = function (data) { + buffer.push(data) + drain() + return stream + } + + //this will be registered as the first 'end' listener + //must call destroy next tick, to make sure we're after any + //stream piped from here. + //this is only a problem if end is not emitted synchronously. + //a nicer way to do this is to make sure this is the last listener for 'end' + + stream.on('end', function () { + stream.readable = false + if(!stream.writable) + process.nextTick(function () { + stream.destroy() + }) + }) + + function _end () { + stream.writable = false + end.call(stream) + if(!stream.readable) + stream.destroy() + } + + stream.end = function (data) { + if(ended) return + ended = true + if(arguments.length) stream.write(data) + _end() // will emit or queue + return stream + } + + stream.destroy = function () { + if(destroyed) return + destroyed = true + ended = true + buffer.length = 0 + stream.writable = stream.readable = false + stream.emit('close') + return stream + } + + stream.pause = function () { + if(stream.paused) return + stream.paused = true + stream.emit('pause') + return stream + } + stream.resume = function () { + if(stream.paused) { + stream.paused = false + } + drain() + //may have become paused again, + //as drain emits 'data'. + if(!stream.paused) + stream.emit('drain') + return stream + } + return stream +} + diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/package.json b/node_modules/get-pixels/node_modules/ppm/node_modules/through/package.json new file mode 100644 index 0000000..a3e8116 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/package.json @@ -0,0 +1,50 @@ +{ + "name": "through", + "version": "2.2.7", + "description": "simplified stream contruction", + "main": "index.js", + "scripts": { + "test": "set -e; for t in test/*.js; do node $t; done" + }, + "devDependencies": { + "stream-spec": "~0.3.5", + "tape": "~0.2.2" + }, + "keywords": [ + "stream", + "streams", + "user-streams", + "pipe" + ], + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/dominictarr/through.git" + }, + "homepage": "http://github.com/dominictarr/through", + "testling": { + "browsers": [ + "ie/8..latest", + "ff/15..latest", + "chrome/20..latest", + "safari/5.1..latest" + ], + "files": "test/*.js" + }, + "readme": "#through\n\n[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through)\n\nEasy way to create a `Stream` that is both `readable` and `writable`. \n\n* Pass in optional `write` and `end` methods.\n* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`.\n* Use `this.pause()` and `this.resume()` to manage flow.\n* Check `this.paused` to see current flow state. (write always returns `!this.paused`).\n\nThis function is the basis for most of the synchronous streams in \n[event-stream](http://github.com/dominictarr/event-stream).\n\n``` js\nvar through = require('through')\n\nthrough(function write(data) {\n this.queue(data) //data *must* not be null\n },\n function end () { //optional\n this.queue(null)\n })\n```\n\nOr, can also be used _without_ buffering on pause, use `this.emit('data', data)`,\nand this.emit('end')\n\n``` js\nvar through = require('through')\n\nthrough(function write(data) {\n this.emit('data', data)\n //this.pause() \n },\n function end () { //optional\n this.emit('end')\n })\n```\n\n## License\n\nMIT / Apache2\n", + "readmeFilename": "readme.markdown", + "bugs": { + "url": "https://github.com/dominictarr/through/issues" + }, + "_id": "through@2.2.7", + "dist": { + "shasum": "64428449aa8d352a4ec3f3f3cc98ace031e4d85d" + }, + "_from": "through@~2.2.0", + "_resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz" +} diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/readme.markdown b/node_modules/get-pixels/node_modules/ppm/node_modules/through/readme.markdown new file mode 100644 index 0000000..870fdd1 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/readme.markdown @@ -0,0 +1,43 @@ +#through + +[![build status](https://secure.travis-ci.org/dominictarr/through.png)](http://travis-ci.org/dominictarr/through) + +Easy way to create a `Stream` that is both `readable` and `writable`. + +* Pass in optional `write` and `end` methods. +* `through` takes care of pause/resume logic if you use `this.queue(data)` instead of `this.emit('data', data)`. +* Use `this.pause()` and `this.resume()` to manage flow. +* Check `this.paused` to see current flow state. (write always returns `!this.paused`). + +This function is the basis for most of the synchronous streams in +[event-stream](http://github.com/dominictarr/event-stream). + +``` js +var through = require('through') + +through(function write(data) { + this.queue(data) //data *must* not be null + }, + function end () { //optional + this.queue(null) + }) +``` + +Or, can also be used _without_ buffering on pause, use `this.emit('data', data)`, +and this.emit('end') + +``` js +var through = require('through') + +through(function write(data) { + this.emit('data', data) + //this.pause() + }, + function end () { //optional + this.emit('end') + }) +``` + +## License + +MIT / Apache2 diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/buffering.js b/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/buffering.js new file mode 100644 index 0000000..b0084bf --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/buffering.js @@ -0,0 +1,71 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('buffering', function(assert) { + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + assert.deepEqual(actual, [1, 2, 3]) + ts.pause() + ts.write(4) + ts.write(5) + ts.write(6) + assert.deepEqual(actual, [1, 2, 3]) + ts.resume() + assert.deepEqual(actual, [1, 2, 3, 4, 5, 6]) + ts.pause() + ts.end() + assert.ok(!ended) + ts.resume() + assert.ok(ended) + assert.end() +}) + +test('buffering has data in queue, when ends', function (assert) { + + /* + * If stream ends while paused with data in the queue, + * stream should still emit end after all data is written + * on resume. + */ + + var ts = through(function (data) { + this.queue(data) + }, function () { + this.queue(null) + }) + + var ended = false, actual = [] + + ts.on('data', actual.push.bind(actual)) + ts.on('end', function () { + ended = true + }) + + ts.pause() + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.deepEqual(actual, [], 'no data written yet, still paused') + assert.ok(!ended, 'end not emitted yet, still paused') + ts.resume() + assert.deepEqual(actual, [1, 2, 3], 'resumed, all data should be delivered') + assert.ok(ended, 'end should be emitted once all data was delivered') + assert.end(); +}) diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/end.js b/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/end.js new file mode 100644 index 0000000..7321667 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/end.js @@ -0,0 +1,26 @@ +var test = require('tape') +var through = require('../') + +// must emit end before close. + +test('end before close', function (assert) { + var ts = through() + var ended = false, closed = false + + ts.on('end', function () { + assert.ok(!closed) + ended = true + }) + ts.on('close', function () { + assert.ok(ended) + closed = true + }) + + ts.write(1) + ts.write(2) + ts.write(3) + ts.end() + assert.ok(ended) + assert.ok(closed) + assert.end() +}) diff --git a/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/index.js b/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/index.js new file mode 100644 index 0000000..33e33f9 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/node_modules/through/test/index.js @@ -0,0 +1,114 @@ + +var test = require('tape') +var spec = require('stream-spec') +var through = require('../') + +/* + I'm using these two functions, and not streams and pipe + so there is less to break. if this test fails it must be + the implementation of _through_ +*/ + +function write(array, stream) { + array = array.slice() + function next() { + while(array.length) + if(stream.write(array.shift()) === false) + return stream.once('drain', next) + + stream.end() + } + + next() +} + +function read(stream, callback) { + var actual = [] + stream.on('data', function (data) { + actual.push(data) + }) + stream.once('end', function () { + callback(null, actual) + }) + stream.once('error', function (err) { + callback(err) + }) +} + +test('simple defaults', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through() + spec(t) + .through() + .pausable() + .validateOnExit() + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + assert.end() + }) + + write(expected, t) +}); + +test('simple functions', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l * Math.random()) + + var t = through(function (data) { + this.emit('data', data*2) + }) + spec(t) + .through() + .pausable() + .validateOnExit() + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected.map(function (data) { + return data*2 + })) + assert.end() + }) + + write(expected, t) +}) + +test('pauses', function(assert) { + + var l = 1000 + , expected = [] + + while(l--) expected.push(l) //Math.random()) + + var t = through() + spec(t) + .through() + .pausable() + .validateOnExit() + + t.on('data', function () { + if(Math.random() > 0.1) return + t.pause() + process.nextTick(function () { + t.resume() + }) + }) + + read(t, function (err, actual) { + assert.ifError(err) + assert.deepEqual(actual, expected) + assert.end() + }) + + write(expected, t) +}) diff --git a/node_modules/get-pixels/node_modules/ppm/package.json b/node_modules/get-pixels/node_modules/ppm/package.json new file mode 100644 index 0000000..478dd0e --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/package.json @@ -0,0 +1,46 @@ +{ + "name": "ppm", + "version": "0.0.0", + "description": "A simple streaming ascii PPM image parser/writer", + "main": "ppm.js", + "directories": { + "test": "test" + }, + "dependencies": { + "through": "~2.2.0" + }, + "devDependencies": {}, + "scripts": { + "test": "node test/test.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/mikolalysenko/ppm.git" + }, + "keywords": [ + "ppm", + "image", + "file", + "save", + "read", + "write", + "stream" + ], + "author": { + "name": "Mikola Lysenko" + }, + "license": "BSD", + "readmeFilename": "README.md", + "gitHead": "05d913e44f647d9bcdf436e9ecad896bd6e397c8", + "readme": "ppm\n===\nThis code implements a streaming parser/serializer for ascii [PPM formatted](http://netpbm.sourceforge.net/doc/ppm.html) images in JavaScript. The PPM file format is very simple and human readable, so it can be useful when debugging graphics applications. The downside though is that PPM is not a very efficient format, and so it is not really suitable for long term archival or transmission of images. For those applications, you should use a standard network image format like PNG or JPEG, depending on your requirements.\n\nUsage/Installation\n==================\nTo install, first you do:\n\n npm install ppm\n\nAnd here is how you can use it to write/read back an image:\n\n var ppm = require(\"ppm\");\n\n var image = [\n [[255, 0, 0], [255, 0, 0], [255, 0, 0]],\n [[0, 255, 0], [0, 255, 0], [0, 255, 0]],\n [[0, 0, 255], [0, 0, 255], [0, 0, 255]]\n ];\n\n ppm.parse(ppm.serialize(image), function(err, img) {\n console.log(err, img);\n });\n\nThe API is streaming, and should be compatible with all the stand node.js features from fs/net/etc..\n\n`ppm.parse(stream, cb(err, result))`\n------------------------------------\nParses an ASCII ppm file from the stream. When finished, calls result with the error/result of parsing the file.\n\n`ppm.serialize(image)`\n----------------------\nConverts an image into an ASCII ppm stream\n\n\nCredits\n=======\n(c) 2013 Mikola Lysenko. BSD\n", + "bugs": { + "url": "https://github.com/mikolalysenko/ppm/issues" + }, + "homepage": "https://github.com/mikolalysenko/ppm", + "_id": "ppm@0.0.0", + "dist": { + "shasum": "695a9d4ffcaec686a071ba54d3cad91a06aae78e" + }, + "_from": "ppm@0.0.0", + "_resolved": "https://registry.npmjs.org/ppm/-/ppm-0.0.0.tgz" +} diff --git a/node_modules/get-pixels/node_modules/ppm/ppm.js b/node_modules/get-pixels/node_modules/ppm/ppm.js new file mode 100644 index 0000000..bed5bf3 --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/ppm.js @@ -0,0 +1,318 @@ +"use strict"; +var through = require("through"); + +//Create parser state +var PARSER_STATE = { + HEADER: 0, + BODY: 1, + DONE: 2, + ERROR: 3 +}; + +var TOKEN_TYPE = { + HEADER: 0, + NUMBER: 1 +}; + +function makeToken(token, match) { + if(match.type === "header") { + return { + type: TOKEN_TYPE.HEADER, + width: parseInt(match.regex[0]), + height: parseInt(match.regex[1]), + depth: parseInt(match.regex[2]) + }; + } else if(match.type === "rgb") { + return { + type: TOKEN_TYPE.RGB, + rgb: [ parseInt(match.regex[0]), parseInt(match.regex[1]), parseInt(match.regex[2]) ] + }; + } +} + +function PPMParser(stream, cb) { + this.cb = cb; + this.buffer = []; + this.width = 0; + this.height = 0; + this.depth = 0; + this.state = PARSER_STATE.HEADER; + this.cur_row = 0; + this.cur_col = 0; + this.cur_channel = -1; + this.image = []; + + this.buffer = []; + this.ptr = 0; + + this.stream = stream; + this.error_cb = PPMParser.prototype.onerror.bind(this); + this.data_cb = PPMParser.prototype.ondata.bind(this); + this.end_cb = PPMParser.prototype.onend.bind(this); + stream.on("error", this.error_cb); + stream.on("data", this.data_cb); + stream.on("end", this.end_cb); +} + +PPMParser.prototype.next = function(index) { + if(++index[0] >= this.buffer[index[1]].length) { + index[0] = 0; + if(++index[1] >= this.buffer.length) { + index[0] = -1; + index[1] = this.buffer.length; + } + } +} + +PPMParser.prototype.get = function(index) { + if(index[0] < 0) { + return -1; + } + return this.buffer[index[1]][index[0]]; +} + +PPMParser.prototype.ondata = function(data) { + if(this.state === PARSER_STATE.ERROR || data.length === 0) { + return; + } + this.buffer.push(new Buffer(data)); + var ptr = [this.ptr, 0]; + var cur = [0,0]; +tok_loop: + while(ptr[0] >= 0 && + this.state !== PARSER_STATE.ERROR && + this.state !== PARSER_STATE.DONE) { + cur[0] = ptr[0]; + cur[1] = ptr[1]; + switch(this.get(ptr)) { + //Comment + case 35: + while(true) { + var c = this.get(cur); + if(c < 0) { + break tok_loop; + } + if(c === 0x0d || c === 0x0a) { + break; + } + this.next(cur); + } + ptr[0] = cur[0]; + ptr[1] = cur[1]; + break; + + //Whitespace + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x20: + this.next(ptr); + break; + + //Header + case 80: + if(this.get(cur) < 0) { + break tok_loop; + } + this.next(cur); + if(this.get(cur) !== 51) { + return; + } + this.ontoken(TOKEN_TYPE.HEADER); + this.next(cur); + ptr[0] = cur[0]; + ptr[1] = cur[1]; + break; + + //Number + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + case 58: + case 59: + var value = 0; + while(true) { + var x = this.get(cur); + if(x < 0) { + break tok_loop; + } else if(x < 48 || x > 59) { + break; + } + this.next(cur); + value = value * 10 + x - 48; + } + this.ontoken(TOKEN_TYPE.NUMBER, value); + ptr[0] = cur[0]; + ptr[1] = cur[1]; + break; + + case -1: + break tok_loop; + break; + + default: + this.onerror(new Error("Invalid character in token stream: " + this.get(ptr))); + return; + } + } + //Advance pointer + if(ptr[0] < 0) { + this.ptr = 0; + this.buffer.length = 0; + } else { + this.ptr = ptr[0]; + if(ptr[1] > 0) { + this.buffer.splice(0, ptr[1]); + } + } +}; + +PPMParser.prototype.onerror = function(err) { + if(this.state === PARSER_STATE.ERROR || this.state === PARSER_STATE.DONE) { + return; + } + this.buffer = []; + this.image = []; + this.stream.removeListener("data", this.data_cb); + this.stream.removeListener("error", this.error_cb); + this.stream.removeListener("end", this.end_cb); + this.state = PARSER_STATE.ERROR; + this.cb(err, null); + this.data_cb = this.error_cb = this.end_cb = null; +} + +PPMParser.prototype.ontoken = function(type, value) { + switch(this.state) { + case PARSER_STATE.HEADER: + if(this.cur_channel < 0 && type === TOKEN_TYPE.HEADER) { + //Keep reading header, set channel to 1 + this.cur_channel = 0; + } else if(this.cur_channel >= 0 && type === TOKEN_TYPE.NUMBER) { + switch(this.cur_channel) { + case 0: + this.width = value; + break; + case 1: + this.height = value; + break; + case 2: + this.depth = value; + this.image = new Array(this.height); + for(var i=0; i= 3) { + this.cur_channel = 0; + if(++this.cur_col >= this.width) { + this.cur_col = 0; + if(++this.cur_row >= this.height) { + this.state = PARSER_STATE.DONE; + } + } + } + break; + + case PARSER_STATE.DONE: + case PARSER_STATE.ERROR: + break; + + default: + break; + } +}; + +PPMParser.prototype.onend = function() { + this.ondata(new Buffer("\n")); + + switch(this.state) { + case PARSER_STATE.ERROR: + break; + + case PARSER_STATE.DONE: + this.buffer.length = 0;; + this.cb(null, this.image); + break; + + default: + this.state = PARSER_STATE.ERROR; + this.cb(new Error("Unexpected EOF"), null); + break; + } +} + +//Parses a ppm image +exports.parse = function(stream, cb) { + return new PPMParser(stream, cb); +} + +//Writes a PPM image to file +function PPMWriter(image) { + this.stream = through(); + this.image = image; + this.cur_row = 0; + this.cur_col = 0; + this.drain_cb = PPMWriter.prototype.writeBody.bind(this); + + this.stream.on("drain", this.drain_cb); + process.nextTick(PPMWriter.prototype.writeHeader.bind(this)); +} + +PPMWriter.prototype.writeHeader = function() { + if(this.stream.write("P3\n#JS PPM\n" + this.image[0].length + " " + this.image.length + "\n255\n")) { + this.writeBody(); + } +} + +PPMWriter.prototype.writeBody = function() { + while(this.stream.write(this.image[this.cur_row][this.cur_col].join(" ")+" ")) { + if(++this.cur_col >= this.image[0].length) { + this.cur_col = 0; + if(++this.cur_row >= this.image.length) { + this.stream.removeListener("drain", this.drain_cb); + this.stream.end("\n"); + break; + } + } + } +} + +//Serializes an image to a ppm +exports.serialize = function(image) { + var writer = new PPMWriter(image); + return writer.stream; +} diff --git a/node_modules/get-pixels/node_modules/ppm/test/test.js b/node_modules/get-pixels/node_modules/ppm/test/test.js new file mode 100644 index 0000000..dc9f0ad --- /dev/null +++ b/node_modules/get-pixels/node_modules/ppm/test/test.js @@ -0,0 +1,11 @@ +var ppm = require("../ppm.js"); + +var image = [ + [[255, 0, 0], [255, 0, 0], [255, 0, 0]], + [[0, 255, 0], [0, 255, 0], [0, 255, 0]], + [[0, 0, 255], [0, 0, 255], [0, 0, 255]] +]; + +ppm.parse(ppm.serialize(image), function(err, img) { + console.log(err, img); +}); \ No newline at end of file diff --git a/node_modules/get-pixels/package.json b/node_modules/get-pixels/package.json new file mode 100644 index 0000000..854f949 --- /dev/null +++ b/node_modules/get-pixels/package.json @@ -0,0 +1,57 @@ +{ + "name": "get-pixels", + "version": "1.0.1", + "description": "Reads the pixels of an image as an ndarray", + "main": "node-pixels.js", + "directories": { + "test": "test" + }, + "dependencies": { + "ndarray": "~1.0.0", + "pngparse": "~1.1.4", + "ppm": "0.0.0", + "ndarray-pack": "1.0.0" + }, + "devDependencies": { + "tap": "~0.4.2" + }, + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/mikolalysenko/get-pixels.git" + }, + "keywords": [ + "ndarray", + "pixel", + "get", + "read", + "pixel", + "image", + "png", + "jpeg", + "parse", + "dom", + "node", + "browserify" + ], + "browser": "dom-pixels.js", + "author": { + "name": "Mikola Lysenko" + }, + "license": "MIT", + "readmeFilename": "README.md", + "gitHead": "380bbda330666e4a4066c48ef5a42770d13bcd5c", + "readme": "get-pixels\n==========\nGiven a URL/path, grab all the pixels in an image and return the result as an [ndarray](https://github.com/mikolalysenko/ndarray). Works both in browserify and in node.js.\n\n**Note** On the node side, currently only supports PNG and PPM. Patches welcome!!!\n\nExample\n=======\n\n```javascript\nvar getPixels = require(\"get-pixels\")\n\ngetPixels(\"lena.png\", function(err, pixels) {\n if(err) {\n console.log(\"Bad image path\")\n return\n }\n console.log(\"got pixels\", pixels.shape)\n})\n```\n\nInstall\n=======\n\n npm install get-pixels\n\n### `require(\"get-pixels\")(url, cb(err, pixels))`\nReads all the pixels from url into an ndarray.\n\n* `url` is the path to the file\n* `cb(err, pixels)` is a callback which gets triggered once the image is loaded.\n\n**Returns** An ndarray of pixels in raster order having shape equal to `[rows, columns, channels]`.\n\nCredits\n=======\n(c) 2013 Mikola Lysenko. MIT License", + "bugs": { + "url": "https://github.com/mikolalysenko/get-pixels/issues" + }, + "homepage": "https://github.com/mikolalysenko/get-pixels", + "_id": "get-pixels@1.0.1", + "dist": { + "shasum": "40be6c1b11d5c467b79fc715c4d194a7ae6140d2" + }, + "_from": "get-pixels@", + "_resolved": "https://registry.npmjs.org/get-pixels/-/get-pixels-1.0.1.tgz" +} diff --git a/node_modules/jquery/.bowerrc b/node_modules/jquery/.bowerrc new file mode 100644 index 0000000..baa91a3 --- /dev/null +++ b/node_modules/jquery/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "bower_components" +} \ No newline at end of file diff --git a/node_modules/jquery/.npmignore b/node_modules/jquery/.npmignore new file mode 100644 index 0000000..595cb6a --- /dev/null +++ b/node_modules/jquery/.npmignore @@ -0,0 +1,13 @@ +.jshintignore +.jshintrc + +/.editorconfig +/.gitattributes +/.jscs.json +/.mailmap +/.travis.yml + +/build +/speed +/test +/Gruntfile.js diff --git a/node_modules/jquery/AUTHORS.txt b/node_modules/jquery/AUTHORS.txt new file mode 100644 index 0000000..f5c06a6 --- /dev/null +++ b/node_modules/jquery/AUTHORS.txt @@ -0,0 +1,217 @@ +Authors ordered by first contribution. + +John Resig +Gilles van den Hoven +Michael Geary +Stefan Petre +Yehuda Katz +Corey Jewett +Klaus Hartl +Franck Marcia +Jörn Zaefferer +Paul Bakaus +Brandon Aaron +Mike Alsup +Dave Methvin +Ed Engelhardt +Sean Catchpole +Paul Mclanahan +David Serduke +Richard D. Worth +Scott González +Ariel Flesler +Jon Evans +TJ Holowaychuk +Michael Bensoussan +Robert Katić +Louis-Rémi Babé +Earle Castledine +Damian Janowski +Rich Dougherty +Kim Dalsgaard +Andrea Giammarchi +Mark Gibson +Karl Swedberg +Justin Meyer +Ben Alman +James Padolsey +David Petersen +Batiste Bieler +Alexander Farkas +Rick Waldron +Filipe Fortes +Neeraj Singh +Paul Irish +Iraê Carvalho +Matt Curry +Michael Monteleone +Noah Sloan +Tom Viner +Douglas Neiner +Adam J. Sontag +Dave Reed +Ralph Whitbeck +Carl Fürstenberg +Jacob Wright +J. Ryan Stinnett +unknown +temp01 +Heungsub Lee +Colin Snover +Ryan W Tenney +Pinhook +Ron Otten +Jephte Clain +Anton Matzneller +Alex Sexton +Dan Heberden +Henri Wiechers +Russell Holbrook +Julian Aubourg +Gianni Alessandro Chiappetta +Scott Jehl +James Burke +Jonas Pfenniger +Xavi Ramirez +Jared Grippe +Sylvester Keil +Brandon Sterne +Mathias Bynens +Timmy Willison +Corey Frang +Digitalxero +Anton Kovalyov +David Murdoch +Josh Varner +Charles McNulty +Jordan Boesch +Jess Thrysoee +Michael Murray +Lee Carpenter +Alexis Abril +Rob Morgan +John Firebaugh +Sam Bisbee +Gilmore Davidson +Brian Brennan +Xavier Montillet +Daniel Pihlstrom +Sahab Yazdani +avaly +Scott Hughes +Mike Sherov +Greg Hazel +Schalk Neethling +Denis Knauf +Timo Tijhof +Steen Nielsen +Anton Ryzhov +Shi Chuan +Berker Peksag +Toby Brain +Matt Mueller +Justin +Daniel Herman +Oleg Gaidarenko +Richard Gibson +Rafaël Blais Masson +cmc3cn <59194618@qq.com> +Joe Presbrey +Sindre Sorhus +Arne de Bree +Vladislav Zarakovsky +Andrew E Monat +Oskari +Joao Henrique de Andrade Bruni +tsinha +Matt Farmer +Trey Hunner +Jason Moon +Jeffery To +Kris Borchers +Vladimir Zhuravlev +Jacob Thornton +Chad Killingsworth +Nowres Rafid +David Benjamin +Uri Gilad +Chris Faulkner +Elijah Manor +Daniel Chatfield +Nikita Govorov +Wesley Walser +Mike Pennisi +Markus Staab +Dave Riddle +Callum Macrae +Benjamin Truyman +James Huston +Erick Ruiz de Chávez +David Bonner +Akintayo Akinwunmi +MORGAN +Ismail Khair +Carl Danley +Mike Petrovich +Greg Lavallee +Daniel Gálvez +Sai Lung Wong +Tom H Fuertes +Roland Eckl +Jay Merrifield +Allen J Schmidt Jr +Jonathan Sampson +Marcel Greter +Matthias Jäggli +David Fox +Yiming He +Devin Cooper +Paul Ramos +Rod Vagg +Bennett Sorbo +Sebastian Burkhard +Zachary Adam Kaplan +nanto_vi +nanto +Danil Somsikov +Ryunosuke SATO +Jean Boussier +Adam Coulombe +Andrew Plummer +Mark Raddatz +Isaac Z. Schlueter +Karl Sieburg +Pascal Borreli +Nguyen Phuc Lam +Dmitry Gusev +Michał Gołębiowski +Li Xudong +Steven Benner +Tom H Fuertes +Renato Oliveira dos Santos +ros3cin +Jason Bedard +Kyle Robinson Young +Chris Talkington +Eddie Monge +Terry Jones +Jason Merino +Jeremy Dunck +Chris Price +Guy Bedford +Amey Sakhadeo +Mike Sidorov +Anthony Ryan +Dominik D. Geyer +George Kats +Lihan Li +Ronny Springer +Chris Antaki +Marian Sollmann +njhamann +Ilya Kantor +hongymagic +John Paul +Jakob Stoeck +Christopher Jones +Forbes Lindesay diff --git a/node_modules/jquery/CONTRIBUTING.md b/node_modules/jquery/CONTRIBUTING.md new file mode 100644 index 0000000..dd6b183 --- /dev/null +++ b/node_modules/jquery/CONTRIBUTING.md @@ -0,0 +1,214 @@ +# Contributing to jQuery + +1. [Getting Involved](#getting-involved) +2. [Discussion](#discussion) +3. [How To Report Bugs](#how-to-report-bugs) +4. [Core Style Guide](#jquery-core-style-guide) +5. [Tips For Bug Patching](#tips-for-bug-patching) + + + +## Getting Involved + +There are a number of ways to get involved with the development of jQuery core. Even if you've never contributed code to an Open Source project before, we're always looking for help identifying bugs, writing and reducing test cases and documentation. + +This is the best way to contribute to jQuery core. Please read through the full guide detailing [How to Report Bugs](#how-to-report-bugs). + +## Discussion + +### Forum and IRC + +The jQuery core development team frequently tracks posts on the [jQuery Development Forum](http://forum.jquery.com/developing-jquery-core). If you have longer posts or questions please feel free to post them there. If you think you've found a bug please [file it in the bug tracker](#how-to-report-bugs). + +Additionally most of the jQuery core development team can be found in the [#jquery-dev](http://webchat.freenode.net/?channels=jquery-dev) IRC channel on irc.freenode.net. + +### Weekly Status Meetings + +Every week (unless otherwise noted) the jQuery core dev team has a meeting to discuss the progress of current work and to bring forward possible new blocker bugs for discussion. + +The meeting is held in the [#jquery-meeting](http://webchat.freenode.net/?channels=jquery-meeting) IRC channel on irc.freenode.net at [Noon EST](http://www.timeanddate.com/worldclock/fixedtime.html?month=1&day=17&year=2011&hour=12&min=0&sec=0&p1=43) on Mondays. + +[Past Meeting Notes](https://docs.google.com/document/d/1MrLFvoxW7GMlH9KK-bwypn77cC98jUnz7sMW1rg_TP4/edit?hl=en) + + +## How to Report Bugs + +### Make sure it is a jQuery bug + +Many bugs reported to our bug tracker are actually bugs in user code, not in jQuery code. Keep in mind that just because your code throws an error and the console points to a line number inside of jQuery, this does *not* mean the bug is a jQuery bug; more often than not, these errors result from providing incorrect arguments when calling a jQuery function. + +If you are new to jQuery, it is usually a much better idea to ask for help first in the [Using jQuery Forum](http://forum.jquery.com/using-jquery) or the [jQuery IRC channel](http://webchat.freenode.net/?channels=%23jquery). You will get much quicker support, and you will help avoid tying up the jQuery team with invalid bug reports. These same resources can also be useful if you want to confirm that your bug is indeed a bug in jQuery before filing any tickets. + + +### Disable any browser extensions + +Make sure you have reproduced the bug with all browser extensions and add-ons disabled, as these can sometimes cause things to break in interesting and unpredictable ways. Try using incognito, stealth or anonymous browsing modes. + + +### Try the latest version of jQuery + +Bugs in old versions of jQuery may have already been fixed. In order to avoid reporting known issues, make sure you are always testing against the [latest build](http://code.jquery.com/jquery.js). + +### Try an older version of jQuery + +Sometimes, bugs are introduced in newer versions of jQuery that do not exist in previous versions. When possible, it can be useful to try testing with an older release. + +### Reduce, reduce, reduce! + +When you are experiencing a problem, the most useful thing you can possibly do is to [reduce your code](http://webkit.org/quality/reduction.html) to the bare minimum required to reproduce the issue. This makes it *much* easier to isolate and fix the offending code. Bugs that are reported without reduced test cases take on average 9001% longer to fix than bugs that are submitted with them, so you really should try to do this if at all possible. + +## jQuery Core Style Guide + +See: [jQuery's Style Guides](http://contribute.jquery.org/style-guide/) + +## Tips For Bug Patching + + +### Environment: localhost w/ PHP, Node & Grunt + +Starting in jQuery 1.8, a newly overhauled development workflow has been introduced. In this new system, we rely on node & gruntjs to automate the building and validation of source code—while you write code. + +The Ajax tests still depend on PHP running locally*, so make sure you have the following installed: + +* Some kind of localhost server program that supports PHP (any will do) +* Node.js +* NPM (comes with the latest version of Node.js) +* Grunt (install with: `npm install grunt -g` + + +Maintaining a list of platform specific instructions is outside of the scope of this document and there is plenty of existing documentation for the above technologies. + +* The PHP dependency will soon be shed in favor of an all-node solution. + + +### Build a Local Copy of jQuery + +Create a fork of the jQuery repo on github at http://github.com/jquery/jquery + +Change directory to your web root directory, whatever that might be: + +```bash +$ cd /path/to/your/www/root/ +``` + +Clone your jQuery fork to work locally + +```bash +$ git clone git@github.com:username/jquery.git +``` + +Change directory to the newly created dir jquery/ + +```bash +$ cd jquery +``` + +Add the jQuery master as a remote. I label mine "upstream" + +```bash +$ git remote add upstream git://github.com/jquery/jquery.git +``` + +Get in the habit of pulling in the "upstream" master to stay up to date as jQuery receives new commits + +```bash +$ git pull upstream master +``` + +Run the Grunt tools: + +```bash +$ grunt && grunt watch +``` + +Now open the jQuery test suite in a browser at http://localhost/test. If there is a port, be sure to include it. + +Success! You just built and tested jQuery! + + +### Fix a bug from a ticket filed at bugs.jquery.com: + +**NEVER write your patches to the master branch** - it gets messy (I say this from experience!) + +**ALWAYS USE A "TOPIC" BRANCH!** Like so (#### = the ticket #)... + +Make sure you start with your up-to-date master: + +```bash +$ git checkout master +``` + +Create and checkout a new branch that includes the ticket # + +```bash +$ git checkout -b bug_#### + +# ( Explanation: this useful command will: +# "checkout" a "-b" (branch) by the name of "bug_####" +# or create it if it doesn't exist ) +``` + +Now you're on branch: bug_#### + +Determine the module/file you'll be working in... + +Open up the corresponding /test/unit/?????.js and add the initial failing unit tests. This may seem awkward at first, but in the long run it will make sense. To truly and efficiently patch a bug, you need to be working against that bug. + +Next, open the module files and make your changes + +Run http://localhost/test --> **ALL TESTS MUST PASS** + +Once you're satisfied with your patch... + +Stage the files to be tracked: + +```bash +$ git add filename +# (you can use "git status" to list the files you've changed) +``` + + +( I recommend NEVER, EVER using "git add . " ) + +Once you've staged all of your changed files, go ahead and commit them + +```bash +$ git commit -m "Brief description of fix. Fixes #0000" +``` + +For a multiple line commit message, leave off the `-m "description"`. + +You will then be led into vi (or the text editor that you have set up) to complete your commit message. + +Then, push your branch with the bug fix commits to your github fork + +```bash +$ git push origin -u bug_#### +``` + +Before you tackle your next bug patch, return to the master: + +```bash +$ git checkout master +``` + + + +### Test Suite Tips... + +During the process of writing your patch, you will run the test suite MANY times. You can speed up the process by narrowing the running test suite down to the module you are testing by either double clicking the title of the test or appending it to the url. The following examples assume you're working on a local repo, hosted on your localhost server. + +Example: + +http://localhost/test/?filter=css + +This will only run the "css" module tests. This will significantly speed up your development and debugging. + +**ALWAYS RUN THE FULL SUITE BEFORE COMMITTING AND PUSHING A PATCH!** + + +### Browser support + +Remember that jQuery supports multiple browsers and their versions; any contributed code must work in all of them. You can refer to the [browser support page](http://jquery.com/browser-support/) for the current list of supported browsers. + +Note that browser support differs depending on whether you are targeting the `master` or `1.x-master` branch. diff --git a/node_modules/jquery/MIT-LICENSE.txt b/node_modules/jquery/MIT-LICENSE.txt new file mode 100644 index 0000000..cdd31b5 --- /dev/null +++ b/node_modules/jquery/MIT-LICENSE.txt @@ -0,0 +1,21 @@ +Copyright 2014 jQuery Foundation and other contributors +http://jquery.com/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/jquery/README.md b/node_modules/jquery/README.md new file mode 100644 index 0000000..059177e --- /dev/null +++ b/node_modules/jquery/README.md @@ -0,0 +1,372 @@ +[jQuery](http://jquery.com/) - New Wave JavaScript +================================================== + +Contribution Guides +-------------------------------------- + +In the spirit of open source software development, jQuery always encourages community code contribution. To help you get started and before you jump into writing code, be sure to read these important contribution guidelines thoroughly: + +1. [Getting Involved](http://contribute.jquery.org/) +2. [Core Style Guide](http://contribute.jquery.org/style-guide/js/) +3. [Writing Code for jQuery Foundation Projects](http://contribute.jquery.org/code/) + + +Environments in which to use jQuery +-------------------------------------- + +- [Browser support](http://jquery.com/browser-support/) differs between the master (2.x) branch and the 1.x-master branch. Specifically, 2.x does not support legacy browsers such as IE6-8. The jQuery team continues to provide support for legacy browsers on the 1.x-master branch. Use the latest 1.x release if support for those browsers is required. See [browser support](http://jquery.com/browser-support/) for more info. +- To use jQuery in Node, browser extensions, and other non-browser environments, use only **2.x** releases. 1.x does not support these environments. + + +What you need to build your own jQuery +-------------------------------------- + +In order to build jQuery, you need to have Node.js/npm latest and git 1.7 or later. +(Earlier versions might work OK, but are not tested.) + +For Windows you have to download and install [git](http://git-scm.com/downloads) and [Node.js](http://nodejs.org/download/). + +Mac OS users should install [Homebrew](http://mxcl.github.com/homebrew/). Once Homebrew is installed, run `brew install git` to install git, +and `brew install node` to install Node.js. + +Linux/BSD users should use their appropriate package managers to install git and Node.js, or build from source +if you swing that way. Easy-peasy. + + +How to build your own jQuery +---------------------------- + +Clone a copy of the main jQuery git repo by running: + +```bash +git clone git://github.com/jquery/jquery.git +``` + +Enter the jquery directory and run the build script: +```bash +cd jquery && npm run build +``` +The built version of jQuery will be put in the `dist/` subdirectory, along with the minified copy and associated map file. + +If you want create custom build or help with jQuery development, it would be better to install [grunt command line interface](https://github.com/gruntjs/grunt-cli) as a global package: + +``` +npm install -g grunt-cli +``` +Make sure you have `grunt` installed by testing: +``` +grunt -v +``` + +Now by running `grunt` command, in the jquery directory, you could build full version of jQuery, just like with `npm run build` command: +``` +grunt +``` + +There are many other tasks available for jQuery Core: +``` +grunt -help +``` + +### Modules + +Special builds can be created that exclude subsets of jQuery functionality. +This allows for smaller custom builds when the builder is certain that those parts of jQuery are not being used. +For example, an app that only used JSONP for `$.ajax()` and did not need to calculate offsets or positions of elements could exclude the offset and ajax/xhr modules. + +Any module may be excluded except for `core`, and `selector`. To exclude a module, pass its path relative to the `src` folder (without the `.js` extension). + +Some example modules that can be excluded are: + +- **ajax**: All AJAX functionality: `$.ajax()`, `$.get()`, `$.post()`, `$.ajaxSetup()`, `.load()`, transports, and ajax event shorthands such as `.ajaxStart()`. +- **ajax/xhr**: The XMLHTTPRequest AJAX transport only. +- **ajax/script**: The ` + + + + + + + diff --git a/node_modules/jquery/src/sizzle/test/data/testinit.js b/node_modules/jquery/src/sizzle/test/data/testinit.js new file mode 100644 index 0000000..1c49c7a --- /dev/null +++ b/node_modules/jquery/src/sizzle/test/data/testinit.js @@ -0,0 +1,136 @@ +var fireNative, + jQuery = this.jQuery || "jQuery", // For testing .noConflict() + $ = this.$ || "$", + originaljQuery = jQuery, + original$ = $; + +(function() { + // Config parameter to force basic code paths + QUnit.config.urlConfig.push({ + id: "basic", + label: "Bypass optimizations", + tooltip: "Force use of the most basic code by disabling native querySelectorAll; contains; compareDocumentPosition" + }); + if ( QUnit.urlParams.basic ) { + document.querySelectorAll = null; + document.documentElement.contains = null; + document.documentElement.compareDocumentPosition = null; + // Return array of length two to pass assertion + // But support should be false as its not native + document.getElementsByClassName = function() { return [ 0, 1 ]; }; + } +})(); + +/** + * Returns an array of elements with the given IDs + * @example q("main", "foo", "bar") + * @result [

, , ] + */ +function q() { + var r = [], + i = 0; + + for ( ; i < arguments.length; i++ ) { + r.push( document.getElementById( arguments[i] ) ); + } + return r; +} + +/** + * Asserts that a select matches the given IDs + * @param {String} a - Assertion name + * @param {String} b - Sizzle selector + * @param {String} c - Array of ids to construct what is expected + * @example t("Check for something", "//[a]", ["foo", "baar"]); + * @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar' + */ +function t( a, b, c ) { + var f = Sizzle(b), + s = "", + i = 0; + + for ( ; i < f.length; i++ ) { + s += ( s && "," ) + '"' + f[ i ].id + '"'; + } + + deepEqual(f, q.apply( q, c ), a + " (" + b + ")"); +} + +/** + * Add random number to url to stop caching + * + * @example url("data/test.html") + * @result "data/test.html?10538358428943" + * + * @example url("data/test.php?foo=bar") + * @result "data/test.php?foo=bar&10538358345554" + */ +function url( value ) { + return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000); +} + +var createWithFriesXML = function() { + var string = ' \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + 1 \ + \ + \ + \ + \ + foo \ + \ + \ + \ + \ + \ + \ + '; + + return jQuery.parseXML( string ); +}; + +fireNative = document.createEvent ? + function( node, type ) { + var event = document.createEvent("HTMLEvents"); + event.initEvent( type, true, true ); + node.dispatchEvent( event ); + } : + function( node, type ) { + var event = document.createEventObject(); + node.fireEvent( "on" + type, event ); + }; + +function testIframeWithCallback( title, fileName, func ) { + test( title, function() { + var iframe; + + stop(); + window.iframeCallback = function() { + var self = this, + args = arguments; + setTimeout(function() { + window.iframeCallback = undefined; + iframe.remove(); + func.apply( self, args ); + func = function() {}; + start(); + }, 0 ); + }; + iframe = jQuery( "
" ).css({ position: "absolute", width: "500px", left: "-600px" }) + .append( jQuery( " +
+ + +
+
+ +
+ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
hi there
+
+
+
+
+
+
+
+ +
+
+
+ + +
+ + +
+ + +
C
+
+
+ +
+
    +
  1. Rice
  2. +
  3. Beans
  4. +
  5. Blinis
  6. +
  7. Tofu
  8. +
+ +
I'm hungry. I should...
+ ...Eat lots of food... | + ...Eat a little food... | + ...Eat no food... + ...Eat a burger... + ...Eat some funyuns... + ...Eat some funyuns... +
+ +
+ + +
+ +
+ 1 + 2 + + + + + + + + +
​ +
+ +
+ + diff --git a/node_modules/jquery/src/sizzle/test/jquery.js b/node_modules/jquery/src/sizzle/test/jquery.js new file mode 100644 index 0000000..86a3305 --- /dev/null +++ b/node_modules/jquery/src/sizzle/test/jquery.js @@ -0,0 +1,9597 @@ +/*! + * jQuery JavaScript Library v1.9.1 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-2-4 + */ +(function( window, undefined ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +//"use strict"; +var + // The deferred used on DOM ready + readyList, + + // A central reference to the root jQuery(document) + rootjQuery, + + // Support: IE<9 + // For `typeof node.method` instead of `node.method !== undefined` + core_strundefined = typeof undefined, + + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + location = window.location, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // [[Class]] -> type pairs + class2type = {}, + + // List of deleted data cache ids, so we can reuse them + core_deletedIds = [], + + core_version = "1.9.1", + + // Save a reference to some core methods + core_concat = core_deletedIds.concat, + core_push = core_deletedIds.push, + core_slice = core_deletedIds.slice, + core_indexOf = core_deletedIds.indexOf, + core_toString = class2type.toString, + core_hasOwn = class2type.hasOwnProperty, + core_trim = core_version.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + + // Used for splitting on whitespace + core_rnotwhite = /\S+/g, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }, + + // The ready event handler + completed = function( event ) { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } + }, + // Clean-up method for dom ready events + detach = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: core_version, + + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return core_slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: core_push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger("ready").off("ready"); + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + if ( obj == null ) { + return String( obj ); + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ core_toString.call(obj) ] || "object" : + typeof obj; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // keepScripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, keepScripts ) { + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + context = context || document; + + var parsed = rsingleTag.exec( data ), + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ); + if ( scripts ) { + jQuery( scripts ).remove(); + } + return jQuery.merge( [], parsed.childNodes ); + }, + + parseJSON: function( data ) { + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + if ( data === null ) { + return data; + } + + if ( typeof data === "string" ) { + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + if ( data ) { + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + } + } + } + + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + if ( !data || typeof data !== "string" ) { + return null; + } + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + core_push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return core_concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || type !== "function" && + ( length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj ); +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( list && ( !fired || stack ) ) { + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function() { + + var support, all, a, + input, select, fragment, + opt, eventName, isSupported, i, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = "
a"; + + // Support tests won't run in some limited or non-browser environments + all = div.getElementsByTagName("*"); + a = div.getElementsByTagName("a")[ 0 ]; + if ( !all || !a || !all.length ) { + return {}; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + support = { + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.5/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) + checkOn: !!input.value, + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Tests for enctype support on a form (#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode + boxModel: document.compatMode === "CSS1Compat", + + // Will be defined later + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + boxSizingReliable: true, + pixelPosition: false + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Support: IE<9 + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + // Check if we can trust getAttribute("value") + input = document.createElement("input"); + input.setAttribute( "value", "" ); + support.input = input.getAttribute( "value" ) === ""; + + // Check if an input maintains its value after becoming a radio + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "checked", "t" ); + input.setAttribute( "name", "t" ); + + fragment = document.createDocumentFragment(); + fragment.appendChild( input ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php + for ( i in { submit: true, change: true, focusin: true }) { + div.setAttribute( eventName = "on" + i, "t" ); + + support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; + } + + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, marginDiv, tds, + divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; + + body.appendChild( container ).appendChild( div ); + + // Support: IE8 + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + div.innerHTML = "
t
"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Support: IE8 + // Check if empty table cells still have offsetWidth/Height + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + support.boxSizing = ( div.offsetWidth === 4 ); + support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 ); + + // Use window.getComputedStyle because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = div.appendChild( document.createElement("div") ); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== core_strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + div.style.display = "block"; + div.innerHTML = "
"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + if ( support.inlineBlockNeedsLayout ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); + + // Null elements to avoid leaks in IE + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + all = select = fragment = opt = a = input = null; + + return support; +})(); + +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +function internalData( elem, name, data, pvt /* Internal Use Only */ ){ + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var i, l, thisCache, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + // Do not set data on non-element because it will not be cleared (#8335). + if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { + return false; + } + + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var attrs, name, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attrs = elem.attributes; + for ( ; i < attrs.length; i++ ) { + name = attrs[i].name; + + if ( !name.indexOf( "data-" ) ) { + name = jQuery.camelCase( name.slice(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + // Try to fetch any internally stored data first + return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; + } + + this.each(function() { + jQuery.data( this, key, value ); + }); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + hooks.cur = fn; + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, + rclass = /[\t\r\n]/g, + rreturn = /\r/g, + rfocusable = /^(?:input|select|textarea|button|object)$/i, + rclickable = /^(?:a|area)$/i, + rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i, + ruseDefault = /^(?:checked|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + getSetInput = jQuery.support.input; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + elem.className = jQuery.trim( cur ); + + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = arguments.length === 0 || typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + elem.className = value ? jQuery.trim( cur ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.match( core_rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + // Toggle whole class name + } else if ( type === core_strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed "false", + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var ret, hooks, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val, + self = jQuery(this); + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && + ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attr: function( elem, name, value ) { + var hooks, notxml, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === core_strundefined ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + // In IE9+, Flash objects don't have .getAttribute (#12945) + // Support: IE9+ + if ( typeof elem.getAttribute !== core_strundefined ) { + ret = elem.getAttribute( name ); + } + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( core_rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( rboolean.test( name ) ) { + // Set corresponding property to false for boolean attributes + // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8 + if ( !getSetAttribute && ruseDefault.test( name ) ) { + elem[ jQuery.camelCase( "default-" + name ) ] = + elem[ propName ] = false; + } else { + elem[ propName ] = false; + } + + // See #9699 for explanation of this approach (setting first, then removal) + } else { + jQuery.attr( elem, name, "" ); + } + + elem.removeAttribute( getSetAttribute ? name : propName ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to default in case type is set after value during creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + var + // Use .prop to determine if this attribute is understood as boolean + prop = jQuery.prop( elem, name ), + + // Fetch it accordingly + attr = typeof prop === "boolean" && elem.getAttribute( name ), + detail = typeof prop === "boolean" ? + + getSetInput && getSetAttribute ? + attr != null : + // oldIE fabricates an empty string for missing boolean attributes + // and conflates checked/selected into attroperties + ruseDefault.test( name ) ? + elem[ jQuery.camelCase( "default-" + name ) ] : + !!attr : + + // fetch an attribute node for properties not recognized as boolean + elem.getAttributeNode( name ); + + return detail && detail.value !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + // IE<8 needs the *property* name + elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); + + // Use defaultChecked and defaultSelected for oldIE + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; + } + + return name; + } +}; + +// fix oldIE value attroperty +if ( !getSetInput || !getSetAttribute ) { + jQuery.attrHooks.value = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return jQuery.nodeName( elem, "input" ) ? + + // Ignore the value *property* by using defaultValue + elem.defaultValue : + + ret && ret.specified ? ret.value : undefined; + }, + set: function( elem, value, name ) { + if ( jQuery.nodeName( elem, "input" ) ) { + // Does not return so that setAttribute is also used + elem.defaultValue = value; + } else { + // Use nodeHook if defined (#1954); otherwise setAttribute is fine + return nodeHook && nodeHook.set( elem, value, name ); + } + } + }; +} + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ? + ret.value : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + elem.setAttributeNode( + (ret = elem.ownerDocument.createAttribute( name )) + ); + } + + ret.value = value += ""; + + // Break association with cloned elements by also using setAttribute (#9646) + return name === "value" || value === elem.getAttribute( name ) ? + value : + undefined; + } + }; + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + nodeHook.set( elem, value === "" ? false : value, name ); + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret == null ? undefined : ret; + } + }); + }); + + // href/src property should get the full normalized URL (#10299/#12915) + jQuery.each([ "href", "src" ], function( i, name ) { + jQuery.propHooks[ name ] = { + get: function( elem ) { + return elem.getAttribute( name, 4 ); + } + }; + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Note: IE uppercases css property names, but if we were to .toLowerCase() + // .cssText, that would destroy case senstitivity in URL's, like in "background" + return elem.style.cssText || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = value + "" ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = core_hasOwn.call( event, "type" ) ? event.type : event, + namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + event.isTrigger = true; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = core_slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur != this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + } + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== document.activeElement && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === document.activeElement && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + + beforeunload: { + postDispatch: function( event ) { + + // Even when returnValue equals to undefined Firefox will still show alert + if ( event.result !== undefined ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === core_strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ +(function( window, undefined ) { + +var i, + cachedruns, + Expr, + getText, + isXML, + compile, + hasDuplicate, + outermostContext, + + // Local document vars + setDocument, + document, + docElem, + documentIsXML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + sortOrder, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + support = {}, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Array methods + arr = [], + pop = arr.pop, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + operators = "([*^$|!~]?=)", + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rsibling = /[\x20\t\r\n\f]*[+~]/, + + rnative = /^[^{]+\{\s*\[native code/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g, + funescape = function( _, escaped ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + return high !== high ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Use a stripped-down slice if we can't use a native one +try { + slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType; +} catch ( e ) { + slice = function( i ) { + var elem, + results = []; + while ( (elem = this[i++]) ) { + results.push( elem ); + } + return results; + }; +} + +/** + * For feature detection + * @param {Function} fn The function to test for native support + */ +function isNative( fn ) { + return rnative.test( fn + "" ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var cache, + keys = []; + + return (cache = function( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + }); +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( !documentIsXML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) { + push.apply( results, slice.call(context.getElementsByClassName( m ), 0) ); + return results; + } + } + + // QSA path + if ( support.qsa && !rbuggyQSA.test(selector) ) { + old = true; + nid = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, slice.call( newContext.querySelectorAll( + newSelector + ), 0 ) ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Detect xml + * @param {Element|Object} elem An element or a document + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsXML = isXML( doc ); + + // Check if getElementsByTagName("*") returns only elements + support.tagNameNoComments = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if attributes should be retrieved by attribute nodes + support.attributes = assert(function( div ) { + div.innerHTML = ""; + var type = typeof div.lastChild.getAttribute("multiple"); + // IE8 returns a string for some attributes even when not present + return type !== "boolean" && type !== "string"; + }); + + // Check if getElementsByClassName can be trusted + support.getByClassName = assert(function( div ) { + // Opera can't find a second classname (in 9.6) + div.innerHTML = ""; + if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { + return false; + } + + // Safari 3.2 caches class attributes and doesn't catch changes + div.lastChild.className = "e"; + return div.getElementsByClassName("e").length === 2; + }); + + // Check if getElementById returns elements by name + // Check if getElementsByName privileges form controls or returns elements by ID + support.getByName = assert(function( div ) { + // Inject content + div.id = expando + 0; + div.innerHTML = "
"; + docElem.insertBefore( div, docElem.firstChild ); + + // Test + var pass = doc.getElementsByName && + // buggy browsers will return fewer than the correct 2 + doc.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + doc.getElementsByName( expando + 0 ).length; + support.getIdNotName = !doc.getElementById( expando ); + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + + // IE6/7 return modified attributes + Expr.attrHandle = assert(function( div ) { + div.innerHTML = ""; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }) ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }; + + // ID find and filter + if ( support.getIdNotName ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && !documentIsXML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && !documentIsXML ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.tagNameNoComments ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Name + Expr.find["NAME"] = support.getByName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }; + + // Class + Expr.find["CLASS"] = support.getByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) { + return context.getElementsByClassName( className ); + } + }; + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21), + // no need to also add to buggyMatches since matches checks buggyQSA + // A support test would require too much code (would include document ready) + rbuggyQSA = [ ":focus" ]; + + if ( (support.qsa = isNative(doc.querySelectorAll)) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explictly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // IE8 - Some boolean attributes are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE8 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = ""; + if ( div.querySelectorAll("[i^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = new RegExp( rbuggyMatches.join("|") ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = isNative(docElem.contains) || docElem.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + var compare; + + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) { + if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) { + if ( a === doc || contains( preferredDoc, a ) ) { + return -1; + } + if ( b === doc || contains( preferredDoc, b ) ) { + return 1; + } + return 0; + } + return compare & 4 ? -1 : 1; + } + + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + // Always assume the presence of duplicates if sort doesn't + // pass them to our comparison function (as in Google Chrome). + hasDuplicate = false; + [0, 0].sort( sortOrder ); + support.detectDuplicates = hasDuplicate; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyQSA always contains :focus, so no need for an existence check + if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + var val; + + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + if ( !documentIsXML ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( documentIsXML || support.attributes ) { + return elem.getAttribute( name ); + } + return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ? + name : + val && val.specified ? val.value : null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + i = 1, + j = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( ; (elem = results[i]); i++ ) { + if ( elem === results[ i - 1 ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +// Returns a function to use in pseudos for input types +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +// Returns a function to use in pseudos for buttons +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +// Returns a function to use in pseudos for positionals +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[4] ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + + nodeName = nodeName.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifider + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsXML ? + elem.getAttribute("xml:lang") || elem.getAttribute("lang") : + elem.lang) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push( { + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && !documentIsXML && + Expr.relative[ tokens[1].type ] ) { + + context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, slice.call( seed, 0 ) ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + documentIsXML, + results, + rsibling.test( selector ) + ); + return results; +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Easy API for creating new setFilters +function setFilters() {} +Expr.filters = setFilters.prototype = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Initialize with the default document +setDocument(); + +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +var runtil = /Until$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + isSimple = /^.[^:#\[\.,]*$/, + rneedsContext = jQuery.expr.match.needsContext, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var i, ret, self, + len = this.length; + + if ( typeof selector !== "string" ) { + self = this; + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + ret = []; + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, this[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = ( this.selector ? this.selector + " " : "" ) + selector; + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false) ); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true) ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + rneedsContext.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + cur = this[i]; + + while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + } + cur = cur.parentNode; + } + } + + return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( jQuery.unique(all) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +jQuery.fn.andSelf = jQuery.fn.addBack; + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( this.length > 1 && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, false, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, false, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function( value ) { + var isFunc = jQuery.isFunction( value ); + + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( !isFunc && typeof value !== "string" ) { + value = jQuery( value ).not( this ).detach(); + } + + return this.domManip( [ value ], true, function( elem ) { + var next = this.nextSibling, + parent = this.parentNode; + + if ( parent ) { + jQuery( this ).remove(); + parent.insertBefore( elem, next ); + } + }); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + + // Flatten any nested arrays + args = core_concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, table ? self.html() : undefined ); + } + self.domManip( args, table, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( + table && jQuery.nodeName( this[i], "table" ) ? + findOrAppend( this[i], "tbody" ) : + this[i], + node, + i + ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Hope ajax is available... + jQuery.ajax({ + url: node.src, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +function findOrAppend( elem, tag ) { + return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) ); +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + var attr = elem.getAttributeNode("type"); + elem.type = ( attr && attr.specified ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + core_push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( manipulation_rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== core_strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + core_deletedIds.push( id ); + } + } + } + } + } +}); +var iframe, getStyles, curCSS, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity\s*=\s*([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + var len, styles, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + var bool = typeof state === "boolean"; + + return this.each(function() { + if ( bool ? state : isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, + // but it would mean to define eight (for every problematic property) identical functions + if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var num, val, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +// NOTE: we've included the "window" in window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + getStyles = function( elem ) { + return window.getComputedStyle( elem, null ); + }; + + curCSS = function( elem, name, _computed ) { + var width, minWidth, maxWidth, + computed = _computed || getStyles( elem ), + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, + style = elem.style; + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + getStyles = function( elem ) { + return elem.currentStyle; + }; + + curCSS = function( elem, name, _computed ) { + var left, rs, rsLeft, + computed = _computed || getStyles( elem ), + ret = computed ? computed[ name ] : undefined, + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rs = elem.runtimeStyle; + rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // at this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("