From 900009c9b8326f789851314c7109e3286b3e5c8c Mon Sep 17 00:00:00 2001 From: Jakob Anderson Date: Fri, 5 May 2017 20:54:29 -0600 Subject: [PATCH 1/2] fixed linter error --- README.md | 2 +- gulpfile.js | 22 + package.json | 5 + public/404.html | 34 +- public/dist/css/min.min.css | 1 - public/dist/css/style.css | 2 +- public/dist/js/bundle.min.js | 4 +- public/dist/js/bundle.min.js.map | 2 +- public/index.html | 101 +- shrinkwrap.yaml | 4207 ++++++++++++++++++++++++++++++ src/html/404.html | 33 + src/html/index.html | 100 + 12 files changed, 4374 insertions(+), 139 deletions(-) delete mode 100644 public/dist/css/min.min.css create mode 100644 shrinkwrap.yaml create mode 100644 src/html/404.html create mode 100644 src/html/index.html diff --git a/README.md b/README.md index a973f5e..9990b2f 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ firebase serve - That will build it all and watch the css, img, and js assets. - Then you can load up `http://localhost:5000` or `public/index.html` in a browser. narf! -`/src/index.js` is the main file you'll want to edit for functionality. +`/src/index.js`, `/src/css/style.scss`, and `/src/html/index.html` are the main files you'll want to edit for functionality. - If you have the [LiveReload Chrome extension](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei) installed, it should do live css updates in your browser while gulp watch is running - CSS is auto-prefixed for the supported browserslist, so don't manually add any browser prefixes to CSS src. - NOTE: If you change the UI, please update the screenshot at top of this README diff --git a/gulpfile.js b/gulpfile.js index dbde83d..039a5d9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -15,6 +15,7 @@ const cssnano = require('cssnano'); const svgo = require('gulp-svgo'); const sass = require('gulp-sass'); const livereload = require('gulp-livereload'); +const htmlmin = require('gulp-htmlmin'); // CONFIG // ============================================================ @@ -31,6 +32,12 @@ const opts = { const uglifyConf = {}; +const htmlminConfig = { + collapseWhitespace: true, + minifyCSS: true, + minifyJS: true +}; + // TASKS // ============================================================ @@ -123,6 +130,21 @@ imgWatcher.on('change', event => { console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); }); +// HTML +// ============================================================ + +gulp.task('html', () => { + return gulp.src('./src/html/*.html') + .pipe(htmlmin(htmlminConfig)) + .pipe(gulp.dest('./public/')); // Output goes to root of /public, as per firebase hosting +}); + +const htmlWatcher = gulp.watch('src/html/*.html', ['html']); + +htmlWatcher.on('change', event => { + console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); +}); + // BUILD // ============================================================ diff --git a/package.json b/package.json index f3eb978..ce01fa8 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,9 @@ "babelify": "^7.3.0", "cssnano": "^3.10.0", "gulp": "^3.9.1", + "gulp-htmlmin": "^3.0.0", "gulp-postcss": "^6.4.0", + "gulp-rev": "^7.1.2", "gulp-sourcemaps": "^2.5.1", "gulp-uglify": "^2.1.2", "gulp-util": "^3.0.8", @@ -66,7 +68,10 @@ "babel-preset-latest": "^6.24.1", "browserify": "^14.1.0", "chai": "^3.5.0", + "gulp-buffer": "^0.0.2", + "gulp-htmlmin": "^3.0.0", "gulp-livereload": "^3.8.1", + "gulp-rev": "^7.1.2", "gulp-sass": "^3.1.0", "gulp-svgo": "^1.0.3", "husky": "^0.13.3", diff --git a/public/404.html b/public/404.html index 829eda8..d1cc5a7 100644 --- a/public/404.html +++ b/public/404.html @@ -1,33 +1 @@ - - - - - - Page Not Found - - - - -
-

404

-

Page Not Found

-

The specified file was not found on this website. Please check the URL for mistakes and try again.

-

Why am I seeing this?

-

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

-
- - +Page Not Found

404

Page Not Found

The specified file was not found on this website. Please check the URL for mistakes and try again.

Why am I seeing this?

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

\ No newline at end of file diff --git a/public/dist/css/min.min.css b/public/dist/css/min.min.css deleted file mode 100644 index 457e782..0000000 --- a/public/dist/css/min.min.css +++ /dev/null @@ -1 +0,0 @@ -body{font-family:sans-serif;text-align:center;margin:0;font-size:16px}.smooth{transition:all .2s}hr,hr.mediumwidth{margin:2.5em auto}.mediumwidth{font-size:16px;width:40%;margin-left:30%;margin-top:.3em;margin-bottom:.3em}@media(max-width:870px){.mediumwidth{width:70%;margin-left:15%}.row [class*=c]{width:100%;display:block;margin:1% auto}.row:last-child column{margin-bottom:2.5em}}@media(max-width:520px){.mediumwidth{width:100%;margin-left:0}hr.mediumwidth{width:auto}}button,i{font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}button{background:#aaa;box-shadow:3px 3px #000;color:#fff;font-size:2.5em;padding:15px 40px 16px;text-decoration:none;margin:.3em .7em;cursor:pointer;border:0}button.btn-a{background:#0ae}button.btn-a:hover{background:#09d}button.btn-a:active{background:#08b}button.btn-b{background:#3c5}button.btn-b:hover{background:#2b4}button.btn-b:active{background:#2a4}button.btn-c{background:#d33}button.btn-c:hover{background:#c22}button.btn-c:active{background:#b22}button.btn-small{padding:7px 19px;font-size:16px}.row{line-height:2em;margin-top:2%;height:2em}column{float:left;margin:auto 1%}.ie column{margin:auto .7%}.c10{width:98%}.c9{width:88%}.c8{width:78%}.c7{width:68%}.c6{width:58%}.c5{width:48%}.c4{width:38%}.c3{width:28%}.c2{width:18%}.c1{width:8%}h1{font-size:4em;margin:0}h1.title{font-size:7em}h2{font-size:2em}ico{font-size:2.04em}.ie .mediumwidth{width:70%;margin-left:0}.ie .mediumwidth hr{margin:100px auto;padding-left:200px}input,textarea{outline:0;padding:6px;font-family:sans-serif}input:focus,textarea:focus{border:1px solid #5ab}input[type=text],textarea{width:13em}.addon-front{padding:6px 11px 6px 10px;margin-right:-2px;border-right:0}.addon-front,input,textarea{border:1px solid #ccc;font-size:.8em}message{display:block;padding:2em 0;background:#ace}message.warning{background:#d99}message.great{background:#9d9}.navbar{width:100%;background:#000;color:#fff;text-align:left;height:1.5em;padding:1em 0 .6em}.navbar a{text-decoration:none}.pagename{color:#fff;padding:0 1em 0 2em;font-weight:700}.navbar-link{padding:.5em;color:#aaa}.navbar-link:hover{color:#fff}.navbar button,.navbar input{margin-top:-20px}@media(max-width:500px){.navbar a{text-align:center;display:block}.navbar{height:7.5em}}table{width:100%;border-spacing:0}.table td,.table th{padding:.5em;line-height:1.4em;text-align:left}tbody tr:nth-child(2n-1){background:#ccc} \ No newline at end of file diff --git a/public/dist/css/style.css b/public/dist/css/style.css index f8bf6ff..afb324e 100644 --- a/public/dist/css/style.css +++ b/public/dist/css/style.css @@ -1 +1 @@ -html{background-color:#0c141f;min-height:100%}body{margin:0}body,input,select,textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Arial,sans-serif;font-size:16pt;box-sizing:border-box;color:#e6ffff;-webkit-font-smoothing:antialiased}a{color:#6fc3df}.monospace{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.hidden,.hide-until-load{visibility:hidden}body{opacity:1;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out}.container{display:block}.site-heading{padding:.5em;text-align:center;margin:0;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.site-heading span{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;text-shadow:0 0 10px #fff,0 0 40px #6fc3df}.site-heading h1{font-size:200%;margin:.3em 0 .5em .5em;letter-spacing:0;font-weight:200}.site-heading img.logo{display:none}.controls{cursor:pointer;display:-webkit-box;display:flex;justify-content:space-around;font-size:60%;text-transform:uppercase}.controls img{padding:1em;border-radius:1em;background-color:transparent;height:30px}.controls>div>.active,.controls>div>:active{background-color:#6fc3df;-webkit-transition:color .1s ease-in-out;transition:color .1s ease-in-out}.problem-group{display:block;margin:.7em 0;-webkit-box-align:center;align-items:center}.problem{display:block;margin:1em}.code-and-tests{vertical-align:top;display:block}.code{font-size:80%;color:#f8f8f2;color:#fff;overflow-x:auto;padding:.5em;background:#23241f;background:#1a1a1a;border-radius:3px;padding:.25em .65em}.code,.test-area{display:inline-block;width:100%}.test-area{vertical-align:top}.test-suite{font-size:60%}.test{display:block;margin:.7em 0}.test-state{display:inline-block;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.test-state.pass{color:#6fc3df}.test-state.fail{color:#df740c}.test-name{display:inline-block}.test-total{background-color:gray;color:#fff;text-align:center;padding:.5em;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.test-total.working{background:url(/dist/img/reload.svg)}.test-total.pass{background-color:#6fc3df}.test-total.fail{background-color:#df740c}.console{font-size:70%;margin:.5em 0;vertical-align:top}.console>h4{text-align:center}.ads-bottom{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;margin:5em 0 1em}footer{margin:0 auto;text-align:center;left:0;bottom:0;height:70px;width:100%;font-size:60%}footer>div{margin:.4em auto}@media (min-width:760px){.container{width:92%;margin:0 auto;display:-webkit-box;display:flex}.left-spacer{-webkit-box-flex:0.5;flex:0.5}main{-webkit-box-flex:30;flex:30}.site-heading .container{-webkit-box-pack:justify;justify-content:space-between;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;align-items:center}.site-heading>.container>h1{font-size:200%}.site-heading img.logo{height:60px;display:-webkit-box;display:flex}.problem-name{display:block}.problem-group{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between}.problem{display:block;margin-right:.6em}.code-and-tests{display:-webkit-box;display:flex}.test-area{width:30%}.code-and-eval-console{width:70%}} \ No newline at end of file +html{background-color:#0c141f;min-height:100%}body{margin:0}body,input,select,textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Arial,sans-serif;font-size:16pt;box-sizing:border-box;color:#e6ffff;-webkit-font-smoothing:antialiased}a{color:#6fc3df}.monospace{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.hidden,.hide-until-load{visibility:hidden}body{opacity:1;transition:opacity .2s ease-in-out}.container{display:block}.site-heading{padding:.5em;text-align:center;margin:0;display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.site-heading span{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;text-shadow:0 0 10px #fff,0 0 40px #6fc3df}.site-heading h1{font-size:200%;margin:.3em 0 .5em .5em;letter-spacing:0;font-weight:200}.site-heading img.logo{display:none}.controls{cursor:pointer;display:-webkit-box;display:flex;justify-content:space-around;font-size:60%;text-transform:uppercase}.controls img{padding:1em;border-radius:1em;background-color:transparent;height:30px}.controls>div>.active,.controls>div>:active{background-color:#6fc3df;transition:color .1s ease-in-out}.problem-group{display:block;margin:.7em 0;-webkit-box-align:center;align-items:center}.problem{display:block;margin:1em}.code-and-tests{vertical-align:top;display:block}.code{font-size:80%;color:#f8f8f2;color:#fff;overflow-x:auto;padding:.5em;background:#23241f;background:#1a1a1a;border-radius:3px;padding:.25em .65em}.code,.test-area{display:inline-block;width:100%}.test-area{vertical-align:top}.test-suite{font-size:60%}.test{display:block;margin:.7em 0}.test-state{display:inline-block;transition:all .2s ease-in-out}.test-state.pass{color:#6fc3df}.test-state.fail{color:#df740c}.test-name{display:inline-block}.test-total{background-color:gray;color:#fff;text-align:center;padding:.5em;transition:all .2s ease-in-out}.test-total.working{background:url(/dist/img/reload.svg)}.test-total.pass{background-color:#6fc3df}.test-total.fail{background-color:#df740c}.console{font-size:70%;margin:.5em 0;vertical-align:top}.console>h4{text-align:center}.ads-bottom{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;margin:5em 0 1em}footer{margin:0 auto;text-align:center;left:0;bottom:0;height:70px;width:100%;font-size:60%}footer>div{margin:.4em auto}@media (min-width:760px){.container{width:92%;margin:0 auto;display:-webkit-box;display:flex}.left-spacer{-webkit-box-flex:0.5;flex:0.5}main{-webkit-box-flex:30;flex:30}.site-heading .container{-webkit-box-pack:justify;justify-content:space-between;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;-webkit-box-align:center;align-items:center}.site-heading>.container>h1{font-size:200%}.site-heading img.logo{height:60px;display:-webkit-box;display:flex}.problem-name{display:block}.problem-group{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between}.problem{display:block;margin-right:.6em}.code-and-tests{display:-webkit-box;display:flex}.test-area{width:30%}.code-and-eval-console{width:70%}} \ No newline at end of file diff --git a/public/dist/js/bundle.min.js b/public/dist/js/bundle.min.js index 7651078..6f32d4e 100644 --- a/public/dist/js/bundle.min.js +++ b/public/dist/js/bundle.min.js @@ -1,4 +1,4 @@ !function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u="function"==typeof require&&require;if(!s&&u)return u(a,!0);if(i)return i(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var f=n[a]={exports:{}};t[a][0].call(f.exports,function(e){var n=t[a][1][e];return o(n||e)},f,f.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;ae,"expected #{this} to have a length above #{exp} but got #{act}","expected #{this} to not have a length above #{exp}",e,r)}else this.assert(n>e,"expected #{this} to be above "+e,"expected #{this} to be at most "+e)}function c(e,t){t&&P(this,"message",t);var n=P(this,"object");if(P(this,"doLength")){new N(n,t).to.have.property("length");var r=n.length;this.assert(r>=e,"expected #{this} to have a length at least #{exp} but got #{act}","expected #{this} to have a length below #{exp}",e,r)}else this.assert(n>=e,"expected #{this} to be at least "+e,"expected #{this} to be below "+e)}function f(e,t){t&&P(this,"message",t);var n=P(this,"object");if(P(this,"doLength")){new N(n,t).to.have.property("length");var r=n.length;this.assert(r1)throw new Error(i);break;case"object":if(arguments.length>1)throw new Error(i);e=Object.keys(e);break;default:e=Array.prototype.slice.call(arguments)}if(!e.length)throw new Error("keys required");var a=Object.keys(r),s=e,u=e.length,c=P(this,"any"),f=P(this,"all");if(c||f||(f=!0),c){o=s.filter(function(e){return~a.indexOf(e)}).length>0}if(f&&(o=e.every(function(e){return~a.indexOf(e)}),P(this,"negate")||P(this,"contains")||(o=o&&e.length==a.length)),u>1){e=e.map(function(e){return t.inspect(e)});var l=e.pop();f&&(n=e.join(", ")+", and "+l),c&&(n=e.join(", ")+", or "+l)}else n=t.inspect(e[0]);n=(u>1?"keys ":"key ")+n,n=(P(this,"contains")?"contain ":"have ")+n,this.assert(o,"expected #{this} to "+n,"expected #{this} to not "+n,s.slice(0).sort(),a.sort(),!0)}function m(e,n,r){r&&P(this,"message",r);var o=P(this,"object");new N(o,r).is.a("function");var i=!1,a=null,s=null,u=null;0===arguments.length?(n=null,e=null):e&&(e instanceof RegExp||"string"==typeof e)?(n=e,e=null):e&&e instanceof Error?(a=e,e=null,n=null):"function"==typeof e?(!(s=e.prototype.name)||"Error"===s&&e!==Error)&&(s=e.name||(new e).name):e=null;try{o()}catch(r){if(a)return this.assert(r===a,"expected #{this} to throw #{exp} but #{act} was thrown","expected #{this} to not throw #{exp}",a instanceof Error?a.toString():a,r instanceof Error?r.toString():r),P(this,"object",r),this;if(e&&(this.assert(r instanceof e,"expected #{this} to throw #{exp} but #{act} was thrown","expected #{this} to not throw #{exp} but #{act} was thrown",s,r instanceof Error?r.toString():r),!n))return P(this,"object",r),this;var c="error"===t.type(r)&&"message"in r?r.message:""+r;if(null!=c&&n&&n instanceof RegExp)return this.assert(n.exec(c),"expected #{this} to throw error matching #{exp} but got #{act}","expected #{this} to throw error not matching #{exp}",n,c),P(this,"object",r),this;if(null!=c&&n&&"string"==typeof n)return this.assert(~c.indexOf(n),"expected #{this} to throw error including #{exp} but got #{act}","expected #{this} to throw error not including #{act}",n,c),P(this,"object",r),this;i=!0,u=r}var f="",l=null!==s?s:a?"#{exp}":"an error";i&&(f=" but #{act} was thrown"),this.assert(!0===i,"expected #{this} to throw "+l+f,"expected #{this} to not throw "+l+f,a instanceof Error?a.toString():a,u instanceof Error?u.toString():u),P(this,"object",u)}function w(e,n){n&&P(this,"message",n);var r=P(this,"object"),o=P(this,"itself"),i="function"!==t.type(r)||o?r[e]:r.prototype[e];this.assert("function"==typeof i,"expected #{this} to respond to "+t.inspect(e),"expected #{this} to not respond to "+t.inspect(e))}function x(e,n){n&&P(this,"message",n);var r=P(this,"object"),o=e(r);this.assert(o,"expected #{this} to satisfy "+t.objDisplay(e),"expected #{this} to not satisfy"+t.objDisplay(e),!this.negate,o)}function E(e,n,r){r&&P(this,"message",r);var o=P(this,"object");if(new N(o,r).is.a("number"),"number"!==t.type(e)||"number"!==t.type(n))throw new Error("the arguments to closeTo or approximately must be numbers");this.assert(Math.abs(o-e)<=n,"expected #{this} to be close to "+e+" +/- "+n,"expected #{this} not to be close to "+e+" +/- "+n)}function j(e,t,n){return e.every(function(e){return n?t.some(function(t){return n(e,t)}):-1!==t.indexOf(e)})}function O(e,t){t&&P(this,"message",t);var n=P(this,"object");new N(e).to.be.an("array"),this.assert(e.indexOf(n)>-1,"expected #{this} to be one of #{exp}","expected #{this} to not be one of #{exp}",e,n)}function S(e,t,n){n&&P(this,"message",n);var r=P(this,"object");new N(e,n).to.have.property(t),new N(r).is.a("function");var o=e[t];r(),this.assert(o!==e[t],"expected ."+t+" to change","expected ."+t+" to not change")}function A(e,t,n){n&&P(this,"message",n);var r=P(this,"object");new N(e,n).to.have.property(t),new N(r).is.a("function");var o=e[t];r(),this.assert(e[t]-o>0,"expected ."+t+" to increase","expected ."+t+" to not increase")}function _(e,t,n){n&&P(this,"message",n);var r=P(this,"object");new N(e,n).to.have.property(t),new N(r).is.a("function");var o=e[t];r(),this.assert(e[t]-o<0,"expected ."+t+" to decrease","expected ."+t+" to not decrease")}var N=e.Assertion,P=(Object.prototype.toString,t.flag);["to","be","been","is","and","has","have","with","that","which","at","of","same"].forEach(function(e){N.addProperty(e,function(){return this})}),N.addProperty("not",function(){P(this,"negate",!0)}),N.addProperty("deep",function(){P(this,"deep",!0)}),N.addProperty("any",function(){P(this,"any",!0),P(this,"all",!1)}),N.addProperty("all",function(){P(this,"all",!0),P(this,"any",!1)}),N.addChainableMethod("an",n),N.addChainableMethod("a",n),N.addChainableMethod("include",o,r),N.addChainableMethod("contain",o,r),N.addChainableMethod("contains",o,r),N.addChainableMethod("includes",o,r),N.addProperty("ok",function(){this.assert(P(this,"object"),"expected #{this} to be truthy","expected #{this} to be falsy")}),N.addProperty("true",function(){this.assert(!0===P(this,"object"),"expected #{this} to be true","expected #{this} to be false",!this.negate)}),N.addProperty("false",function(){this.assert(!1===P(this,"object"),"expected #{this} to be false","expected #{this} to be true",!!this.negate)}),N.addProperty("null",function(){this.assert(null===P(this,"object"),"expected #{this} to be null","expected #{this} not to be null")}),N.addProperty("undefined",function(){this.assert(void 0===P(this,"object"),"expected #{this} to be undefined","expected #{this} not to be undefined")}),N.addProperty("NaN",function(){this.assert(isNaN(P(this,"object")),"expected #{this} to be NaN","expected #{this} not to be NaN")}),N.addProperty("exist",function(){this.assert(null!=P(this,"object"),"expected #{this} to exist","expected #{this} to not exist")}),N.addProperty("empty",function(){var e=P(this,"object"),t=e;Array.isArray(e)||"string"==typeof object?t=e.length:"object"==typeof e&&(t=Object.keys(e).length),this.assert(!t,"expected #{this} to be empty","expected #{this} not to be empty")}),N.addProperty("arguments",i),N.addProperty("Arguments",i),N.addMethod("equal",a),N.addMethod("equals",a),N.addMethod("eq",a),N.addMethod("eql",s),N.addMethod("eqls",s),N.addMethod("above",u),N.addMethod("gt",u),N.addMethod("greaterThan",u),N.addMethod("least",c),N.addMethod("gte",c),N.addMethod("below",f),N.addMethod("lt",f),N.addMethod("lessThan",f),N.addMethod("most",l),N.addMethod("lte",l),N.addMethod("within",function(e,t,n){n&&P(this,"message",n);var r=P(this,"object"),o=e+".."+t;if(P(this,"doLength")){new N(r,n).to.have.property("length");var i=r.length;this.assert(i>=e&&i<=t,"expected #{this} to have a length within "+o,"expected #{this} to not have a length within "+o)}else this.assert(r>=e&&r<=t,"expected #{this} to be within "+o,"expected #{this} to not be within "+o)}),N.addMethod("instanceof",d),N.addMethod("instanceOf",d),N.addMethod("property",function(e,n,r){r&&P(this,"message",r);var o=!!P(this,"deep"),i=o?"deep property ":"property ",a=P(this,"negate"),s=P(this,"object"),u=o?t.getPathInfo(e,s):null,c=o?u.exists:t.hasProperty(e,s),f=o?u.value:s[e];if(a&&arguments.length>1){if(void 0===f)throw r=null!=r?r+": ":"",new Error(r+t.inspect(s)+" has no "+i+t.inspect(e))}else this.assert(c,"expected #{this} to have a "+i+t.inspect(e),"expected #{this} to not have "+i+t.inspect(e));arguments.length>1&&this.assert(n===f,"expected #{this} to have a "+i+t.inspect(e)+" of #{exp}, but got #{act}","expected #{this} to not have a "+i+t.inspect(e)+" of #{act}",n,f),P(this,"object",f)}),N.addMethod("ownProperty",h),N.addMethod("haveOwnProperty",h),N.addMethod("ownPropertyDescriptor",p),N.addMethod("haveOwnPropertyDescriptor",p),N.addChainableMethod("length",b,v),N.addMethod("lengthOf",b),N.addMethod("match",y),N.addMethod("matches",y),N.addMethod("string",function(e,n){n&&P(this,"message",n);var r=P(this,"object");new N(r,n).is.a("string"),this.assert(~r.indexOf(e),"expected #{this} to contain "+t.inspect(e),"expected #{this} to not contain "+t.inspect(e))}),N.addMethod("keys",g),N.addMethod("key",g),N.addMethod("throw",m),N.addMethod("throws",m),N.addMethod("Throw",m),N.addMethod("respondTo",w),N.addMethod("respondsTo",w),N.addProperty("itself",function(){P(this,"itself",!0)}),N.addMethod("satisfy",x),N.addMethod("satisfies",x),N.addMethod("closeTo",E),N.addMethod("approximately",E),N.addMethod("members",function(e,n){n&&P(this,"message",n);var r=P(this,"object");new N(r).to.be.an("array"),new N(e).to.be.an("array");var o=P(this,"deep")?t.eql:void 0;if(P(this,"contains"))return this.assert(j(e,r,o),"expected #{this} to be a superset of #{act}","expected #{this} to not be a superset of #{act}",r,e);this.assert(j(r,e,o)&&j(e,r,o),"expected #{this} to have the same members as #{act}","expected #{this} to not have the same members as #{act}",r,e)}),N.addMethod("oneOf",O),N.addChainableMethod("change",S),N.addChainableMethod("changes",S),N.addChainableMethod("increase",A),N.addChainableMethod("increases",A),N.addChainableMethod("decrease",_),N.addChainableMethod("decreases",_),N.addProperty("extensible",function(){var e,t=P(this,"object");try{e=Object.isExtensible(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!1}this.assert(e,"expected #{this} to be extensible","expected #{this} to not be extensible")}),N.addProperty("sealed",function(){var e,t=P(this,"object");try{e=Object.isSealed(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!0}this.assert(e,"expected #{this} to be sealed","expected #{this} to not be sealed")}),N.addProperty("frozen",function(){var e,t=P(this,"object");try{e=Object.isFrozen(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!0}this.assert(e,"expected #{this} to be frozen","expected #{this} to not be frozen")})}},{}],7:[function(e,t,n){t.exports=function(e,t){var n=e.Assertion,r=t.flag,o=e.assert=function(t,r){new n(null,null,e.assert).assert(t,r,"[ negation message unavailable ]")};o.fail=function(t,n,r,i){throw r=r||"assert.fail()",new e.AssertionError(r,{actual:t,expected:n,operator:i},o.fail)},o.isOk=function(e,t){new n(e,t).is.ok},o.isNotOk=function(e,t){new n(e,t).is.not.ok},o.equal=function(e,t,i){var a=new n(e,i,o.equal);a.assert(t==r(a,"object"),"expected #{this} to equal #{exp}","expected #{this} to not equal #{act}",t,e)},o.notEqual=function(e,t,i){var a=new n(e,i,o.notEqual);a.assert(t!=r(a,"object"),"expected #{this} to not equal #{exp}","expected #{this} to equal #{act}",t,e)},o.strictEqual=function(e,t,r){new n(e,r).to.equal(t)},o.notStrictEqual=function(e,t,r){new n(e,r).to.not.equal(t)},o.deepEqual=function(e,t,r){new n(e,r).to.eql(t)},o.notDeepEqual=function(e,t,r){new n(e,r).to.not.eql(t)},o.isAbove=function(e,t,r){new n(e,r).to.be.above(t)},o.isAtLeast=function(e,t,r){new n(e,r).to.be.least(t)},o.isBelow=function(e,t,r){new n(e,r).to.be.below(t)},o.isAtMost=function(e,t,r){new n(e,r).to.be.most(t)},o.isTrue=function(e,t){new n(e,t).is.true},o.isNotTrue=function(e,t){new n(e,t).to.not.equal(!0)},o.isFalse=function(e,t){new n(e,t).is.false},o.isNotFalse=function(e,t){new n(e,t).to.not.equal(!1)},o.isNull=function(e,t){new n(e,t).to.equal(null)},o.isNotNull=function(e,t){new n(e,t).to.not.equal(null)},o.isNaN=function(e,t){new n(e,t).to.be.NaN},o.isNotNaN=function(e,t){new n(e,t).not.to.be.NaN},o.isUndefined=function(e,t){new n(e,t).to.equal(void 0)},o.isDefined=function(e,t){new n(e,t).to.not.equal(void 0)},o.isFunction=function(e,t){new n(e,t).to.be.a("function")},o.isNotFunction=function(e,t){new n(e,t).to.not.be.a("function")},o.isObject=function(e,t){new n(e,t).to.be.a("object")},o.isNotObject=function(e,t){new n(e,t).to.not.be.a("object")},o.isArray=function(e,t){new n(e,t).to.be.an("array")},o.isNotArray=function(e,t){new n(e,t).to.not.be.an("array")},o.isString=function(e,t){new n(e,t).to.be.a("string")},o.isNotString=function(e,t){new n(e,t).to.not.be.a("string")},o.isNumber=function(e,t){new n(e,t).to.be.a("number")},o.isNotNumber=function(e,t){new n(e,t).to.not.be.a("number")},o.isBoolean=function(e,t){new n(e,t).to.be.a("boolean")},o.isNotBoolean=function(e,t){new n(e,t).to.not.be.a("boolean")},o.typeOf=function(e,t,r){new n(e,r).to.be.a(t)},o.notTypeOf=function(e,t,r){new n(e,r).to.not.be.a(t)},o.instanceOf=function(e,t,r){new n(e,r).to.be.instanceOf(t)},o.notInstanceOf=function(e,t,r){new n(e,r).to.not.be.instanceOf(t)},o.include=function(e,t,r){new n(e,r,o.include).include(t)},o.notInclude=function(e,t,r){new n(e,r,o.notInclude).not.include(t)},o.match=function(e,t,r){new n(e,r).to.match(t)},o.notMatch=function(e,t,r){new n(e,r).to.not.match(t)},o.property=function(e,t,r){new n(e,r).to.have.property(t)},o.notProperty=function(e,t,r){new n(e,r).to.not.have.property(t)},o.deepProperty=function(e,t,r){new n(e,r).to.have.deep.property(t)},o.notDeepProperty=function(e,t,r){new n(e,r).to.not.have.deep.property(t)},o.propertyVal=function(e,t,r,o){new n(e,o).to.have.property(t,r)},o.propertyNotVal=function(e,t,r,o){new n(e,o).to.not.have.property(t,r)},o.deepPropertyVal=function(e,t,r,o){new n(e,o).to.have.deep.property(t,r)},o.deepPropertyNotVal=function(e,t,r,o){new n(e,o).to.not.have.deep.property(t,r)},o.lengthOf=function(e,t,r){new n(e,r).to.have.length(t)},o.throws=function(e,t,o,i){("string"==typeof t||t instanceof RegExp)&&(o=t,t=null);var a=new n(e,i).to.throw(t,o);return r(a,"object")},o.doesNotThrow=function(e,t,r){"string"==typeof t&&(r=t,t=null),new n(e,r).to.not.Throw(t)},o.operator=function(e,o,i,a){var s;switch(o){case"==":s=e==i;break;case"===":s=e===i;break;case">":s=e>i;break;case">=":s=e>=i;break;case"<":s=e1&&n===t.length-1?"or ":"")+r+" "+e}).join(", ");if(!t.some(function(t){return i(e)===t}))throw new r("object tested must be "+n+", but "+i(e)+" given")}},{"./flag":14,"assertion-error":1,"type-detect":36}],14:[function(e,t,n){t.exports=function(e,t,n){var r=e.__flags||(e.__flags=Object.create(null));if(3!==arguments.length)return r[t];r[t]=n}},{}],15:[function(e,t,n){t.exports=function(e,t){return t.length>4?t[4]:e._obj}},{}],16:[function(e,t,n){t.exports=function(e){var t=[];for(var n in e)t.push(n);return t}},{}],17:[function(e,t,n){var r=e("./flag"),o=e("./getActual"),i=(e("./inspect"),e("./objDisplay"));t.exports=function(e,t){var n=r(e,"negate"),a=r(e,"object"),s=t[3],u=o(e,t),c=n?t[2]:t[1],f=r(e,"message");return"function"==typeof c&&(c=c()),c=c||"",c=c.replace(/#\{this\}/g,function(){return i(a)}).replace(/#\{act\}/g,function(){return i(u)}).replace(/#\{exp\}/g,function(){return i(s)}),f?f+": "+c:c}},{"./flag":14,"./getActual":15,"./inspect":24,"./objDisplay":25}],18:[function(e,t,n){t.exports=function(e){if(e.name)return e.name;var t=/^\s?function ([^(]*)\(/.exec(e);return t&&t[1]?t[1]:""}},{}],19:[function(e,t,n){function r(e){return e.replace(/([^\\])\[/g,"$1.[").match(/(\\\.|[^.]+?)+/g).map(function(e){var t=/^\[(\d+)\]$/,n=t.exec(e);return n?{i:parseFloat(n[1])}:{p:e.replace(/\\([.\[\]])/g,"$1")}})}function o(e,t,n){var r,o=t;n=void 0===n?e.length:n;for(var i=0,a=n;i1?o(n,t,n.length-1):t,name:a.p||a.i,value:o(n,t)};return s.exists=i(s.name,s.parent),s}},{"./hasProperty":22}],20:[function(e,t,n){var r=e("./getPathInfo");t.exports=function(e,t){return r(e,t).value}},{"./getPathInfo":19}],21:[function(e,t,n){t.exports=function(e){function t(e){-1===n.indexOf(e)&&n.push(e)}for(var n=Object.getOwnPropertyNames(e),r=Object.getPrototypeOf(e);null!==r;)Object.getOwnPropertyNames(r).forEach(t),r=Object.getPrototypeOf(r);return n}},{}],22:[function(e,t,n){var r=e("type-detect"),o={number:Number,string:String};t.exports=function(e,t){var n=r(t);return"null"!==n&&"undefined"!==n&&(o[n]&&"object"!=typeof t&&(t=new o[n](t)),e in t)}},{"type-detect":36}],23:[function(e,t,n){var n=t.exports={};n.test=e("./test"),n.type=e("type-detect"),n.expectTypes=e("./expectTypes"),n.getMessage=e("./getMessage"),n.getActual=e("./getActual"),n.inspect=e("./inspect"),n.objDisplay=e("./objDisplay"),n.flag=e("./flag"),n.transferFlags=e("./transferFlags"),n.eql=e("deep-eql"),n.getPathValue=e("./getPathValue"),n.getPathInfo=e("./getPathInfo"),n.hasProperty=e("./hasProperty"),n.getName=e("./getName"),n.addProperty=e("./addProperty"),n.addMethod=e("./addMethod"),n.overwriteProperty=e("./overwriteProperty"),n.overwriteMethod=e("./overwriteMethod"),n.addChainableMethod=e("./addChainableMethod"),n.overwriteChainableMethod=e("./overwriteChainableMethod")},{"./addChainableMethod":10,"./addMethod":11,"./addProperty":12,"./expectTypes":13,"./flag":14,"./getActual":15,"./getMessage":17,"./getName":18,"./getPathInfo":19,"./getPathValue":20,"./hasProperty":22,"./inspect":24,"./objDisplay":25,"./overwriteChainableMethod":26,"./overwriteMethod":27,"./overwriteProperty":28,"./test":29,"./transferFlags":30,"deep-eql":31,"type-detect":36}],24:[function(e,t,n){function r(e,t,n,r){return o({showHidden:t,seen:[],stylize:function(e){return e}},e,void 0===n?2:n)}function o(e,t,r){if(t&&"function"==typeof t.inspect&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var p=t.inspect(r);return"string"!=typeof p&&(p=o(e,p,r)),p}var m=i(e,t);if(m)return m;if(g(t)){if("outerHTML"in t)return t.outerHTML;try{if(document.xmlVersion){return(new XMLSerializer).serializeToString(t)}var w=document.createElementNS("http://www.w3.org/1999/xhtml","_");return w.appendChild(t.cloneNode(!1)),html=w.innerHTML.replace("><",">"+t.innerHTML+"<"),w.innerHTML="",html}catch(e){}}var x=y(t),E=e.showHidden?b(t):x;if(0===E.length||h(t)&&(1===E.length&&"stack"===E[0]||2===E.length&&"description"===E[0]&&"stack"===E[1])){if("function"==typeof t){var j=v(t),O=j?": "+j:"";return e.stylize("[Function"+O+"]","special")}if(l(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(d(t))return e.stylize(Date.prototype.toUTCString.call(t),"date");if(h(t))return a(t)}var S="",A=!1,_=["{","}"];if(f(t)&&(A=!0,_=["[","]"]),"function"==typeof t){var j=v(t),O=j?": "+j:"";S=" [Function"+O+"]"}if(l(t)&&(S=" "+RegExp.prototype.toString.call(t)),d(t)&&(S=" "+Date.prototype.toUTCString.call(t)),h(t))return a(t);if(0===E.length&&(!A||0==t.length))return _[0]+S+_[1];if(r<0)return l(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var N;return N=A?s(e,t,r,x,E):E.map(function(n){return u(e,t,r,x,n,A)}),e.seen.pop(),c(N,S,_)}function i(e,t){switch(typeof t){case"undefined":return e.stylize("undefined","undefined");case"string":var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string");case"number":return 0===t&&1/t==-1/0?e.stylize("-0","number"):e.stylize(""+t,"number");case"boolean":return e.stylize(""+t,"boolean")}if(null===t)return e.stylize("null","null")}function a(e){return"["+Error.prototype.toString.call(e)+"]"}function s(e,t,n,r,o){for(var i=[],a=0,s=t.length;a-1&&(u=a?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),void 0===s){if(a&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function c(e,t,n){var r=0;return e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.length+1},0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function f(e){return Array.isArray(e)||"object"==typeof e&&"[object Array]"===p(e)}function l(e){return"object"==typeof e&&"[object RegExp]"===p(e)}function d(e){return"object"==typeof e&&"[object Date]"===p(e)}function h(e){return"object"==typeof e&&"[object Error]"===p(e)}function p(e){return Object.prototype.toString.call(e)}var v=e("./getName"),b=e("./getProperties"),y=e("./getEnumerableProperties");t.exports=r;var g=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName}},{"./getEnumerableProperties":16,"./getName":18,"./getProperties":21}],25:[function(e,t,n){var r=e("./inspect"),o=e("../config");t.exports=function(e){var t=r(e),n=Object.prototype.toString.call(e);if(o.truncateThreshold&&t.length>=o.truncateThreshold){if("[object Function]"===n)return e.name&&""!==e.name?"[Function: "+e.name+"]":"[Function]";if("[object Array]"===n)return"[ Array("+e.length+") ]";if("[object Object]"===n){var i=Object.keys(e);return"{ Object ("+(i.length>2?i.splice(0,2).join(", ")+", ...":i.join(", "))+") }"}return t}return t}},{"../config":5,"./inspect":24}],26:[function(e,t,n){t.exports=function(e,t,n,r){var o=e.__methods[t],i=o.chainingBehavior;o.chainingBehavior=function(){var e=r(i).call(this);return void 0===e?this:e};var a=o.method;o.method=function(){var e=n(a).apply(this,arguments);return void 0===e?this:e}}},{}],27:[function(e,t,n){t.exports=function(e,t,n){var r=e[t],o=function(){return this};r&&"function"==typeof r&&(o=r),e[t]=function(){var e=n(o).apply(this,arguments);return void 0===e?this:e}}},{}],28:[function(e,t,n){t.exports=function(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t),o=function(){};r&&"function"==typeof r.get&&(o=r.get),Object.defineProperty(e,t,{get:function(){var e=n(o).call(this);return void 0===e?this:e},configurable:!0})}},{}],29:[function(e,t,n){var r=e("./flag");t.exports=function(e,t){var n=r(e,"negate"),o=t[0];return n?!o:o}},{"./flag":14}],30:[function(e,t,n){t.exports=function(e,t,n){var r=e.__flags||(e.__flags=Object.create(null));t.__flags||(t.__flags=Object.create(null)),n=3!==arguments.length||n;for(var o in r)(n||"object"!==o&&"ssfi"!==o&&"message"!=o)&&(t.__flags[o]=r[o])}},{}],31:[function(e,t,n){t.exports=e("./lib/eql")},{"./lib/eql":32}],32:[function(e,t,n){function r(e,t,n){return!!o(e,t)||("date"===v(e)?a(e,t):"regexp"===v(e)?s(e,t):p.isBuffer(e)?l(e,t):"arguments"===v(e)?u(e,t,n):!!i(e,t)&&("object"!==v(e)&&"object"!==v(t)&&"array"!==v(e)&&"array"!==v(t)?o(e,t):h(e,t,n)))}function o(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}function i(e,t){return v(e)===v(t)}function a(e,t){return"date"===v(t)&&o(e.getTime(),t.getTime())}function s(e,t){return"regexp"===v(t)&&o(e.toString(),t.toString())}function u(e,t,n){return"arguments"===v(t)&&(e=[].slice.call(e),t=[].slice.call(t),r(e,t,n))}function c(e){var t=[];for(var n in e)t.push(n);return t}function f(e,t){if(e.length!==t.length)return!1;for(var n=0,r=!0;n=0;o--)if(s=i[o],!r(e[s],t[s],n))return!1;return!0}var p,v=e("type-detect");try{p=e("buffer").Buffer}catch(e){p={},p.isBuffer=function(){return!1}}t.exports=r},{buffer:void 0,"type-detect":33}],33:[function(e,t,n){t.exports=e("./lib/type")},{"./lib/type":34}],34:[function(e,t,n){function r(e){var t=Object.prototype.toString.call(e);return i[t]?i[t]:null===e?"null":void 0===e?"undefined":e===Object(e)?"object":typeof e}function o(){this.tests={}}var n=t.exports=r,i={"[object Array]":"array","[object RegExp]":"regexp","[object Function]":"function","[object Arguments]":"arguments","[object Date]":"date"};n.Library=o,o.prototype.of=r,o.prototype.define=function(e,t){return 1===arguments.length?this.tests[e]:(this.tests[e]=t,this)},o.prototype.test=function(e,t){if(t===r(e))return!0;var n=this.tests[t];if(n&&"regexp"===r(n))return n.test(e);if(n&&"function"===r(n))return n(e);throw new ReferenceError('Type test "'+t+'" not defined or invalid.')}},{}],35:[function(e,t,n){(function(r){!function(e){if("object"==typeof n&&void 0!==t)t.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var o;o="undefined"!=typeof window?window:void 0!==r?r:"undefined"!=typeof self?self:this,o.localforage=e()}}(function(){return function t(n,r,o){function i(s,u){if(!r[s]){if(!n[s]){var c="function"==typeof e&&e;if(!u&&c)return c(s,!0);if(a)return a(s,!0);var f=new Error("Cannot find module '"+s+"'");throw f.code="MODULE_NOT_FOUND",f}var l=r[s]={exports:{}};n[s][0].call(l.exports,function(e){var t=n[s][1][e];return i(t||e)},l,l.exports,t,n,r,o)}return r[s].exports}for(var a="function"==typeof e&&e,s=0;s=43)}}).catch(function(){return!1})}function c(e){return"boolean"==typeof re?ie.resolve(re):u(e).then(function(e){return re=e})}function f(e){var t=oe[e.name],n={};n.promise=new ie(function(e){n.resolve=e}),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then(function(){return n.promise}):t.dbReady=n.promise}function l(e){var t=oe[e.name],n=t.deferredOperations.pop();n&&n.resolve()}function d(e,t){return new ie(function(n,r){if(e.db){if(!t)return n(e.db);f(e),e.db.close()}var o=[e.name];t&&o.push(e.version);var i=ne.open.apply(ne,o);t&&(i.onupgradeneeded=function(t){var n=i.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(ae)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),i.onerror=function(e){e.preventDefault(),r(i.error)},i.onsuccess=function(){n(i.result),l(e)}})}function h(e){return d(e,!1)}function p(e){return d(e,!0)}function v(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),r=e.versione.db.version;if(r&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),o||n){if(n){var i=e.db.version+1;i>e.version&&(e.version=i)}return!0}return!1}function b(e){return new ie(function(t,n){var r=new FileReader;r.onerror=n,r.onloadend=function(n){var r=btoa(n.target.result||"");t({__local_forage_encoded_blob:!0,data:r,type:e.type})},r.readAsBinaryString(e)})}function y(e){return o([s(atob(e.data))],{type:e.type})}function g(e){return e&&e.__local_forage_encoded_blob}function m(e){var t=this,n=t._initReady().then(function(){var e=oe[t._dbInfo.name];if(e&&e.dbReady)return e.dbReady});return a(n,e,e),n}function w(e){function t(){return ie.resolve()}var n=this,r={db:null};if(e)for(var o in e)r[o]=e[o];oe||(oe={});var i=oe[r.name];i||(i={forages:[],db:null,dbReady:null,deferredOperations:[]},oe[r.name]=i),i.forages.push(n),n._initReady||(n._initReady=n.ready,n.ready=m);for(var a=[],s=0;s>4,f[u++]=(15&r)<<4|o>>2,f[u++]=(3&o)<<6|63&i;return c}function M(e){var t,n=new Uint8Array(e),r="";for(t=0;t>2],r+=ce[(3&n[t])<<4|n[t+1]>>4],r+=ce[(15&n[t+1])<<2|n[t+2]>>6],r+=ce[63&n[t+2]];return n.length%3==2?r=r.substring(0,r.length-1)+"=":n.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}function I(e,t){var n="";if(e&&(n=Ae.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===Ae.call(e.buffer))){var r,o=de;e instanceof ArrayBuffer?(r=e,o+=pe):(r=e.buffer,"[object Int8Array]"===n?o+=be:"[object Uint8Array]"===n?o+=ye:"[object Uint8ClampedArray]"===n?o+=ge:"[object Int16Array]"===n?o+=me:"[object Uint16Array]"===n?o+=xe:"[object Int32Array]"===n?o+=we:"[object Uint32Array]"===n?o+=Ee:"[object Float32Array]"===n?o+=je:"[object Float64Array]"===n?o+=Oe:t(new Error("Failed to get type for BinaryArray"))),t(o+M(r))}else if("[object Blob]"===n){var i=new FileReader;i.onload=function(){var n=fe+e.type+"~"+M(this.result);t(de+ve+n)},i.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(n){console.error("Couldn't convert value into a JSON string: ",e),t(null,n)}}function k(e){if(e.substring(0,he)!==de)return JSON.parse(e);var t,n=e.substring(Se),r=e.substring(he,Se);if(r===ve&&le.test(n)){var i=n.match(le);t=i[1],n=n.substring(i[0].length)}var a=P(n);switch(r){case pe:return a;case ve:return o([a],{type:t});case be:return new Int8Array(a);case ye:return new Uint8Array(a);case ge:return new Uint8ClampedArray(a);case me:return new Int16Array(a);case xe:return new Uint16Array(a);case we:return new Int32Array(a);case Ee:return new Uint32Array(a);case je:return new Float32Array(a);case Oe:return new Float64Array(a);default:throw new Error("Unkown type: "+r)}}function T(e){var t=this,n={db:null};if(e)for(var r in e)n[r]="string"!=typeof e[r]?e[r].toString():e[r];var o=new ie(function(e,r){try{n.db=openDatabase(n.name,String(n.version),n.description,n.size)}catch(e){return r(e)}n.db.transaction(function(o){o.executeSql("CREATE TABLE IF NOT EXISTS "+n.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],function(){t._dbInfo=n,e()},function(e,t){r(t)})})});return n.serializer=_e,o}function C(e,t){var n=this;"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e));var r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("SELECT * FROM "+o.storeName+" WHERE key = ? LIMIT 1",[e],function(e,n){var r=n.rows.length?n.rows.item(0).value:null;r&&(r=o.serializer.deserialize(r)),t(r)},function(e,t){r(t)})})}).catch(r)});return i(r,t),r}function R(e,t){var n=this,r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("SELECT * FROM "+o.storeName,[],function(n,r){for(var i=r.rows,a=i.length,s=0;s0)return void i(q.apply(o,[e,s,n,r-1]));a(t)}})})}).catch(a)});return i(a,n),a}function L(e,t,n){return q.apply(this,[e,t,n,1])}function D(e,t){var n=this;"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e));var r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("DELETE FROM "+o.storeName+" WHERE key = ?",[e],function(){t()},function(e,t){r(t)})})}).catch(r)});return i(r,t),r}function B(e){var t=this,n=new ie(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){t.executeSql("DELETE FROM "+r.storeName,[],function(){e()},function(e,t){n(t)})})}).catch(n)});return i(n,e),n}function F(e){var t=this,n=new ie(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){t.executeSql("SELECT COUNT(key) as c FROM "+r.storeName,[],function(t,n){var r=n.rows.item(0).c;e(r)},function(e,t){n(t)})})}).catch(n)});return i(n,e),n}function z(e,t){var n=this,r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("SELECT key FROM "+o.storeName+" WHERE id = ? LIMIT 1",[e+1],function(e,n){var r=n.rows.length?n.rows.item(0).key:null;t(r)},function(e,t){r(t)})})}).catch(r)});return i(r,t),r}function U(e){var t=this,n=new ie(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){t.executeSql("SELECT key FROM "+r.storeName,[],function(t,n){for(var r=[],o=0;o=0;n--){var r=localStorage.key(n);0===r.indexOf(e)&&localStorage.removeItem(r)}});return i(n,e),n}function J(e,t){var n=this;"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e));var r=n.ready().then(function(){var t=n._dbInfo,r=localStorage.getItem(t.keyPrefix+e);return r&&(r=t.serializer.deserialize(r)),r});return i(r,t),r}function G(e,t){var n=this,r=n.ready().then(function(){for(var t=n._dbInfo,r=t.keyPrefix,o=r.length,i=localStorage.length,a=1,s=0;s=e.length-1||t<0?0:t+1}function getCurrentProblem(e){return e[config.currentIndex]}function previousProblem(){console.log("previousProblem!"),previousProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getPreviousIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function nextProblem(){ -console.log("nextProblem!"),nextProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getNextIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function toggleShuffle(){console.log("toggle shuffle!"),config.shuffle=!config.shuffle,shuffleProblemsButtonEl.classList.toggle("active"),previousProblemButtonEl.parentNode.classList.toggle("hidden"),updateLocalstore(config)}function loadProblem(e){currentProblem=e,problemEl.innerText=e.prompt,e.given&&(codeEl.value=e.given),testSuite(null,!0)}function updateTests(e,t){!0===t&&buildTests(currentProblem.tests),updateTestStatus(e)}function buildTests(e){if(e){var t=e.map(function(e){return'
\n
[✘]
\n
'+e.name+"
\n
"}).join("");testSuiteEl.innerHTML=t}}function updateTestStatus(e){if(!e)throw new Error("No testStatuses provided.");var t=!0;e.forEach(function(e){!0!==e&&(t=!1)}),[].slice.call(testSuiteEl.querySelectorAll(".test-state")).forEach(function(t,n){!0===e[n]?(t.innerHTML="[✓]",t.classList.remove("fail"),t.classList.add("pass")):(t.innerHTML="[✘]",t.classList.remove("pass"),t.classList.add("fail"))}),!0===t?(testTotalEl.innerText="PASS",testTotalEl.classList.remove("fail"),testTotalEl.classList.add("pass")):(testTotalEl.innerText="FAIL",testTotalEl.classList.remove("pass"),testTotalEl.classList.add("fail"))}function printAssertError(e){var t="";null!==e&&(t='\n
\n Expected: '+JSON.stringify(e.expected)+"\n Actual: "+JSON.stringify(e.actual)+"\n
"),assertConsoleEl.innerHTML=t}function printEvalOutput(e,t){var n="";e&&void 0!==e.message?n='\n
\n Syntax Error: '+JSON.stringify(e.message)+"\n
":t&&(n='\n
\n Output: '+JSON.stringify(t)+"\n
"),evalConsoleEl.innerHTML=n}function testSuite(e){testTotalEl.classList.toggle("working");var t=getOutput(codeEl.value),n=runTests(t);testTotalEl.classList.toggle("working"),updateTests(n,e)}function getOutput(code){var evald=!1;try{evald=eval("(function(){"+code+"})()"),printEvalOutput(null,evald)}catch(e){printEvalOutput(e)}return evald}function runTests(e){return currentProblem.tests.map(function(t){var n=!1;try{e&&(n=t.test(e)),printAssertError(null)}catch(e){printAssertError(e)}return n})}function loadApp(e){function t(t){!1===e.shuffle&&13===t.keyCode&&t.shiftKey&&(t.metaKey||t.ctrlKey)?previousProblem():13!==t.keyCode||t.shiftKey||!t.metaKey&&!t.ctrlKey||nextProblem()}console.log("loading app!"),!0===e.shuffle&&(shuffleProblemsButtonEl.classList.add("active"),previousProblemButtonEl.parentNode.classList.add("hidden"));var n=debounce(function(e){-1===ignoreKeyCodes.indexOf(e.keyCode)&&testSuite()},200);codeEl.addEventListener("keydown",n),document.addEventListener("keydown",t),shuffleProblemsButtonEl.addEventListener("click",toggleShuffle),previousProblemButtonEl.addEventListener("click",previousProblem),nextProblemButtonEl.addEventListener("click",nextProblem),loadProblem(getCurrentProblem(problems)),testSuite(!0)}var localforage=require("localforage"),problems=require("../problems/arrays.js"),currentProblem=void 0,ignoreKeyCodes=[9,37,39,38,40],config={shuffle:!0,timer:!1,currentIndex:0};localforage.getItem("js_practice_config").then(function(e){console.log("localforage val:",e),e&&(config=e),loadApp(config)}).catch(function(e){console.log("localforage err:",e),loadApp(config)});var problemEl=document.getElementById("problem"),codeEl=document.getElementById("code"),testSuiteEl=document.getElementById("test-suite"),testTotalEl=document.getElementById("test-total"),evalConsoleEl=document.getElementById("eval-output"),assertConsoleEl=document.getElementById("assert-output"),shuffleProblemsButtonEl=document.getElementById("shuffle-problems"),previousProblemButtonEl=document.getElementById("prev-problem"),nextProblemButtonEl=document.getElementById("next-problem")}(document,window)},{"../problems/arrays.js":39,localforage:35}],39:[function(e,t,n){"use strict";var r=e("chai").assert;t.exports=[{name:"Create Array",time:10,prompt:"Create and return an array that contains 'apple' and 'banana'",given:"const fruits = [];\rreturn fruits;",answer:"const fruits = ['apple', 'banana'];\n return fruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["apple","banana"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n return fruits[0];",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"apple")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"orange")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n return fruits[1];",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"banana")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Array.forEach()",time:20,prompt:"Loop over the array, add an 'x' to the end of each name, push each fruit into a new array, then return the new array.",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["applex","bananax"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.push()",time:10,prompt:"Add 'orange' to the end of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["apple","banana","orange"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 3 items",test:function(e){return void 0===r.lengthOf(e,3)}}]},{name:"Array.pop()",time:10,prompt:"Remove 'orange' from the end of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["apple","banana"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.shift()",time:10,prompt:"Remove 'apple' from the front of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;",tests:[{name:"Output must be correct",test:function(e){return void 0===r.deepEqual(e,["banana","orange"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.unshift()",time:10,prompt:"Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;",tests:[{name:"Output must be correct",test:function(e){return void 0===r.deepEqual(e,["strawberry","apple","banana","orange"])}},{name:"Must return an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}}]},{name:"Array.indexOf()",time:10,prompt:"Return the index of 'banana' in the Array.",given:"const fruits = ['strawberry', 'banana', 'mango'];\r",answer:"const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,1)}},{name:"Returns a Number",test:function(e){return void 0===r.isNumber(e)}}]},{name:"Array.concat()",time:10,prompt:"Merge the two arrays using Array's 'concat()' method. Return the resulting array.",given:"const fruits = ['strawberry', 'banana'];\rconst otherFruits = ['pear','peach'];\r",answer:"const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\r",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["strawberry","banana","pear","peach"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}}]},{name:"Array.join()",time:10,prompt:"Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.",given:"const fruits = ['strawberry', 'banana'];\r",answer:"const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\r",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"strawberry-banana")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Array.slice()",time:20,prompt:"Return just the citrus fruits from the 'fruits' array using 'Array.slice()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["orange","lemon"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.reverse()",time:10,prompt:"Reverse the order of the 'fruit' array using 'Array.reverse()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["banana","lemon","orange","strawberry"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}},{name:"First item is 'banana'",test:function(e){return void 0===r.deepEqual(e[0],"banana")}}]},{name:"Array.sort()",time:10,prompt:"Sort the order of the 'fruit' array using 'Array.sort()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["banana","lemon","orange","strawberry"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}},{name:"First item is 'banana'",test:function(e){return void 0===r.deepEqual(e[0],"banana")}}]},{name:"Array.lastIndexOf()",time:10,prompt:"Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'",given:"const fruits = ['peach', 'orange', 'lemon', 'peach'];\r",answer:"const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,3)}},{name:"Returns a Number",test:function(e){return void 0===r.isNumber(e)}}]},{name:"Array.filter()",time:10,prompt:"Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'",given:"const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\r",answer:"const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,[8,13,21])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 3 items",test:function(e){return void 0===r.lengthOf(e,3)}},{name:"First item is 8",test:function(e){return void 0===r.deepEqual(e[0],8)}}]},{name:"Array.map()",time:10,prompt:"Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'",given:"const numbers = [25, 121, 169];\r",answer:"const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,[5,11,13])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 3 items",test:function(e){return void 0===r.lengthOf(e,3)}},{name:"First item is 5",test:function(e){return void 0===r.deepEqual(e[0],5)}},{name:"Last item is 13",test:function(e){return void 0===r.deepEqual(e[e.length-1],13)}}]},{name:"Array.every()",time:10,prompt:"Return object that returns whether each array contains all even numbers using Array.every().",given:"\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};",answer:"\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n return element % 2 === 0\n}\nreturn {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n};",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,{evenNumbers:!0,someOddNumbers:!1})}},{name:"Returns an Object",test:function(e){return void 0===r.isObject(e)}},{name:"Object has 2 items",test:function(e){return void 0===r.lengthOf(Object.keys(e),2)}},{name:"First value is true",test:function(e){return void 0===r.isTrue(e.evenNumbers)}},{name:"Second value is false",test:function(e){return void 0===r.isFalse(e.someOddNumbers)}}]},{name:"Array.some()",time:10,prompt:"Return object that returns whether each array contains some odd numbers using Array.some().",given:"\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 4, 7, 8];\nfunction isOdd(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};",answer:"\nconst evenNumbers = [1, 3, 5, 7];\nconst someOddNumbers = [1, 3, 6, 7];\nfunction isOdd(element) {\n return element % 2 !== 0;\n}\nreturn {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n};",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,{evenNumbers:!1,someOddNumbers:!0})}},{name:"Returns an Object",test:function(e){return void 0===r.isObject(e)}},{name:"Object has 2 items",test:function(e){return void 0===r.lengthOf(Object.keys(e),2)}},{name:"First value is false",test:function(e){return void 0===r.isFalse(e.evenNumbers)}},{name:"Second value is true",test:function(e){return void 0===r.isTrue(e.someOddNumbers)}}]}]},{chai:2}]},{},[38]); +u||(e.seen.indexOf(t[i])<0?(u=null===n?o(e,t[i],null):o(e,t[i],n-1),u.indexOf("\n")>-1&&(u=a?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),void 0===s){if(a&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function c(e,t,n){var r=0;return e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.length+1},0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function f(e){return Array.isArray(e)||"object"==typeof e&&"[object Array]"===p(e)}function l(e){return"object"==typeof e&&"[object RegExp]"===p(e)}function d(e){return"object"==typeof e&&"[object Date]"===p(e)}function h(e){return"object"==typeof e&&"[object Error]"===p(e)}function p(e){return Object.prototype.toString.call(e)}var v=e("./getName"),b=e("./getProperties"),y=e("./getEnumerableProperties");t.exports=r;var g=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName}},{"./getEnumerableProperties":16,"./getName":18,"./getProperties":21}],25:[function(e,t,n){var r=e("./inspect"),o=e("../config");t.exports=function(e){var t=r(e),n=Object.prototype.toString.call(e);if(o.truncateThreshold&&t.length>=o.truncateThreshold){if("[object Function]"===n)return e.name&&""!==e.name?"[Function: "+e.name+"]":"[Function]";if("[object Array]"===n)return"[ Array("+e.length+") ]";if("[object Object]"===n){var i=Object.keys(e);return"{ Object ("+(i.length>2?i.splice(0,2).join(", ")+", ...":i.join(", "))+") }"}return t}return t}},{"../config":5,"./inspect":24}],26:[function(e,t,n){t.exports=function(e,t,n,r){var o=e.__methods[t],i=o.chainingBehavior;o.chainingBehavior=function(){var e=r(i).call(this);return void 0===e?this:e};var a=o.method;o.method=function(){var e=n(a).apply(this,arguments);return void 0===e?this:e}}},{}],27:[function(e,t,n){t.exports=function(e,t,n){var r=e[t],o=function(){return this};r&&"function"==typeof r&&(o=r),e[t]=function(){var e=n(o).apply(this,arguments);return void 0===e?this:e}}},{}],28:[function(e,t,n){t.exports=function(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t),o=function(){};r&&"function"==typeof r.get&&(o=r.get),Object.defineProperty(e,t,{get:function(){var e=n(o).call(this);return void 0===e?this:e},configurable:!0})}},{}],29:[function(e,t,n){var r=e("./flag");t.exports=function(e,t){var n=r(e,"negate"),o=t[0];return n?!o:o}},{"./flag":14}],30:[function(e,t,n){t.exports=function(e,t,n){var r=e.__flags||(e.__flags=Object.create(null));t.__flags||(t.__flags=Object.create(null)),n=3!==arguments.length||n;for(var o in r)(n||"object"!==o&&"ssfi"!==o&&"message"!=o)&&(t.__flags[o]=r[o])}},{}],31:[function(e,t,n){t.exports=e("./lib/eql")},{"./lib/eql":32}],32:[function(e,t,n){function r(e,t,n){return!!o(e,t)||("date"===v(e)?a(e,t):"regexp"===v(e)?s(e,t):p.isBuffer(e)?l(e,t):"arguments"===v(e)?u(e,t,n):!!i(e,t)&&("object"!==v(e)&&"object"!==v(t)&&"array"!==v(e)&&"array"!==v(t)?o(e,t):h(e,t,n)))}function o(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}function i(e,t){return v(e)===v(t)}function a(e,t){return"date"===v(t)&&o(e.getTime(),t.getTime())}function s(e,t){return"regexp"===v(t)&&o(e.toString(),t.toString())}function u(e,t,n){return"arguments"===v(t)&&(e=[].slice.call(e),t=[].slice.call(t),r(e,t,n))}function c(e){var t=[];for(var n in e)t.push(n);return t}function f(e,t){if(e.length!==t.length)return!1;for(var n=0,r=!0;n=0;o--)if(s=i[o],!r(e[s],t[s],n))return!1;return!0}var p,v=e("type-detect");try{p=e("buffer").Buffer}catch(e){p={},p.isBuffer=function(){return!1}}t.exports=r},{buffer:void 0,"type-detect":34}],33:[function(e,t,n){(function(r){!function(e){if("object"==typeof n&&void 0!==t)t.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var o;o="undefined"!=typeof window?window:void 0!==r?r:"undefined"!=typeof self?self:this,o.localforage=e()}}(function(){return function t(n,r,o){function i(s,u){if(!r[s]){if(!n[s]){var c="function"==typeof e&&e;if(!u&&c)return c(s,!0);if(a)return a(s,!0);var f=new Error("Cannot find module '"+s+"'");throw f.code="MODULE_NOT_FOUND",f}var l=r[s]={exports:{}};n[s][0].call(l.exports,function(e){var t=n[s][1][e];return i(t||e)},l,l.exports,t,n,r,o)}return r[s].exports}for(var a="function"==typeof e&&e,s=0;s=43)}}).catch(function(){return!1})}function c(e){return"boolean"==typeof re?ie.resolve(re):u(e).then(function(e){return re=e})}function f(e){var t=oe[e.name],n={};n.promise=new ie(function(e){n.resolve=e}),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then(function(){return n.promise}):t.dbReady=n.promise}function l(e){var t=oe[e.name],n=t.deferredOperations.pop();n&&n.resolve()}function d(e,t){return new ie(function(n,r){if(e.db){if(!t)return n(e.db);f(e),e.db.close()}var o=[e.name];t&&o.push(e.version);var i=ne.open.apply(ne,o);t&&(i.onupgradeneeded=function(t){var n=i.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(ae)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),i.onerror=function(e){e.preventDefault(),r(i.error)},i.onsuccess=function(){n(i.result),l(e)}})}function h(e){return d(e,!1)}function p(e){return d(e,!0)}function v(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),r=e.versione.db.version;if(r&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),o||n){if(n){var i=e.db.version+1;i>e.version&&(e.version=i)}return!0}return!1}function b(e){return new ie(function(t,n){var r=new FileReader;r.onerror=n,r.onloadend=function(n){var r=btoa(n.target.result||"");t({__local_forage_encoded_blob:!0,data:r,type:e.type})},r.readAsBinaryString(e)})}function y(e){return o([s(atob(e.data))],{type:e.type})}function g(e){return e&&e.__local_forage_encoded_blob}function m(e){var t=this,n=t._initReady().then(function(){var e=oe[t._dbInfo.name];if(e&&e.dbReady)return e.dbReady});return a(n,e,e),n}function w(e){function t(){return ie.resolve()}var n=this,r={db:null};if(e)for(var o in e)r[o]=e[o];oe||(oe={});var i=oe[r.name];i||(i={forages:[],db:null,dbReady:null,deferredOperations:[]},oe[r.name]=i),i.forages.push(n),n._initReady||(n._initReady=n.ready,n.ready=m);for(var a=[],s=0;s>4,f[u++]=(15&r)<<4|o>>2,f[u++]=(3&o)<<6|63&i;return c}function M(e){var t,n=new Uint8Array(e),r="";for(t=0;t>2],r+=ce[(3&n[t])<<4|n[t+1]>>4],r+=ce[(15&n[t+1])<<2|n[t+2]>>6],r+=ce[63&n[t+2]];return n.length%3==2?r=r.substring(0,r.length-1)+"=":n.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}function I(e,t){var n="";if(e&&(n=Ae.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===Ae.call(e.buffer))){var r,o=de;e instanceof ArrayBuffer?(r=e,o+=pe):(r=e.buffer,"[object Int8Array]"===n?o+=be:"[object Uint8Array]"===n?o+=ye:"[object Uint8ClampedArray]"===n?o+=ge:"[object Int16Array]"===n?o+=me:"[object Uint16Array]"===n?o+=xe:"[object Int32Array]"===n?o+=we:"[object Uint32Array]"===n?o+=Ee:"[object Float32Array]"===n?o+=je:"[object Float64Array]"===n?o+=Oe:t(new Error("Failed to get type for BinaryArray"))),t(o+M(r))}else if("[object Blob]"===n){var i=new FileReader;i.onload=function(){var n=fe+e.type+"~"+M(this.result);t(de+ve+n)},i.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(n){console.error("Couldn't convert value into a JSON string: ",e),t(null,n)}}function k(e){if(e.substring(0,he)!==de)return JSON.parse(e);var t,n=e.substring(Se),r=e.substring(he,Se);if(r===ve&&le.test(n)){var i=n.match(le);t=i[1],n=n.substring(i[0].length)}var a=P(n);switch(r){case pe:return a;case ve:return o([a],{type:t});case be:return new Int8Array(a);case ye:return new Uint8Array(a);case ge:return new Uint8ClampedArray(a);case me:return new Int16Array(a);case xe:return new Uint16Array(a);case we:return new Int32Array(a);case Ee:return new Uint32Array(a);case je:return new Float32Array(a);case Oe:return new Float64Array(a);default:throw new Error("Unkown type: "+r)}}function T(e){var t=this,n={db:null};if(e)for(var r in e)n[r]="string"!=typeof e[r]?e[r].toString():e[r];var o=new ie(function(e,r){try{n.db=openDatabase(n.name,String(n.version),n.description,n.size)}catch(e){return r(e)}n.db.transaction(function(o){o.executeSql("CREATE TABLE IF NOT EXISTS "+n.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],function(){t._dbInfo=n,e()},function(e,t){r(t)})})});return n.serializer=_e,o}function C(e,t){var n=this;"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e));var r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("SELECT * FROM "+o.storeName+" WHERE key = ? LIMIT 1",[e],function(e,n){var r=n.rows.length?n.rows.item(0).value:null;r&&(r=o.serializer.deserialize(r)),t(r)},function(e,t){r(t)})})}).catch(r)});return i(r,t),r}function R(e,t){var n=this,r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("SELECT * FROM "+o.storeName,[],function(n,r){for(var i=r.rows,a=i.length,s=0;s0)return void i(q.apply(o,[e,s,n,r-1]));a(t)}})})}).catch(a)});return i(a,n),a}function L(e,t,n){return q.apply(this,[e,t,n,1])}function D(e,t){var n=this;"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e));var r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("DELETE FROM "+o.storeName+" WHERE key = ?",[e],function(){t()},function(e,t){r(t)})})}).catch(r)});return i(r,t),r}function B(e){var t=this,n=new ie(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){t.executeSql("DELETE FROM "+r.storeName,[],function(){e()},function(e,t){n(t)})})}).catch(n)});return i(n,e),n}function F(e){var t=this,n=new ie(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){t.executeSql("SELECT COUNT(key) as c FROM "+r.storeName,[],function(t,n){var r=n.rows.item(0).c;e(r)},function(e,t){n(t)})})}).catch(n)});return i(n,e),n}function z(e,t){var n=this,r=new ie(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){n.executeSql("SELECT key FROM "+o.storeName+" WHERE id = ? LIMIT 1",[e+1],function(e,n){var r=n.rows.length?n.rows.item(0).key:null;t(r)},function(e,t){r(t)})})}).catch(r)});return i(r,t),r}function U(e){var t=this,n=new ie(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){t.executeSql("SELECT key FROM "+r.storeName,[],function(t,n){for(var r=[],o=0;o=0;n--){var r=localStorage.key(n);0===r.indexOf(e)&&localStorage.removeItem(r)}});return i(n,e),n}function J(e,t){var n=this;"string"!=typeof e&&(console.warn(e+" used as a key, but it is not a string."),e=String(e));var r=n.ready().then(function(){var t=n._dbInfo,r=localStorage.getItem(t.keyPrefix+e);return r&&(r=t.serializer.deserialize(r)),r});return i(r,t),r}function G(e,t){var n=this,r=n.ready().then(function(){for(var t=n._dbInfo,r=t.keyPrefix,o=r.length,i=localStorage.length,a=1,s=0;s=e.length-1||t<0?0:t+1}function getCurrentProblem(e){return e[config.currentIndex]}function previousProblem(){console.log("previousProblem!"),previousProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getPreviousIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function nextProblem(){ +console.log("nextProblem!"),nextProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getNextIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function toggleShuffle(){console.log("toggle shuffle!"),config.shuffle=!config.shuffle,shuffleProblemsButtonEl.classList.toggle("active"),previousProblemButtonEl.parentNode.classList.toggle("hidden"),updateLocalstore(config)}function loadProblem(e){currentProblem=e,problemEl.innerText=e.prompt,e.given&&(codeEl.value=e.given),testSuite(null,!0)}function updateTests(e,t){!0===t&&buildTests(currentProblem.tests),updateTestStatus(e)}function buildTests(e){if(e){var t=e.map(function(e){return'
\n
[✘]
\n
'+e.name+"
\n
"}).join("");testSuiteEl.innerHTML=t}}function updateTestStatus(e){if(!e)throw new Error("No testStatuses provided.");var t=!0;e.forEach(function(e){!0!==e&&(t=!1)}),[].slice.call(testSuiteEl.querySelectorAll(".test-state")).forEach(function(t,n){!0===e[n]?(t.innerHTML="[✓]",t.classList.remove("fail"),t.classList.add("pass")):(t.innerHTML="[✘]",t.classList.remove("pass"),t.classList.add("fail"))}),!0===t?(testTotalEl.innerText="PASS",testTotalEl.classList.remove("fail"),testTotalEl.classList.add("pass")):(testTotalEl.innerText="FAIL",testTotalEl.classList.remove("pass"),testTotalEl.classList.add("fail"))}function printAssertError(e){var t="";null!==e&&(t='\n
\n Expected: '+JSON.stringify(e.expected)+"\n Actual: "+JSON.stringify(e.actual)+"\n
"),assertConsoleEl.innerHTML=t}function printEvalOutput(e,t){var n="";e&&void 0!==e.message?n='\n
\n Syntax Error: '+JSON.stringify(e.message)+"\n
":t&&(n='\n
\n Output: '+JSON.stringify(t)+"\n
"),evalConsoleEl.innerHTML=n}function testSuite(e){testTotalEl.classList.toggle("working");var t=getOutput(codeEl.value),n=runTests(t);testTotalEl.classList.toggle("working"),updateTests(n,e)}function getOutput(code){var evald=!1;try{evald=eval("(function(){"+code+"})()"),printEvalOutput(null,evald)}catch(e){printEvalOutput(e)}return evald}function runTests(e){return currentProblem.tests.map(function(t){var n=!1;try{e&&(n=t.test(e)),printAssertError(null)}catch(e){printAssertError(e)}return n})}function loadApp(e){function t(t){!1===e.shuffle&&13===t.keyCode&&t.shiftKey&&(t.metaKey||t.ctrlKey)?previousProblem():13!==t.keyCode||t.shiftKey||!t.metaKey&&!t.ctrlKey||nextProblem()}console.log("loading app!"),!0===e.shuffle&&(shuffleProblemsButtonEl.classList.add("active"),previousProblemButtonEl.parentNode.classList.add("hidden"));var n=debounce(function(e){-1===ignoreKeyCodes.indexOf(e.keyCode)&&testSuite()},200);codeEl.addEventListener("keydown",n),document.addEventListener("keydown",t),shuffleProblemsButtonEl.addEventListener("click",toggleShuffle),previousProblemButtonEl.addEventListener("click",previousProblem),nextProblemButtonEl.addEventListener("click",nextProblem),loadProblem(getCurrentProblem(problems)),testSuite(!0)}var localforage=require("localforage"),problems=require("../problems/arrays.js"),currentProblem=void 0,ignoreKeyCodes=[9,37,39,38,40],config={shuffle:!0,timer:!1,currentIndex:0};localforage.getItem("js_practice_config").then(function(e){console.log("localforage val:",e),e&&(config=e),loadApp(config)}).catch(function(e){console.log("localforage err:",e),loadApp(config)});var problemEl=document.getElementById("problem"),codeEl=document.getElementById("code"),testSuiteEl=document.getElementById("test-suite"),testTotalEl=document.getElementById("test-total"),evalConsoleEl=document.getElementById("eval-output"),assertConsoleEl=document.getElementById("assert-output"),shuffleProblemsButtonEl=document.getElementById("shuffle-problems"),previousProblemButtonEl=document.getElementById("prev-problem"),nextProblemButtonEl=document.getElementById("next-problem")}(document,window)},{"../problems/arrays.js":39,localforage:33}],39:[function(e,t,n){"use strict";var r=e("chai").assert;t.exports=[{name:"Create Array",time:10,prompt:"Create and return an array that contains 'apple' and 'banana'",given:"const fruits = [];\rreturn fruits;",answer:"const fruits = ['apple', 'banana'];\n return fruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["apple","banana"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n return fruits[0];",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"apple")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"orange")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n return fruits[1];",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"banana")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Array.forEach()",time:20,prompt:"Loop over the array, add an 'x' to the end of each name, push each fruit into a new array, then return the new array.",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["applex","bananax"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.push()",time:10,prompt:"Add 'orange' to the end of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["apple","banana","orange"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 3 items",test:function(e){return void 0===r.lengthOf(e,3)}}]},{name:"Array.pop()",time:10,prompt:"Remove 'orange' from the end of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["apple","banana"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.shift()",time:10,prompt:"Remove 'apple' from the front of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;",tests:[{name:"Output must be correct",test:function(e){return void 0===r.deepEqual(e,["banana","orange"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.unshift()",time:10,prompt:"Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;",tests:[{name:"Output must be correct",test:function(e){return void 0===r.deepEqual(e,["strawberry","apple","banana","orange"])}},{name:"Must return an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}}]},{name:"Array.indexOf()",time:10,prompt:"Return the index of 'banana' in the Array.",given:"const fruits = ['strawberry', 'banana', 'mango'];\r",answer:"const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,1)}},{name:"Returns a Number",test:function(e){return void 0===r.isNumber(e)}}]},{name:"Array.concat()",time:10,prompt:"Merge the two arrays using Array's 'concat()' method. Return the resulting array.",given:"const fruits = ['strawberry', 'banana'];\rconst otherFruits = ['pear','peach'];\r",answer:"const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\r",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["strawberry","banana","pear","peach"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}}]},{name:"Array.join()",time:10,prompt:"Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.",given:"const fruits = ['strawberry', 'banana'];\r",answer:"const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\r",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,"strawberry-banana")}},{name:"Returns a String",test:function(e){return void 0===r.isString(e)}}]},{name:"Array.slice()",time:20,prompt:"Return just the citrus fruits from the 'fruits' array using 'Array.slice()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["orange","lemon"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 2 items",test:function(e){return void 0===r.lengthOf(e,2)}}]},{name:"Array.reverse()",time:10,prompt:"Reverse the order of the 'fruit' array using 'Array.reverse()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["banana","lemon","orange","strawberry"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}},{name:"First item is 'banana'",test:function(e){return void 0===r.deepEqual(e[0],"banana")}}]},{name:"Array.sort()",time:10,prompt:"Sort the order of the 'fruit' array using 'Array.sort()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,["banana","lemon","orange","strawberry"])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 4 items",test:function(e){return void 0===r.lengthOf(e,4)}},{name:"First item is 'banana'",test:function(e){return void 0===r.deepEqual(e[0],"banana")}}]},{name:"Array.lastIndexOf()",time:10,prompt:"Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'",given:"const fruits = ['peach', 'orange', 'lemon', 'peach'];\r",answer:"const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,3)}},{name:"Returns a Number",test:function(e){return void 0===r.isNumber(e)}}]},{name:"Array.filter()",time:10,prompt:"Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'",given:"const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\r",answer:"const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,[8,13,21])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 3 items",test:function(e){return void 0===r.lengthOf(e,3)}},{name:"First item is 8",test:function(e){return void 0===r.deepEqual(e[0],8)}}]},{name:"Array.map()",time:10,prompt:"Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'",given:"const numbers = [25, 121, 169];\r",answer:"const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,[5,11,13])}},{name:"Returns an Array",test:function(e){return void 0===r.isArray(e)}},{name:"Array has 3 items",test:function(e){return void 0===r.lengthOf(e,3)}},{name:"First item is 5",test:function(e){return void 0===r.deepEqual(e[0],5)}},{name:"Last item is 13",test:function(e){return void 0===r.deepEqual(e[e.length-1],13)}}]},{name:"Array.every()",time:10,prompt:"Return object that returns whether each array contains all even numbers using Array.every().",given:"\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};",answer:"\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n return element % 2 === 0\n}\nreturn {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n};",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,{evenNumbers:!0,someOddNumbers:!1})}},{name:"Returns an Object",test:function(e){return void 0===r.isObject(e)}},{name:"Object has 2 items",test:function(e){return void 0===r.lengthOf(Object.keys(e),2)}},{name:"First value is true",test:function(e){return void 0===r.isTrue(e.evenNumbers)}},{name:"Second value is false",test:function(e){return void 0===r.isFalse(e.someOddNumbers)}}]},{name:"Array.some()",time:10,prompt:"Return object that returns whether each array contains some odd numbers using Array.some().",given:"\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 4, 7, 8];\nfunction isOdd(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};",answer:"\nconst evenNumbers = [1, 3, 5, 7];\nconst someOddNumbers = [1, 3, 6, 7];\nfunction isOdd(element) {\n return element % 2 !== 0;\n}\nreturn {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n};",tests:[{name:"Correct output",test:function(e){return void 0===r.deepEqual(e,{evenNumbers:!1,someOddNumbers:!0})}},{name:"Returns an Object",test:function(e){return void 0===r.isObject(e)}},{name:"Object has 2 items",test:function(e){return void 0===r.lengthOf(Object.keys(e),2)}},{name:"First value is false",test:function(e){return void 0===r.isFalse(e.evenNumbers)}},{name:"Second value is true",test:function(e){return void 0===r.isTrue(e.someOddNumbers)}}]}]},{chai:2}]},{},[38]); //# sourceMappingURL=bundle.min.js.map diff --git a/public/dist/js/bundle.min.js.map b/public/dist/js/bundle.min.js.map index 9c23d80..a567ed4 100644 --- a/public/dist/js/bundle.min.js.map +++ b/public/dist/js/bundle.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/assertion-error/index.js","node_modules/chai/index.js","node_modules/chai/lib/chai.js","node_modules/chai/lib/chai/assertion.js","node_modules/chai/lib/chai/config.js","node_modules/chai/lib/chai/core/assertions.js","node_modules/chai/lib/chai/interface/assert.js","node_modules/chai/lib/chai/interface/expect.js","node_modules/chai/lib/chai/interface/should.js","node_modules/chai/lib/chai/utils/addChainableMethod.js","node_modules/chai/lib/chai/utils/addMethod.js","node_modules/chai/lib/chai/utils/addProperty.js","node_modules/chai/lib/chai/utils/expectTypes.js","node_modules/chai/lib/chai/utils/flag.js","node_modules/chai/lib/chai/utils/getActual.js","node_modules/chai/lib/chai/utils/getEnumerableProperties.js","node_modules/chai/lib/chai/utils/getMessage.js","node_modules/chai/lib/chai/utils/getName.js","node_modules/chai/lib/chai/utils/getPathInfo.js","node_modules/chai/lib/chai/utils/getPathValue.js","node_modules/chai/lib/chai/utils/getProperties.js","node_modules/chai/lib/chai/utils/hasProperty.js","node_modules/chai/lib/chai/utils/index.js","node_modules/chai/lib/chai/utils/inspect.js","node_modules/chai/lib/chai/utils/objDisplay.js","node_modules/chai/lib/chai/utils/overwriteChainableMethod.js","node_modules/chai/lib/chai/utils/overwriteMethod.js","node_modules/chai/lib/chai/utils/overwriteProperty.js","node_modules/chai/lib/chai/utils/test.js","node_modules/chai/lib/chai/utils/transferFlags.js","node_modules/deep-eql/index.js","node_modules/deep-eql/lib/eql.js","node_modules/deep-eql/node_modules/type-detect/index.js","node_modules/deep-eql/node_modules/type-detect/lib/type.js","node_modules/localforage/dist/localforage.js","node_modules/type-detect/lib/type.js","src/js/index.js","src/problems/arrays.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","exclude","excludeProps","res","obj","Object","keys","forEach","key","excludes","indexOf","slice","arguments","args","AssertionError","message","_props","ssf","extend","props","this","showDiff","callee","captureStackTrace","stack","prototype","create","name","constructor","toJSON","used","version","util","use","fn","push","config","assertion","core","expect","should","assert","_chai","Assertion","msg","flag","defineProperty","get","console","warn","includeStack","set","value","addProperty","addMethod","addChainableMethod","chainingBehavior","overwriteProperty","overwriteMethod","overwriteChainableMethod","expr","negateMsg","expected","_actual","ok","test","getMessage","actual","getActual","val","truncateThreshold","chai","_","an","type","toLowerCase","article","charAt","includeChainingBehavior","include","expectTypes","eql","k","property","subset","undefined","inspect","checkArguments","toString","assertEqual","_obj","assertEql","assertAbove","to","have","len","assertLeast","assertBelow","assertMost","assertInstanceOf","getName","assertOwnProperty","hasOwnProperty","assertOwnPropertyDescriptor","descriptor","actualDescriptor","getOwnPropertyDescriptor","assertLengthChain","assertLength","assertMatch","re","exec","assertKeys","str","mixedArgsMsg","Array","any","all","filter","every","map","last","pop","join","sort","assertThrows","errMsg","is","thrown","desiredError","thrownError","RegExp","err","actuallyGot","expectedThrown","respondTo","method","itself","context","satisfy","matcher","result","objDisplay","negate","closeTo","delta","Math","abs","isSubsetOf","superset","cmp","elem","some","elem2","oneOf","list","be","assertChanges","object","prop","initial","assertIncreases","assertDecreases","chain","isNaN","isArray","start","finish","range","isDeep","pathInfo","getPathInfo","hasProperty","exists","isExtensible","TypeError","isSealed","isFrozen","express","errmsg","fail","operator","isOk","isNotOk","not","equal","act","exp","notEqual","strictEqual","notStrictEqual","deepEqual","notDeepEqual","isAbove","abv","above","isAtLeast","atlst","least","isBelow","blw","below","isAtMost","atmst","most","isTrue","isNotTrue","isFalse","isNotFalse","isNull","isNotNull","NaN","isNotNaN","isUndefined","isDefined","isFunction","isNotFunction","isObject","isNotObject","isNotArray","isString","isNotString","isNumber","isNotNumber","isBoolean","isNotBoolean","typeOf","notTypeOf","instanceOf","notInstanceOf","inc","notInclude","match","notMatch","notProperty","deepProperty","deep","notDeepProperty","propertyVal","propertyNotVal","deepPropertyVal","deepPropertyNotVal","lengthOf","throws","errt","errs","assertErr","throw","doesNotThrow","Throw","val2","approximately","sameMembers","set1","set2","same","members","sameDeepMembers","includeMembers","includeDeepMembers","inList","changes","change","doesNotChange","increases","increase","doesNotIncrease","decreases","decrease","doesNotDecrease","ifError","extensible","isNotExtensible","sealed","isNotSealed","frozen","isNotFrozen","alias","as","loadShould","shouldGetter","String","Number","Boolean","valueOf","shouldSetter","enumerable","configurable","writable","val1","exist","Should","transferFlags","hasProtoSupport","excludeNames","Function","apply","ctx","chainableBehavior","__methods","__proto__","getOwnPropertyNames","asserterName","pd","getter","types","index","art","flags","__flags","flagMsg","replace","func","parsePath","path","mArr","parseFloat","p","_getPathValue","parsed","tmp","part","info","parent","proto","getPrototypeOf","literals","number","string","ot","getPathValue","showHidden","depth","colors","formatValue","seen","stylize","recurseTimes","ret","primitive","formatPrimitive","isDOMElement","outerHTML","document","xmlVersion","XMLSerializer","serializeToString","container","createElementNS","appendChild","cloneNode","html","innerHTML","visibleKeys","getEnumerableProperties","getProperties","isError","nameSuffix","isRegExp","isDate","Date","toUTCString","formatError","base","array","braces","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","Infinity","__lookupGetter__","__lookupSetter__","split","line","substr","numLinesEst","reduce","prev","cur","ar","objectToString","d","HTMLElement","nodeType","nodeName","splice","_chainingBehavior","_method","_super","_get","includeAll","b","m","sameValue","dateEqual","regexpEqual","Buffer","isBuffer","bufferEqual","argumentsEqual","typeEqual","objectEqual","getTime","iterableEqual","isValue","ka","kb","ex","getType","natives","Library","tests","[object Array]","[object RegExp]","[object Function]","[object Arguments]","[object Date]","of","define","ReferenceError","amd","g","window","global","self","localforage","_dereq_","nextTick","draining","oldQueue","queue","immediate","task","scheduleDrain","Mutation","MutationObserver","WebKitMutationObserver","called","observer","element","createTextNode","observe","characterData","data","setImmediate","MessageChannel","createElement","scriptEl","onreadystatechange","parentNode","removeChild","documentElement","setTimeout","channel","port1","onmessage","port2","postMessage","2","INTERNAL","Promise","resolver","state","PENDING","outcome","safelyResolveThenable","QueueItem","promise","onFulfilled","onRejected","callFulfilled","otherCallFulfilled","callRejected","otherCallRejected","unwrap","returnValue","handlers","reject","resolve","getThen","then","thenable","onError","onSuccess","tryToUnwrap","tryCatch","status","out","reason","iterable","values","resolved","resolveFromAll","outValue","error","race","response","REJECTED","FULFILLED","3","4","_classCallCheck","instance","Constructor","createBlob","parts","properties","Blob","Builder","BlobBuilder","MSBlobBuilder","MozBlobBuilder","WebKitBlobBuilder","builder","append","getBlob","executeCallback","callback","executeTwoCallbacks","errorCallback","_binStringToArrayBuffer","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","_checkBlobSupportWithoutCaching","idb","Promise$1","txn","transaction","DETECT_BLOB_SUPPORT_STORE","blob","objectStore","put","onabort","preventDefault","stopPropagation","oncomplete","matchedChrome","navigator","userAgent","matchedEdge","parseInt","_checkBlobSupport","supportsBlobs","_deferReadiness","dbInfo","dbContext","dbContexts","deferredOperation","deferredOperations","dbReady","_advanceReadiness","_getConnection","upgradeNeeded","db","close","dbArgs","openreq","open","onupgradeneeded","createObjectStore","storeName","oldVersion","newVersion","onerror","onsuccess","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","objectStoreNames","contains","isDowngrade","isUpgrade","incVersion","_encodeBlob","reader","FileReader","onloadend","base64","btoa","target","__local_forage_encoded_blob","readAsBinaryString","_decodeBlob","encodedBlob","atob","_isEncodedBlob","_fullyReady","_initReady","_dbInfo","_initStorage","options","ignoreErrors","forages","ready","initPromises","j","forage","_defaultConfig","getItem","store","req","iterate","iterator","openCursor","iterationNumber","cursor","setItem","blobSupport","removeItem","clear","count","advanced","advance","stringToBuffer","serializedString","encoded1","encoded2","encoded3","encoded4","bufferLength","buffer","bytes","BASE_CHARS","bufferToString","base64String","substring","serialize","valueType","toString$1","marker","SERIALIZED_MARKER","TYPE_ARRAYBUFFER","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_UINT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","fileReader","onload","BLOB_TYPE_PREFIX","TYPE_BLOB","readAsArrayBuffer","deserialize","SERIALIZED_MARKER_LENGTH","parse","blobType","TYPE_SERIALIZED_MARKER_LENGTH","BLOB_TYPE_PREFIX_REGEX","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","_initStorage$1","dbInfoPromise","openDatabase","description","size","executeSql","serializer","localforageSerializer","getItem$1","results","rows","item","iterate$1","_setItem","retriesLeft","originalValue","sqlError","QUOTA_ERR","setItem$1","removeItem$1","clear$1","length$1","c","key$1","keys$1","_initStorage$2","keyPrefix","clear$2","localStorage","getItem$2","iterate$2","keyPrefixLength","key$2","keys$2","length$2","removeItem$2","setItem$2","callWhenReady","localForageInstance","libraryMethod","_args","arg","isLibraryDriver","driverName","driver","DriverType","_typeof","Symbol","indexedDB","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","asyncStorage","_driver","webSQLStorage","localStorageWrapper","CustomDrivers","INDEXEDDB","LOCALSTORAGE","WEBSQL","DefaultDriverOrder","LibraryMethods","DefaultConfig","driverSupport","isSafari","platform","hasFetch","fetch","IDBKeyRange","LocalForage","_config","_driverSet","_initDriver","_ready","_wrapLibraryMethodsWithReady","setDriver","defineDriver","driverObject","complianceError","namingError","customDriverMethods","concat","customDriverMethod","supportPromise","_support","supportResult","getDriver","getDriverPromise","getSerializer","serializerPromise","drivers","setDriverToConfig","extendSelfWithDriver","_extend","initDriver","supportedDrivers","driverPromiseLoop","currentDriverIndex","_getSupportedDrivers","oldDriverSetDone","supports","libraryMethodsAndProperties","createInstance","localforage_js","objectTypeRegexp","updateLocalstore","log","catch","debounce","wait","timeout","later","callNow","clearTimeout","getRandomIndex","problemsArr","ind","floor","random","currentIndex","getPreviousIndex","getNextIndex","getCurrentProblem","previousProblem","previousProblemButtonEl","classList","add","shuffle","problems","location","reload","nextProblem","nextProblemButtonEl","toggleShuffle","shuffleProblemsButtonEl","toggle","loadProblem","problemObj","currentProblem","problemEl","innerText","prompt","given","codeEl","testSuite","updateTests","testStatus","init","buildTests","updateTestStatus","testsDom","testSuiteEl","testStatuses","allPassed","testPassed","querySelectorAll","testStatusEl","iter","remove","testTotalEl","printAssertError","errObj","inner","assertConsoleEl","printEvalOutput","evalConsoleEl","getOutput","tested","runTests","evald","eval","testOutcome","loadApp","problemNav","keyCode","shiftKey","metaKey","ctrlKey","debouncedInputValidation","ignoreKeyCodes","addEventListener","timer","getElementById","time","answer","evenNumbers","someOddNumbers"],"mappings":"CAAA,QAAAA,GAAAC,EAAAC,EAAAC,GAAA,QAAAC,GAAAC,EAAAC,GAAA,IAAAJ,EAAAG,GAAA,CAAA,IAAAJ,EAAAI,GAAA,CAAA,GAAAE,GAAA,kBAAAC,UAAAA,OAAA,KAAAF,GAAAC,EAAA,MAAAA,GAAAF,GAAA,EAAA,IAAAI,EAAA,MAAAA,GAAAJ,GAAA,EAAA,IAAAK,GAAA,GAAAC,OAAA,uBAAAN,EAAA,IAAA,MAAAK,GAAAE,KAAA,mBAAAF,EAAA,GAAAG,GAAAX,EAAAG,IAAAS,WAAAb,GAAAI,GAAA,GAAAU,KAAAF,EAAAC,QAAA,SAAAd,GAAA,GAAAE,GAAAD,EAAAI,GAAA,GAAAL,EAAA,OAAAI,GAAAF,GAAAF,IAAAa,EAAAA,EAAAC,QAAAd,EAAAC,EAAAC,EAAAC,GAAA,MAAAD,GAAAG,GAAAS,QAAA,IAAA,GAAAL,GAAA,kBAAAD,UAAAA,QAAAH,EAAA,EAAAA,EAAAF,EAAAa,OAAAX,IAAAD,EAAAD,EAAAE,GAAA,OAAAD,KAAAa,GAAA,SAAAT,EAAAU,EAAAJ,GCeA,QAAAK,KAGA,QAAAC,GAAAC,EAAAC,GACAC,OAAAC,KAAAF,GAAAG,QAAA,SAAAC,IACAC,EAAAC,QAAAF,KAAAL,EAAAK,GAAAJ,EAAAI,MAJA,GAAAC,MAAAE,MAAAd,KAAAe,UAQA,OAAA,YAKA,IAJA,GAAAC,MAAAF,MAAAd,KAAAe,WACArB,EAAA,EACAY,KAEAZ,EAAAsB,EAAAf,OAAAP,IACAW,EAAAC,EAAAU,EAAAtB,GAGA,OAAAY,IAqBA,QAAAW,GAAAC,EAAAC,EAAAC,GACA,GAAAC,GAAAjB,EAAA,OAAA,UAAA,QAAA,cAAA,UACAkB,EAAAD,EAAAF,MAGAI,MAAAL,QAAAA,GAAA,6BACAK,KAAAC,UAAA,CAGA,KAAA,GAAAb,KAAAW,GACAC,KAAAZ,GAAAW,EAAAX,EAKA,KADAS,EAAAA,GAAAL,UAAAU,SACA7B,MAAA8B,kBACA9B,MAAA8B,kBAAAH,KAAAH,OAEA,KACA,KAAA,IAAAxB,OACA,MAAAX,GACAsC,KAAAI,MAAA1C,EAAA0C,OAlCAxB,EAAAJ,QAAAkB,EA2CAA,EAAAW,UAAApB,OAAAqB,OAAAjC,MAAAgC,WAMAX,EAAAW,UAAAE,KAAA,iBAMAb,EAAAW,UAAAG,YAAAd,EASAA,EAAAW,UAAAI,OAAA,SAAAL,GACA,GAAAN,GAAAjB,EAAA,cAAA,SAAA,SACAkB,EAAAD,GAAAS,KAAAP,KAAAO,MAAAP,KAOA,QAJA,IAAAI,GAAAJ,KAAAI,QACAL,EAAAK,MAAAJ,KAAAI,OAGAL,2BClHAnB,EAAAJ,QAAAN,EAAA,oDCMA,GAAAwC,MACAlC,EAAAI,EAAAJ,UAMAA,GAAAmC,QAAA,QAMAnC,EAAAkB,eAAAxB,EAAA,kBAMA,IAAA0C,GAAA1C,EAAA,eAYAM,GAAAqC,IAAA,SAAAC,GAMA,OALAJ,EAAApB,QAAAwB,KACAA,EAAAd,KAAAY,GACAF,EAAAK,KAAAD,IAGAd,MAOAxB,EAAAoC,KAAAA,CAMA,IAAAI,GAAA9C,EAAA,gBACAM,GAAAwC,OAAAA,CAMA,IAAAC,GAAA/C,EAAA,mBACAM,GAAAqC,IAAAI,EAMA,IAAAC,GAAAhD,EAAA,yBACAM,GAAAqC,IAAAK,EAMA,IAAAC,GAAAjD,EAAA,0BACAM,GAAAqC,IAAAM,EAMA,IAAAC,GAAAlD,EAAA,0BACAM,GAAAqC,IAAAO,EAMA,IAAAC,GAAAnD,EAAA,0BACAM,GAAAqC,IAAAQ,sNCrFA,GAAAL,GAAA9C,EAAA,WAEAU,GAAAJ,QAAA,SAAA8C,EAAAV,GAsBA,QAAAW,GAAAvC,EAAAwC,EAAApB,GACAqB,EAAAzB,KAAA,OAAAI,GAAAZ,UAAAU,QACAuB,EAAAzB,KAAA,SAAAhB,GACAyC,EAAAzB,KAAA,UAAAwB,GApBA,GAAA9B,GAAA4B,EAAA5B,eACA+B,EAAAb,EAAAa,IAMAH,GAAAC,UAAAA,EAgBAtC,OAAAyC,eAAAH,EAAA,gBACAI,IAAA,WAEA,MADAC,SAAAC,KAAA,+EACAb,EAAAc,cAEAC,IAAA,SAAAC,GACAJ,QAAAC,KAAA,+EACAb,EAAAc,aAAAE,KAIA/C,OAAAyC,eAAAH,EAAA,YACAI,IAAA,WAEA,MADAC,SAAAC,KAAA,uEACAb,EAAAf,UAEA8B,IAAA,SAAAC,GACAJ,QAAAC,KAAA,uEACAb,EAAAf,SAAA+B,KAIAT,EAAAU,YAAA,SAAA1B,EAAAO,GACAF,EAAAqB,YAAAjC,KAAAK,UAAAE,EAAAO,IAGAS,EAAAW,UAAA,SAAA3B,EAAAO,GACAF,EAAAsB,UAAAlC,KAAAK,UAAAE,EAAAO,IAGAS,EAAAY,mBAAA,SAAA5B,EAAAO,EAAAsB,GACAxB,EAAAuB,mBAAAnC,KAAAK,UAAAE,EAAAO,EAAAsB,IAGAb,EAAAc,kBAAA,SAAA9B,EAAAO,GACAF,EAAAyB,kBAAArC,KAAAK,UAAAE,EAAAO,IAGAS,EAAAe,gBAAA,SAAA/B,EAAAO,GACAF,EAAA0B,gBAAAtC,KAAAK,UAAAE,EAAAO,IAGAS,EAAAgB,yBAAA,SAAAhC,EAAAO,EAAAsB,GACAxB,EAAA2B,yBAAAvC,KAAAK,UAAAE,EAAAO,EAAAsB,IAkBAb,EAAAlB,UAAAgB,OAAA,SAAAmB,EAAAhB,EAAAiB,EAAAC,EAAAC,EAAA1C,GACA,GAAA2C,GAAAhC,EAAAiC,KAAA7C,KAAAR,UAIA,KAHA,IAAAS,IAAAA,GAAA,IACA,IAAAe,EAAAf,WAAAA,GAAA,IAEA2C,EAAA,CACA,GAAApB,GAAAZ,EAAAkC,WAAA9C,KAAAR,WACAuD,EAAAnC,EAAAoC,UAAAhD,KAAAR,UACA,MAAA,IAAAE,GAAA8B,GACAuB,OAAAA,EACAL,SAAAA,EACAzC,SAAAA,GACAe,EAAA,aAAAhB,KAAAqB,OAAAI,EAAAzB,KAAA,WAYAf,OAAAyC,eAAAH,EAAAlB,UAAA,QACAsB,IAAA,WACA,MAAAF,GAAAzB,KAAA,WAEA+B,IAAA,SAAAkB,GACAxB,EAAAzB,KAAA,SAAAiD,2CC/HArE,EAAAJ,SAeAsD,cAAA,EAeA7B,UAAA,EAsBAiD,kBAAA,4BC7CAtE,EAAAJ,QAAA,SAAA2E,EAAAC,GA2JA,QAAAC,GAAAC,EAAA9B,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,GACA8B,EAAAA,EAAAC,aACA,IAAAvE,GAAAyC,EAAAzB,KAAA,UACAwD,IAAA,IAAA,IAAA,IAAA,IAAA,KAAAlE,QAAAgE,EAAAG,OAAA,IAAA,MAAA,IAEAzD,MAAAqB,OACAiC,IAAAF,EAAAE,KAAAtE,GACA,0BAAAwE,EAAAF,EACA,8BAAAE,EAAAF,GA6BA,QAAAI,KACAjC,EAAAzB,KAAA,YAAA,GAGA,QAAA2D,GAAAV,EAAAzB,GACA4B,EAAAQ,YAAA5D,MAAA,QAAA,SAAA,WAEAwB,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,UACA0C,GAAA,CAEA,IAAA,UAAAU,EAAAE,KAAAtE,IAAA,WAAAoE,EAAAE,KAAAL,IACA,IAAA,GAAA9E,KAAAa,GACA,GAAAoE,EAAAS,IAAA7E,EAAAb,GAAA8E,GAAA,CACAP,GAAA,CACA,YAGA,IAAA,WAAAU,EAAAE,KAAAL,GAAA,CACA,IAAAxB,EAAAzB,KAAA,UAAA,CACA,IAAA,GAAA8D,KAAAb,GAAA,GAAA1B,GAAAvC,GAAA+E,SAAAD,EAAAb,EAAAa,GACA,QAEA,GAAAE,KACA,KAAA,GAAAF,KAAAb,GAAAe,EAAAF,GAAA9E,EAAA8E,EACApB,GAAAU,EAAAS,IAAAG,EAAAf,OAEAP,OAAAuB,IAAAjF,IAAAA,EAAAM,QAAA2D,EAEAjD,MAAAqB,OACAqB,EACA,+BAAAU,EAAAc,QAAAjB,GACA,mCAAAG,EAAAc,QAAAjB,IAoNA,QAAAkB,KACA,GAAAnF,GAAAyC,EAAAzB,KAAA,UACAsD,EAAArE,OAAAoB,UAAA+D,SAAA3F,KAAAO,EACAgB,MAAAqB,OACA,uBAAAiC,EACA,4CAAAA,EACA,wCA8BA,QAAAe,GAAApB,EAAAzB,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAyB,EAAAzB,KAAA,QACA,MAAAA,MAAA6D,IAAAZ,EAEAjD,MAAAqB,OACA4B,IAAAjE,EACA,mCACA,uCACAiE,EACAjD,KAAAsE,MACA,GAyBA,QAAAC,GAAAvF,EAAAwC,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,GACAxB,KAAAqB,OACA+B,EAAAS,IAAA7E,EAAAyC,EAAAzB,KAAA,WACA,0CACA,8CACAhB,EACAgB,KAAAsE,MACA,GA+BA,QAAAE,GAAA5G,EAAA4D,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAyB,EAAAzB,KAAA,YAAA,CACA,GAAAuB,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA,SACA,IAAAY,GAAA3F,EAAAN,MACAsB,MAAAqB,OACAsD,EAAA/G,EACA,gEACA,qDACAA,EACA+G,OAGA3E,MAAAqB,OACArC,EAAApB,EACA,gCAAAA,EACA,kCAAAA,GAgCA,QAAAgH,GAAAhH,EAAA4D,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAyB,EAAAzB,KAAA,YAAA,CACA,GAAAuB,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA,SACA,IAAAY,GAAA3F,EAAAN,MACAsB,MAAAqB,OACAsD,GAAA/G,EACA,mEACA,iDACAA,EACA+G,OAGA3E,MAAAqB,OACArC,GAAApB,EACA,mCAAAA,EACA,gCAAAA,GAgCA,QAAAiH,GAAAjH,EAAA4D,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAyB,EAAAzB,KAAA,YAAA,CACA,GAAAuB,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA,SACA,IAAAY,GAAA3F,EAAAN,MACAsB,MAAAqB,OACAsD,EAAA/G,EACA,gEACA,qDACAA,EACA+G,OAGA3E,MAAAqB,OACArC,EAAApB,EACA,gCAAAA,EACA,mCAAAA,GAgCA,QAAAkH,GAAAlH,EAAA4D,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAyB,EAAAzB,KAAA,YAAA,CACA,GAAAuB,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA,SACA,IAAAY,GAAA3F,EAAAN,MACAsB,MAAAqB,OACAsD,GAAA/G,EACA,kEACA,iDACAA,EACA+G,OAGA3E,MAAAqB,OACArC,GAAApB,EACA,kCAAAA,EACA,gCAAAA,GAuEA,QAAAmH,GAAAvE,EAAAgB,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAjB,GAAA6C,EAAA4B,QAAAxE,EACAR,MAAAqB,OACAI,EAAAzB,KAAA,mBAAAQ,GACA,yCAAAD,EACA,6CAAAA,GAuIA,QAAA0E,GAAA1E,EAAAiB,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACAA,MAAAqB,OACArC,EAAAkG,eAAA3E,GACA,yCAAA6C,EAAAc,QAAA3D,GACA,6CAAA6C,EAAAc,QAAA3D,IA2BA,QAAA4E,GAAA5E,EAAA6E,EAAA5D,GACA,gBAAA4D,KACA5D,EAAA4D,EACAA,EAAA,MAEA5D,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,UACAqF,EAAApG,OAAAqG,yBAAArG,OAAAD,GAAAuB,EACA8E,IAAAD,EACApF,KAAAqB,OACA+B,EAAAS,IAAAuB,EAAAC,GACA,4CAAAjC,EAAAc,QAAA3D,GAAA,wBAAA6C,EAAAc,QAAAkB,GAAA,SAAAhC,EAAAc,QAAAmB,GACA,4CAAAjC,EAAAc,QAAA3D,GAAA,4BAAA6C,EAAAc,QAAAkB,GACAA,EACAC,GACA,GAGArF,KAAAqB,OACAgE,EACA,2DAAAjC,EAAAc,QAAA3D,GACA,+DAAA6C,EAAAc,QAAA3D,IAGAkB,EAAAzB,KAAA,SAAAqF,GA6CA,QAAAE,KACA9D,EAAAzB,KAAA,YAAA,GAGA,QAAAwF,GAAA5H,EAAA4D,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAuB,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA,SACA,IAAAY,GAAA3F,EAAAN,MAEAsB,MAAAqB,OACAsD,GAAA/G,EACA,6DACA,kDACAA,EACA+G,GAqBA,QAAAc,GAAAC,EAAAlE,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACAA,MAAAqB,OACAqE,EAAAC,KAAA3G,GACA,6BAAA0G,EACA,iCAAAA,GAyEA,QAAAE,GAAA1G,GACA,GACA2G,GADA7G,EAAAyC,EAAAzB,KAAA,UAEA4C,GAAA,EACAkD,EAAA,yFAEA,QAAA1C,EAAAE,KAAApE,IACA,IAAA,QACA,GAAAM,UAAAd,OAAA,EAAA,KAAA,IAAAL,OAAAyH,EACA,MACA,KAAA,SACA,GAAAtG,UAAAd,OAAA,EAAA,KAAA,IAAAL,OAAAyH,EACA5G,GAAAD,OAAAC,KAAAA,EACA,MACA,SACAA,EAAA6G,MAAA1F,UAAAd,MAAAd,KAAAe,WAGA,IAAAN,EAAAR,OAAA,KAAA,IAAAL,OAAA,gBAEA,IAAA0E,GAAA9D,OAAAC,KAAAF,GACA0D,EAAAxD,EACAyF,EAAAzF,EAAAR,OACAsH,EAAAvE,EAAAzB,KAAA,OACAiG,EAAAxE,EAAAzB,KAAA,MAOA,IALAgG,GAAAC,IACAA,GAAA,GAIAD,EAAA,CAIApD,EAHAF,EAAAwD,OAAA,SAAA9G,GACA,OAAA2D,EAAAzD,QAAAF,KAEAV,OAAA,EAcA,GAVAuH,IACArD,EAAA1D,EAAAiH,MAAA,SAAA/G,GACA,OAAA2D,EAAAzD,QAAAF,KAEAqC,EAAAzB,KAAA,WAAAyB,EAAAzB,KAAA,cACA4C,EAAAA,GAAA1D,EAAAR,QAAAqE,EAAArE,SAKAiG,EAAA,EAAA,CACAzF,EAAAA,EAAAkH,IAAA,SAAAhH,GACA,MAAAgE,GAAAc,QAAA9E,IAEA,IAAAiH,GAAAnH,EAAAoH,KACAL,KACAJ,EAAA3G,EAAAqH,KAAA,MAAA,SAAAF,GAEAL,IACAH,EAAA3G,EAAAqH,KAAA,MAAA,QAAAF,OAGAR,GAAAzC,EAAAc,QAAAhF,EAAA,GAIA2G,IAAAlB,EAAA,EAAA,QAAA,QAAAkB,EAGAA,GAAApE,EAAAzB,KAAA,YAAA,WAAA,SAAA6F,EAGA7F,KAAAqB,OACAuB,EACA,uBAAAiD,EACA,2BAAAA,EACAnD,EAAAnD,MAAA,GAAAiH,OACAzD,EAAAyD,QACA,GA2CA,QAAAC,GAAAjG,EAAAkG,EAAAlF,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAuB,GAAAvC,EAAAwC,GAAAmF,GAAA1I,EAAA,WAEA,IAAA2I,IAAA,EACAC,EAAA,KACAtG,EAAA,KACAuG,EAAA,IAEA,KAAAtH,UAAAd,QACAgI,EAAA,KACAlG,EAAA,MACAA,IAAAA,YAAAuG,SAAA,gBAAAvG,KACAkG,EAAAlG,EACAA,EAAA,MACAA,GAAAA,YAAAnC,QACAwI,EAAArG,EACAA,EAAA,KACAkG,EAAA,MACA,kBAAAlG,MACAD,EAAAC,EAAAH,UAAAE,OACA,UAAAA,GAAAC,IAAAnC,SACAkC,EAAAC,EAAAD,OAAA,GAAAC,IAAAD,MAGAC,EAAA,IAGA,KACAxB,IACA,MAAAgI,GAEA,GAAAH,EAUA,MATA7G,MAAAqB,OACA2F,IAAAH,EACA,yDACA,uCACAA,YAAAxI,OAAAwI,EAAAzC,WAAAyC,EACAG,YAAA3I,OAAA2I,EAAA5C,WAAA4C,GAGAvF,EAAAzB,KAAA,SAAAgH,GACAhH,IAIA,IAAAQ,IACAR,KAAAqB,OACA2F,YAAAxG,GACA,yDACA,6DACAD,EACAyG,YAAA3I,OAAA2I,EAAA5C,WAAA4C,IAGAN,GAEA,MADAjF,GAAAzB,KAAA,SAAAgH,GACAhH,IAKA,IAAAL,GAAA,UAAAyD,EAAAE,KAAA0D,IAAA,WAAAA,GACAA,EAAArH,QACA,GAAAqH,CAEA,IAAA,MAAArH,GAAA+G,GAAAA,YAAAK,QAUA,MATA/G,MAAAqB,OACAqF,EAAAf,KAAAhG,GACA,iEACA,sDACA+G,EACA/G,GAGA8B,EAAAzB,KAAA,SAAAgH,GACAhH,IACA,IAAA,MAAAL,GAAA+G,GAAA,gBAAAA,GAUA,MATA1G,MAAAqB,QACA1B,EAAAL,QAAAoH,GACA,kEACA,uDACAA,EACA/G,GAGA8B,EAAAzB,KAAA,SAAAgH,GACAhH,IAEA4G,IAAA,EACAE,EAAAE,EAIA,GAAAC,GAAA,GACAC,EAAA,OAAA3G,EACAA,EACAsG,EACA,SACA,UAEAD,KACAK,EAAA,0BAGAjH,KAAAqB,QACA,IAAAuF,EACA,6BAAAM,EAAAD,EACA,iCAAAC,EAAAD,EACAJ,YAAAxI,OAAAwI,EAAAzC,WAAAyC,EACAC,YAAAzI,OAAAyI,EAAA1C,WAAA0C,GAGArF,EAAAzB,KAAA,SAAA8G,GA8BA,QAAAK,GAAAC,EAAA5F,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,UACAqH,EAAA5F,EAAAzB,KAAA,UACAsH,EAAA,aAAAlE,EAAAE,KAAAtE,IAAAqI,EAEArI,EAAAoI,GADApI,EAAAqB,UAAA+G,EAGApH,MAAAqB,OACA,kBAAAiG,GACA,kCAAAlE,EAAAc,QAAAkD,GACA,sCAAAhE,EAAAc,QAAAkD,IA2CA,QAAAG,GAAAC,EAAAhG,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,UACAyH,EAAAD,EAAAxI,EACAgB,MAAAqB,OACAoG,EACA,+BAAArE,EAAAsE,WAAAF,GACA,kCAAApE,EAAAsE,WAAAF,IACAxH,KAAA2H,OACAF,GAuBA,QAAAG,GAAAlF,EAAAmF,EAAArG,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SAGA,IADA,GAAAuB,GAAAvC,EAAAwC,GAAAmF,GAAA1I,EAAA,UACA,WAAAmF,EAAAE,KAAAZ,IAAA,WAAAU,EAAAE,KAAAuE,GACA,KAAA,IAAAxJ,OAAA,4DAGA2B,MAAAqB,OACAyG,KAAAC,IAAA/I,EAAA0D,IAAAmF,EACA,mCAAAnF,EAAA,QAAAmF,EACA,uCAAAnF,EAAA,QAAAmF,GAOA,QAAAG,GAAAhE,EAAAiE,EAAAC,GACA,MAAAlE,GAAAmC,MAAA,SAAAgC,GACA,MAAAD,GAEAD,EAAAG,KAAA,SAAAC,GACA,MAAAH,GAAAC,EAAAE,MAHA,IAAAJ,EAAA3I,QAAA6I,KAiFA,QAAAG,GAAAC,EAAA/G,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAkB,GAAAjB,EAAAzB,KAAA,SACA,IAAAuB,GAAAgH,GAAA9D,GAAA+D,GAAAnF,GAAA,SAEArD,KAAAqB,OACAkH,EAAAjJ,QAAAoD,IAAA,EACA,uCACA,2CACA6F,EACA7F,GA4BA,QAAA+F,GAAAC,EAAAC,EAAAnH,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAV,GAAAW,EAAAzB,KAAA,SACA,IAAAuB,GAAAmH,EAAAlH,GAAAiD,GAAAC,KAAAX,SAAA4E,GACA,GAAApH,GAAAT,GAAA6F,GAAA1I,EAAA,WAEA,IAAA2K,GAAAF,EAAAC,EACA7H,KAEAd,KAAAqB,OACAuH,IAAAF,EAAAC,GACA,aAAAA,EAAA,aACA,aAAAA,EAAA,kBA0BA,QAAAE,GAAAH,EAAAC,EAAAnH,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAV,GAAAW,EAAAzB,KAAA,SACA,IAAAuB,GAAAmH,EAAAlH,GAAAiD,GAAAC,KAAAX,SAAA4E,GACA,GAAApH,GAAAT,GAAA6F,GAAA1I,EAAA,WAEA,IAAA2K,GAAAF,EAAAC,EACA7H,KAEAd,KAAAqB,OACAqH,EAAAC,GAAAC,EAAA,EACA,aAAAD,EAAA,eACA,aAAAA,EAAA,oBA0BA,QAAAG,GAAAJ,EAAAC,EAAAnH,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAV,GAAAW,EAAAzB,KAAA,SACA,IAAAuB,GAAAmH,EAAAlH,GAAAiD,GAAAC,KAAAX,SAAA4E,GACA,GAAApH,GAAAT,GAAA6F,GAAA1I,EAAA,WAEA,IAAA2K,GAAAF,EAAAC,EACA7H,KAEAd,KAAAqB,OACAqH,EAAAC,GAAAC,EAAA,EACA,aAAAD,EAAA,eACA,aAAAA,EAAA,oBAvrDA,GAAApH,GAAA4B,EAAA5B,UAEAE,GADAxC,OAAAoB,UAAA+D,SACAhB,EAAA3B,OA+BA,KAAA,KAAA,OACA,KAAA,MAAA,MAAA,OACA,OAAA,OAAA,QAAA,KACA,KAAA,QAAAtC,QAAA,SAAA4J,GACAxH,EAAAU,YAAA8G,EAAA,WACA,MAAA/I,UAmBAuB,EAAAU,YAAA,MAAA,WACAR,EAAAzB,KAAA,UAAA,KAwBAuB,EAAAU,YAAA,OAAA,WACAR,EAAAzB,KAAA,QAAA,KAgBAuB,EAAAU,YAAA,MAAA,WACAR,EAAAzB,KAAA,OAAA,GACAyB,EAAAzB,KAAA,OAAA,KAiBAuB,EAAAU,YAAA,MAAA,WACAR,EAAAzB,KAAA,OAAA,GACAyB,EAAAzB,KAAA,OAAA,KA+CAuB,EAAAY,mBAAA,KAAAkB,GACA9B,EAAAY,mBAAA,IAAAkB,GA2DA9B,EAAAY,mBAAA,UAAAwB,EAAAD,GACAnC,EAAAY,mBAAA,UAAAwB,EAAAD,GACAnC,EAAAY,mBAAA,WAAAwB,EAAAD,GACAnC,EAAAY,mBAAA,WAAAwB,EAAAD,GAkBAnC,EAAAU,YAAA,KAAA,WACAjC,KAAAqB,OACAI,EAAAzB,KAAA,UACA,gCACA,kCAgBAuB,EAAAU,YAAA,OAAA,WACAjC,KAAAqB,QACA,IAAAI,EAAAzB,KAAA,UACA,8BACA,gCACAA,KAAA2H,UAiBApG,EAAAU,YAAA,QAAA,WACAjC,KAAAqB,QACA,IAAAI,EAAAzB,KAAA,UACA,+BACA,gCACAA,KAAA2H,UAiBApG,EAAAU,YAAA,OAAA,WACAjC,KAAAqB,OACA,OAAAI,EAAAzB,KAAA,UACA,8BACA,qCAiBAuB,EAAAU,YAAA,YAAA,WACAjC,KAAAqB,WACA4C,KAAAxC,EAAAzB,KAAA,UACA,mCACA,0CAgBAuB,EAAAU,YAAA,MAAA,WACAjC,KAAAqB,OACA2H,MAAAvH,EAAAzB,KAAA,WACA,6BACA,oCAsBAuB,EAAAU,YAAA,QAAA,WACAjC,KAAAqB,OACA,MAAAI,EAAAzB,KAAA,UACA,4BACA,mCAqBAuB,EAAAU,YAAA,QAAA,WACA,GAAAjD,GAAAyC,EAAAzB,KAAA,UACA0C,EAAA1D,CAEA+G,OAAAkD,QAAAjK,IAAA,gBAAA0J,QACAhG,EAAA1D,EAAAN,OACA,gBAAAM,KACA0D,EAAAzD,OAAAC,KAAAF,GAAAN,QAGAsB,KAAAqB,QACAqB,EACA,+BACA,sCA6BAnB,EAAAU,YAAA,YAAAkC,GACA5C,EAAAU,YAAA,YAAAkC,GA0CA5C,EAAAW,UAAA,QAAAmC,GACA9C,EAAAW,UAAA,SAAAmC,GACA9C,EAAAW,UAAA,KAAAmC,GA8BA9C,EAAAW,UAAA,MAAAqC,GACAhD,EAAAW,UAAA,OAAAqC,GAgDAhD,EAAAW,UAAA,QAAAsC,GACAjD,EAAAW,UAAA,KAAAsC,GACAjD,EAAAW,UAAA,cAAAsC,GA+CAjD,EAAAW,UAAA,QAAA0C,GACArD,EAAAW,UAAA,MAAA0C,GAgDArD,EAAAW,UAAA,QAAA2C,GACAtD,EAAAW,UAAA,KAAA2C,GACAtD,EAAAW,UAAA,WAAA2C,GA+CAtD,EAAAW,UAAA,OAAA4C,GACAvD,EAAAW,UAAA,MAAA4C,GAyBAvD,EAAAW,UAAA,SAAA,SAAAgH,EAAAC,EAAA3H,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,UACAoJ,EAAAF,EAAA,KAAAC,CACA,IAAA1H,EAAAzB,KAAA,YAAA,CACA,GAAAuB,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA,SACA,IAAAY,GAAA3F,EAAAN,MACAsB,MAAAqB,OACAsD,GAAAuE,GAAAvE,GAAAwE,EACA,4CAAAC,EACA,gDAAAA,OAGApJ,MAAAqB,OACArC,GAAAkK,GAAAlK,GAAAmK,EACA,iCAAAC,EACA,qCAAAA,KAkCA7H,EAAAW,UAAA,aAAA6C,GACAxD,EAAAW,UAAA,aAAA6C,GA0EAxD,EAAAW,UAAA,WAAA,SAAA3B,EAAA0C,EAAAzB,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EAEA,IAAA6H,KAAA5H,EAAAzB,KAAA,QACAoF,EAAAiE,EAAA,iBAAA,YACA1B,EAAAlG,EAAAzB,KAAA,UACAhB,EAAAyC,EAAAzB,KAAA,UACAsJ,EAAAD,EAAAjG,EAAAmG,YAAAhJ,EAAAvB,GAAA,KACAwK,EAAAH,EACAC,EAAAG,OACArG,EAAAoG,YAAAjJ,EAAAvB,GACAgD,EAAAqH,EACAC,EAAAtH,MACAhD,EAAAuB,EAEA,IAAAoH,GAAAnI,UAAAd,OAAA,GACA,OAAAuF,KAAAjC,EAEA,KADAR,GAAA,MAAAA,EAAAA,EAAA,KAAA,GACA,GAAAnD,OAAAmD,EAAA4B,EAAAc,QAAAlF,GAAA,WAAAoG,EAAAhC,EAAAc,QAAA3D,QAGAP,MAAAqB,OACAmI,EACA,8BAAApE,EAAAhC,EAAAc,QAAA3D,GACA,gCAAA6E,EAAAhC,EAAAc,QAAA3D,GAGAf,WAAAd,OAAA,GACAsB,KAAAqB,OACA4B,IAAAjB,EACA,8BAAAoD,EAAAhC,EAAAc,QAAA3D,GAAA,6BACA,kCAAA6E,EAAAhC,EAAAc,QAAA3D,GAAA,aACA0C,EACAjB,GAIAP,EAAAzB,KAAA,SAAAgC,KA6BAT,EAAAW,UAAA,cAAA+C,GACA1D,EAAAW,UAAA,kBAAA+C,GAiDA1D,EAAAW,UAAA,wBAAAiD,GACA5D,EAAAW,UAAA,4BAAAiD,GA4DA5D,EAAAY,mBAAA,SAAAqD,EAAAD,GACAhE,EAAAW,UAAA,WAAAsD,GA0BAjE,EAAAW,UAAA,QAAAuD,GACAlE,EAAAW,UAAA,UAAAuD,GAgBAlE,EAAAW,UAAA,SAAA,SAAA2D,EAAArE,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SACA,IAAAuB,GAAAvC,EAAAwC,GAAAmF,GAAA1I,EAAA,UAEA+B,KAAAqB,QACArC,EAAAM,QAAAuG,GACA,+BAAAzC,EAAAc,QAAA2B,GACA,mCAAAzC,EAAAc,QAAA2B,MA6HAtE,EAAAW,UAAA,OAAA0D,GACArE,EAAAW,UAAA,MAAA0D,GA2JArE,EAAAW,UAAA,QAAAuE,GACAlF,EAAAW,UAAA,SAAAuE,GACAlF,EAAAW,UAAA,QAAAuE,GAwCAlF,EAAAW,UAAA,YAAAiF,GACA5F,EAAAW,UAAA,aAAAiF,GAmBA5F,EAAAU,YAAA,SAAA,WACAR,EAAAzB,KAAA,UAAA,KA+BAuB,EAAAW,UAAA,UAAAqF,GACAhG,EAAAW,UAAA,YAAAqF,GAkCAhG,EAAAW,UAAA,UAAA0F,GACArG,EAAAW,UAAA,gBAAA0F,GAmCArG,EAAAW,UAAA,UAAA,SAAA8B,EAAAxC,GACAA,GAAAC,EAAAzB,KAAA,UAAAwB,EACA,IAAAxC,GAAAyC,EAAAzB,KAAA,SAEA,IAAAuB,GAAAvC,GAAAyF,GAAA+D,GAAAnF,GAAA,SACA,GAAA9B,GAAAyC,GAAAS,GAAA+D,GAAAnF,GAAA,QAEA,IAAA6E,GAAAzG,EAAAzB,KAAA,QAAAoD,EAAAS,QAAAI,EAEA,IAAAxC,EAAAzB,KAAA,YACA,MAAAA,MAAAqB,OACA2G,EAAAhE,EAAAhF,EAAAkJ,GACA,8CACA,kDACAlJ,EACAgF,EAIAhE,MAAAqB,OACA2G,EAAAhJ,EAAAgF,EAAAkE,IAAAF,EAAAhE,EAAAhF,EAAAkJ,GACA,sDACA,0DACAlJ,EACAgF,KAwCAzC,EAAAW,UAAA,QAAAoG,GAwCA/G,EAAAY,mBAAA,SAAAsG,GACAlH,EAAAY,mBAAA,UAAAsG,GAqCAlH,EAAAY,mBAAA,WAAA0G,GACAtH,EAAAY,mBAAA,YAAA0G,GAqCAtH,EAAAY,mBAAA,WAAA2G,GACAvH,EAAAY,mBAAA,YAAA2G,GAsBAvH,EAAAU,YAAA,aAAA,WACA,GAOAyH,GAPA1K,EAAAyC,EAAAzB,KAAA,SASA,KACA0J,EAAAzK,OAAAyK,aAAA1K,GACA,MAAAgI,GACA,KAAAA,YAAA2C,YACA,KAAA3C,EADA0C,IAAA,EAIA1J,KAAAqB,OACAqI,EACA,oCACA,2CAsBAnI,EAAAU,YAAA,SAAA,WACA,GAOA2H,GAPA5K,EAAAyC,EAAAzB,KAAA,SASA,KACA4J,EAAA3K,OAAA2K,SAAA5K,GACA,MAAAgI,GACA,KAAAA,YAAA2C,YACA,KAAA3C,EADA4C,IAAA,EAIA5J,KAAAqB,OACAuI,EACA,gCACA,uCAoBArI,EAAAU,YAAA,SAAA,WACA,GAOA4H,GAPA7K,EAAAyC,EAAAzB,KAAA,SASA,KACA6J,EAAA5K,OAAA4K,SAAA7K,GACA,MAAAgI,GACA,KAAAA,YAAA2C,YACA,KAAA3C,EADA6C,IAAA,EAIA7J,KAAAqB,OACAwI,EACA,gCACA,gECzzDAjL,EAAAJ,QAAA,SAAA2E,EAAAvC,GAMA,GAAAW,GAAA4B,EAAA5B,UACAE,EAAAb,EAAAa,KAqBAJ,EAAA8B,EAAA9B,OAAA,SAAAyI,EAAAC,GACA,GAAAxI,GAAA,KAAA,KAAA4B,EAAA9B,QACAA,OACAyI,EACAC,EACA,oCAkBA1I,GAAA2I,KAAA,SAAAjH,EAAAL,EAAA/C,EAAAsK,GAEA,KADAtK,GAAAA,GAAA,gBACA,GAAAwD,GAAAzD,eAAAC,GACAoD,OAAAA,EACAL,SAAAA,EACAuH,SAAAA,GACA5I,EAAA2I,OAmBA3I,EAAA6I,KAAA,SAAAjH,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAmF,GAAA/D,IAmBAvB,EAAA8I,QAAA,SAAAlH,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAmF,GAAAyD,IAAAxH,IAkBAvB,EAAAgJ,MAAA,SAAAC,EAAAC,EAAA/I,GACA,GAAAqB,GAAA,GAAAtB,GAAA+I,EAAA9I,EAAAH,EAAAgJ,MAEAxH,GAAAxB,OACAkJ,GAAA9I,EAAAoB,EAAA,UACA,mCACA,uCACA0H,EACAD,IAmBAjJ,EAAAmJ,SAAA,SAAAF,EAAAC,EAAA/I,GACA,GAAAqB,GAAA,GAAAtB,GAAA+I,EAAA9I,EAAAH,EAAAmJ,SAEA3H,GAAAxB,OACAkJ,GAAA9I,EAAAoB,EAAA,UACA,uCACA,mCACA0H,EACAD,IAmBAjJ,EAAAoJ,YAAA,SAAAH,EAAAC,EAAA/I,GACA,GAAAD,GAAA+I,EAAA9I,GAAAiD,GAAA4F,MAAAE,IAkBAlJ,EAAAqJ,eAAA,SAAAJ,EAAAC,EAAA/I,GACA,GAAAD,GAAA+I,EAAA9I,GAAAiD,GAAA2F,IAAAC,MAAAE,IAkBAlJ,EAAAsJ,UAAA,SAAAL,EAAAC,EAAA/I,GACA,GAAAD,GAAA+I,EAAA9I,GAAAiD,GAAAZ,IAAA0G,IAkBAlJ,EAAAuJ,aAAA,SAAAN,EAAAC,EAAA/I,GACA,GAAAD,GAAA+I,EAAA9I,GAAAiD,GAAA2F,IAAAvG,IAAA0G,IAkBAlJ,EAAAwJ,QAAA,SAAA5H,EAAA6H,EAAAtJ,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAuC,MAAAD,IAmBAzJ,EAAA2J,UAAA,SAAA/H,EAAAgI,EAAAzJ,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAA0C,MAAAD,IAkBA5J,EAAA8J,QAAA,SAAAlI,EAAAmI,EAAA5J,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAA6C,MAAAD,IAmBA/J,EAAAiK,SAAA,SAAArI,EAAAsI,EAAA/J,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAgD,KAAAD,IAkBAlK,EAAAoK,OAAA,SAAAxI,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAmF,GAAA,MAkBAtF,EAAAqK,UAAA,SAAAzI,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAAC,OAAA,IAkBAhJ,EAAAsK,QAAA,SAAA1I,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAmF,GAAA,OAkBAtF,EAAAuK,WAAA,SAAA3I,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAAC,OAAA,IAiBAhJ,EAAAwK,OAAA,SAAA5I,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA4F,MAAA,OAkBAhJ,EAAAyK,UAAA,SAAA7I,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAAC,MAAA,OAgBAhJ,EAAA2H,MAAA,SAAA/F,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAuD,KAeA1K,EAAA2K,SAAA,SAAA/I,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAA4I,IAAA3F,GAAA+D,GAAAuD,KAkBA1K,EAAA4K,YAAA,SAAAhJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA4F,UAAApG,KAkBA5C,EAAA6K,UAAA,SAAAjJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAAC,UAAApG,KAkBA5C,EAAA8K,WAAA,SAAAlJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAvK,EAAA,aAkBAoD,EAAA+K,cAAA,SAAAnJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAvK,EAAA,aAmBAoD,EAAAgL,SAAA,SAAApJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAvK,EAAA,WAmBAoD,EAAAiL,YAAA,SAAArJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAvK,EAAA,WAkBAoD,EAAA4H,QAAA,SAAAhG,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAnF,GAAA,UAkBAhC,EAAAkL,WAAA,SAAAtJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAnF,GAAA,UAkBAhC,EAAAmL,SAAA,SAAAvJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAvK,EAAA,WAkBAoD,EAAAoL,YAAA,SAAAxJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAvK,EAAA,WAkBAoD,EAAAqL,SAAA,SAAAzJ,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAvK,EAAA,WAkBAoD,EAAAsL,YAAA,SAAA1J,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAvK,EAAA,WAqBAoD,EAAAuL,UAAA,SAAA3J,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAvK,EAAA,YAqBAoD,EAAAwL,aAAA,SAAA5J,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAvK,EAAA,YAwBAoD,EAAAyL,OAAA,SAAA7J,EAAAK,EAAA9B,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAvK,EAAAqF,IAmBAjC,EAAA0L,UAAA,SAAA9J,EAAAK,EAAA9B,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAvK,EAAAqF,IAqBAjC,EAAA2L,WAAA,SAAA/J,EAAAK,EAAA9B,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA+D,GAAAwE,WAAA1J,IAqBAjC,EAAA4L,cAAA,SAAAhK,EAAAK,EAAA9B,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA5B,GAAAwE,WAAA1J,IAoBAjC,EAAAsC,QAAA,SAAA4G,EAAA2C,EAAA1L,GACA,GAAAD,GAAAgJ,EAAA/I,EAAAH,EAAAsC,SAAAA,QAAAuJ,IAoBA7L,EAAA8L,WAAA,SAAA5C,EAAA2C,EAAA1L,GACA,GAAAD,GAAAgJ,EAAA/I,EAAAH,EAAA8L,YAAA/C,IAAAzG,QAAAuJ,IAkBA7L,EAAA+L,MAAA,SAAA7C,EAAA7E,EAAAlE,GACA,GAAAD,GAAAgJ,EAAA/I,GAAAiD,GAAA2I,MAAA1H,IAkBArE,EAAAgM,SAAA,SAAA9C,EAAA7E,EAAAlE,GACA,GAAAD,GAAAgJ,EAAA/I,GAAAiD,GAAA2F,IAAAgD,MAAA1H,IAkBArE,EAAA0C,SAAA,SAAA/E,EAAA2J,EAAAnH,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA4E,IAkBAtH,EAAAiM,YAAA,SAAAtO,EAAA2J,EAAAnH,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA1F,KAAAX,SAAA4E,IAmBAtH,EAAAkM,aAAA,SAAAvO,EAAA2J,EAAAnH,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAA8I,KAAAzJ,SAAA4E,IAmBAtH,EAAAoM,gBAAA,SAAAzO,EAAA2J,EAAAnH,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA1F,KAAA8I,KAAAzJ,SAAA4E,IAoBAtH,EAAAqM,YAAA,SAAA1O,EAAA2J,EAAA1F,EAAAzB,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAAX,SAAA4E,EAAA1F,IAoBA5B,EAAAsM,eAAA,SAAA3O,EAAA2J,EAAA1F,EAAAzB,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA1F,KAAAX,SAAA4E,EAAA1F,IAqBA5B,EAAAuM,gBAAA,SAAA5O,EAAA2J,EAAA1F,EAAAzB,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAAC,KAAA8I,KAAAzJ,SAAA4E,EAAA1F,IAqBA5B,EAAAwM,mBAAA,SAAA7O,EAAA2J,EAAA1F,EAAAzB,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA1F,KAAA8I,KAAAzJ,SAAA4E,EAAA1F,IAmBA5B,EAAAyM,SAAA,SAAAvD,EAAA5F,EAAAnD,GACA,GAAAD,GAAAgJ,EAAA/I,GAAAiD,GAAAC,KAAAhG,OAAAiG,IA4BAtD,EAAA0M,OAAA,SAAAjN,EAAAkN,EAAAC,EAAAzM,IACA,gBAAAwM,IAAAA,YAAAjH,WACAkH,EAAAD,EACAA,EAAA,KAGA,IAAAE,GAAA,GAAA3M,GAAAT,EAAAU,GAAAiD,GAAA0J,MAAAH,EAAAC,EACA,OAAAxM,GAAAyM,EAAA,WAsBA7M,EAAA+M,aAAA,SAAAtN,EAAAwC,EAAA9B,GACA,gBAAA8B,KACA9B,EAAA8B,EACAA,EAAA,MAGA,GAAA/B,GAAAT,EAAAU,GAAAiD,GAAA2F,IAAAiE,MAAA/K,IAoBAjC,EAAA4I,SAAA,SAAAhH,EAAAgH,EAAAqE,EAAA9M,GACA,GAAAoB,EACA,QAAAqH,GACA,IAAA,KACArH,EAAAK,GAAAqL,CACA,MACA,KAAA,MACA1L,EAAAK,IAAAqL,CACA,MACA,KAAA,IACA1L,EAAAK,EAAAqL,CACA,MACA,KAAA,KACA1L,EAAAK,GAAAqL,CACA,MACA,KAAA,IACA1L,EAAAK,EAAAqL,CACA,MACA,KAAA,KACA1L,EAAAK,GAAAqL,CACA,MACA,KAAA,KACA1L,EAAAK,GAAAqL,CACA,MACA,KAAA,MACA1L,EAAAK,IAAAqL,CACA,MACA,SACA,KAAA,IAAAjQ,OAAA,qBAAA4L,EAAA,KAEA,GAAApH,GAAA,GAAAtB,GAAAqB,EAAApB,EACAqB,GAAAxB,QACA,IAAAI,EAAAoB,EAAA,UACA,YAAAjC,EAAAsD,QAAAjB,GAAA,UAAAgH,EAAA,IAAArJ,EAAAsD,QAAAoK,GACA,YAAA1N,EAAAsD,QAAAjB,GAAA,cAAAgH,EAAA,IAAArJ,EAAAsD,QAAAoK,KAmBAjN,EAAAuG,QAAA,SAAA0C,EAAAC,EAAA1C,EAAArG,GACA,GAAAD,GAAA+I,EAAA9I,GAAAiD,GAAA+D,GAAAZ,QAAA2C,EAAA1C,IAmBAxG,EAAAkN,cAAA,SAAAjE,EAAAC,EAAA1C,EAAArG,GACA,GAAAD,GAAA+I,EAAA9I,GAAAiD,GAAA+D,GAAA+F,cAAAhE,EAAA1C,IAmBAxG,EAAAmN,YAAA,SAAAC,EAAAC,EAAAlN,GACA,GAAAD,GAAAkN,EAAAjN,GAAAiD,GAAAC,KAAAiK,KAAAC,QAAAF,IAmBArN,EAAAwN,gBAAA,SAAAJ,EAAAC,EAAAlN,GACA,GAAAD,GAAAkN,EAAAjN,GAAAiD,GAAAC,KAAAiK,KAAAnB,KAAAoB,QAAAF,IAmBArN,EAAAyN,eAAA,SAAA7G,EAAAjE,EAAAxC,GACA,GAAAD,GAAA0G,EAAAzG,GAAAiD,GAAAd,QAAAiL,QAAA5K,IAoBA3C,EAAA0N,mBAAA,SAAA9G,EAAAjE,EAAAxC,GACA,GAAAD,GAAA0G,EAAAzG,GAAAiD,GAAAd,QAAA6J,KAAAoB,QAAA5K,IAkBA3C,EAAAiH,MAAA,SAAA0G,EAAAzG,EAAA/G,GACA,GAAAD,GAAAyN,EAAAxN,GAAAiD,GAAA+D,GAAAF,MAAAC,IAqBAlH,EAAA4N,QAAA,SAAAnO,EAAA9B,EAAA2J,GACA,GAAApH,GAAAT,GAAA2D,GAAAyK,OAAAlQ,EAAA2J,IAqBAtH,EAAA8N,cAAA,SAAArO,EAAA9B,EAAA2J,GACA,GAAApH,GAAAT,GAAA2D,GAAA2F,IAAA8E,OAAAlQ,EAAA2J,IAqBAtH,EAAA+N,UAAA,SAAAtO,EAAA9B,EAAA2J,GACA,GAAApH,GAAAT,GAAA2D,GAAA4K,SAAArQ,EAAA2J,IAqBAtH,EAAAiO,gBAAA,SAAAxO,EAAA9B,EAAA2J,GACA,GAAApH,GAAAT,GAAA2D,GAAA2F,IAAAiF,SAAArQ,EAAA2J,IAqBAtH,EAAAkO,UAAA,SAAAzO,EAAA9B,EAAA2J,GACA,GAAApH,GAAAT,GAAA2D,GAAA+K,SAAAxQ,EAAA2J,IAqBAtH,EAAAoO,gBAAA,SAAA3O,EAAA9B,EAAA2J,GACA,GAAApH,GAAAT,GAAA2D,GAAA2F,IAAAoF,SAAAxQ,EAAA2J,IAmBAtH,EAAAqO,QAAA,SAAAzM,GACA,GAAAA,EACA,KAAA,IAmBA5B,EAAAqI,aAAA,SAAA1K,EAAAwC,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA+D,GAAAmH,YAwBAtO,EAAAuO,gBAAA,SAAA5Q,EAAAwC,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA5B,GAAAmH,YAuBAtO,EAAAuI,SAAA,SAAA5K,EAAAwC,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA+D,GAAAqH,QAkBAxO,EAAAyO,YAAA,SAAA9Q,EAAAwC,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA5B,GAAAqH,QAoBAxO,EAAAwI,SAAA,SAAA7K,EAAAwC,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA+D,GAAAuH,QAkBA1O,EAAA2O,YAAA,SAAAhR,EAAAwC,GACA,GAAAD,GAAAvC,EAAAwC,GAAAiD,GAAA2F,IAAA5B,GAAAuH,QAOA,QAAAE,GAAA1P,EAAA2P,GAEA,MADA7O,GAAA6O,GAAA7O,EAAAd,GACA0P,GAEA,OAAA,MACA,UAAA,SACA,SAAA,SACA,SAAA,SACA,eAAA,cACA,kBAAA,iBACA,WAAA,UACA,cAAA,aACA,WAAA,UACA,cAAA,sCCrmDArR,EAAAJ,QAAA,SAAA2E,EAAAvC,GACAuC,EAAAhC,OAAA,SAAA8B,EAAAtD,GACA,MAAA,IAAAwD,GAAA5B,UAAA0B,EAAAtD,IAiBAwD,EAAAhC,OAAA6I,KAAA,SAAAjH,EAAAL,EAAA/C,EAAAsK,GAEA,KADAtK,GAAAA,GAAA,gBACA,GAAAwD,GAAAzD,eAAAC,GACAoD,OAAAA,EACAL,SAAAA,EACAuH,SAAAA,GACA9G,EAAAhC,OAAA6I,gCCzBApL,EAAAJ,QAAA,SAAA2E,EAAAvC,GAGA,QAAAuP,KAEA,QAAAC,KACA,MAAApQ,gBAAAqQ,SAAArQ,eAAAsQ,SAAAtQ,eAAAuQ,SACA,GAAAhP,GAAAvB,KAAAwQ,UAAA,KAAAJ,GAEA,GAAA7O,GAAAvB,KAAA,KAAAoQ,GAEA,QAAAK,GAAAzO,GAOA/C,OAAAyC,eAAA1B,KAAA,UACAgC,MAAAA,EACA0O,YAAA,EACAC,cAAA,EACAC,UAAA,IAIA3R,OAAAyC,eAAAzC,OAAAoB,UAAA,UACA0B,IAAA0O,EACA9O,IAAAyO,EACAO,cAAA,GAGA,IAAAvP,KA6JA,OA7IAA,GAAA4I,KAAA,SAAAjH,EAAAL,EAAA/C,EAAAsK,GAEA,KADAtK,GAAAA,GAAA,gBACA,GAAAwD,GAAAzD,eAAAC,GACAoD,OAAAA,EACAL,SAAAA,EACAuH,SAAAA,GACA7I,EAAA4I,OAkBA5I,EAAAiJ,MAAA,SAAAwG,EAAAvC,EAAA9M,GACA,GAAAD,GAAAsP,EAAArP,GAAAiD,GAAA4F,MAAAiE,IA2BAlN,EAAAiN,MAAA,SAAAvN,EAAAkN,EAAAC,EAAAzM,GACA,GAAAD,GAAAT,EAAAU,GAAAiD,GAAA4J,MAAAL,EAAAC,IAiBA7M,EAAA0P,MAAA,SAAA7N,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAAqM,OAIA1P,EAAAgJ,OAiBAhJ,EAAAgJ,IAAAC,MAAA,SAAAwG,EAAAvC,EAAA9M,GACA,GAAAD,GAAAsP,EAAArP,GAAAiD,GAAA2F,IAAAC,MAAAiE,IAuBAlN,EAAAgJ,IAAAiE,MAAA,SAAAvN,EAAAkN,EAAAC,EAAAzM,GACA,GAAAD,GAAAT,EAAAU,GAAAiD,GAAA2F,IAAAiE,MAAAL,EAAAC,IAiBA7M,EAAAgJ,IAAA0G,MAAA,SAAA7N,EAAAzB,GACA,GAAAD,GAAA0B,EAAAzB,GAAAiD,GAAA2F,IAAA0G,OAGA1P,EAAA,MAAAA,EAAA,MACAA,EAAAgJ,IAAA,MAAAhJ,EAAAgJ,IAAA,MAEAhJ,EA5LA,GAAAG,GAAA4B,EAAA5B,SA+LA4B,GAAA/B,OAAA+O,EACAhN,EAAA4N,OAAAZ,4BC7LA,GAAAa,GAAA9S,EAAA,mBACAuD,EAAAvD,EAAA,UACA8C,EAAA9C,EAAA,aAOA+S,EAAA,aAAAhS,QAKAiS,EAAA,qCAGAzS,EAAA0S,SAAA9Q,UAAA5B,KACA2S,EAAAD,SAAA9Q,UAAA+Q,KA+BAxS,GAAAJ,QAAA,SAAA6S,EAAA9Q,EAAA6G,EAAAhF,GACA,kBAAAA,KACAA,EAAA,aAGA,IAAAkP,IACAlK,OAAAA,EACAhF,iBAAAA,EAIAiP,GAAAE,YACAF,EAAAE,cAEAF,EAAAE,UAAAhR,GAAA+Q,EAEArS,OAAAyC,eAAA2P,EAAA9Q,GACAoB,IAAA,WACA2P,EAAAlP,iBAAA3D,KAAAuB,KAEA,IAAAqB,GAAA,QAAAA,KACAI,EAAAzB,KAAA,UACA,IAAAgB,EAAAc,cACAL,EAAAzB,KAAA,OAAAqB,EACA,IAAAoG,GAAA6J,EAAAlK,OAAAgK,MAAApR,KAAAR,UACA,YAAAyE,KAAAwD,EAAAzH,KAAAyH,EAIA,IAAAwJ,EAAA,CAEA,GAAA5Q,GAAAgB,EAAAmQ,UAAAvS,OAAAqB,OAAAN,KAEAK,GAAA5B,KAAAA,EACA4B,EAAA+Q,MAAAA,MAGA,CACAnS,OAAAwS,oBAAAJ,GACAlS,QAAA,SAAAuS,GACA,IAAAR,EAAArO,KAAA6O,GAAA,CACA,GAAAC,GAAA1S,OAAAqG,yBAAA+L,EAAAK,EACAzS,QAAAyC,eAAAL,EAAAqQ,EAAAC,MAMA,MADAX,GAAAhR,KAAAqB,GACAA,GAEAsP,cAAA,4ECvGA,GAAA3P,GAAA9C,EAAA,aA2BAuD,EAAAvD,EAAA,SAEAU,GAAAJ,QAAA,SAAA6S,EAAA9Q,EAAA6G,GACAiK,EAAA9Q,GAAA,WACAkB,EAAAzB,KAAA,UACA,IAAAgB,EAAAc,cACAL,EAAAzB,KAAA,OAAAqR,EAAA9Q,GACA,IAAAkH,GAAAL,EAAAgK,MAAApR,KAAAR,UACA,YAAAyE,KAAAwD,EAAAzH,KAAAyH,sDCnCA,GAAAzG,GAAA9C,EAAA,aACAuD,EAAAvD,EAAA,SA4BAU,GAAAJ,QAAA,SAAA6S,EAAA9Q,EAAAqR,GACA3S,OAAAyC,eAAA2P,EAAA9Q,GACAoB,IAAA,QAAAM,KACAR,EAAAzB,KAAA,UACA,IAAAgB,EAAAc,cACAL,EAAAzB,KAAA,OAAAiC,EAEA,IAAAwF,GAAAmK,EAAAnT,KAAAuB,KACA,YAAAiE,KAAAwD,EAAAzH,KAAAyH,GAEAkJ,cAAA,uDCzBA,GAAAjR,GAAAxB,EAAA,mBACAuD,EAAAvD,EAAA,UACAoF,EAAApF,EAAA,cAEAU,GAAAJ,QAAA,SAAAQ,EAAA6S,GACA,GAAA7S,GAAAyC,EAAAzC,EAAA,SACA6S,GAAAA,EAAAzL,IAAA,SAAAzI,GAAA,MAAAA,GAAA4F,gBACAsO,EAAArL,MAGA,IAAAX,GAAAgM,EAAAzL,IAAA,SAAAzI,EAAAmU,GACA,GAAAC,KAAA,IAAA,IAAA,IAAA,IAAA,KAAAzS,QAAA3B,EAAA8F,OAAA,IAAA,KAAA,GAEA,QADAoO,EAAAnT,OAAA,GAAAoT,IAAAD,EAAAnT,OAAA,EAAA,MAAA,IACAqT,EAAA,IAAApU,IACA4I,KAAA,KAEA,KAAAsL,EAAAzJ,KAAA,SAAA1F,GAAA,MAAAY,GAAAtE,KAAA0D,IACA,KAAA,IAAAhD,GACA,yBAAAmG,EAAA,SAAAvC,EAAAtE,GAAA,oFCbAJ,EAAAJ,QAAA,SAAAQ,EAAAI,EAAA4C,GACA,GAAAgQ,GAAAhT,EAAAiT,UAAAjT,EAAAiT,QAAAhT,OAAAqB,OAAA,MACA,IAAA,IAAAd,UAAAd,OAGA,MAAAsT,GAAA5S,EAFA4S,GAAA5S,GAAA4C,4BCXApD,EAAAJ,QAAA,SAAAQ,EAAAS,GACA,MAAAA,GAAAf,OAAA,EAAAe,EAAA,GAAAT,EAAAsF,+BCCA1F,EAAAJ,QAAA,SAAAkK,GACA,GAAAjB,KACA,KAAA,GAAAlH,KAAAmI,GACAjB,EAAA1G,KAAAR,EAEA,OAAAkH,6BCdA,GAAAhG,GAAAvD,EAAA,UACA8E,EAAA9E,EAAA,eAEAwJ,GADAxJ,EAAA,aACAA,EAAA,gBAqBAU,GAAAJ,QAAA,SAAAQ,EAAAS,GACA,GAAAkI,GAAAlG,EAAAzC,EAAA,UACAiE,EAAAxB,EAAAzC,EAAA,UACA0D,EAAAjD,EAAA,GACAsD,EAAAC,EAAAhE,EAAAS,GACA+B,EAAAmG,EAAAlI,EAAA,GAAAA,EAAA,GACAyS,EAAAzQ,EAAAzC,EAAA,UASA,OAPA,kBAAAwC,KAAAA,EAAAA,KACAA,EAAAA,GAAA,GACAA,EAAAA,EACA2Q,QAAA,aAAA,WAAA,MAAAzK,GAAAzE,KACAkP,QAAA,YAAA,WAAA,MAAAzK,GAAA3E,KACAoP,QAAA,YAAA,WAAA,MAAAzK,GAAAhF,KAEAwP,EAAAA,EAAA,KAAA1Q,EAAAA,yFCjCA5C,EAAAJ,QAAA,SAAA4T,GACA,GAAAA,EAAA7R,KAAA,MAAA6R,GAAA7R,IAEA,IAAA6M,GAAA,yBAAAzH,KAAAyM,EACA,OAAAhF,IAAAA,EAAA,GAAAA,EAAA,GAAA,6BC4CA,QAAAiF,GAAAC,GAGA,MAFAA,GAAAH,QAAA,aAAA,QACA/E,MAAA,mBACAhH,IAAA,SAAApE,GACA,GAAA0D,GAAA,cACA6M,EAAA7M,EAAAC,KAAA3D,EACA,OAAAuQ,IAAApU,EAAAqU,WAAAD,EAAA,MACAE,EAAAzQ,EAAAmQ,QAAA,eAAA,SAoBA,QAAAO,GAAAC,EAAA3T,EAAA8S,GACA,GACA/S,GADA6T,EAAA5T,CAGA8S,OAAA7N,KAAA6N,EAAAa,EAAAjU,OAAAoT,CAEA,KAAA,GAAA3T,GAAA,EAAAI,EAAAuT,EAAA3T,EAAAI,EAAAJ,IAAA,CACA,GAAA0U,GAAAF,EAAAxU,EACAyU,QACA,KAAAC,EAAAJ,EACAG,EAAAA,EAAAC,EAAAJ,OACA,KAAAI,EAAA1U,IACAyU,EAAAA,EAAAC,EAAA1U,IACAA,GAAAI,EAAA,IAAAQ,EAAA6T,IAEA7T,MAAAkF,GAGA,MAAAlF,GAvGA,GAAAyK,GAAAtL,EAAA,gBAwBAU,GAAAJ,QAAA,SAAA8T,EAAAtT,GACA,GAAA2T,GAAAN,EAAAC,GACAjM,EAAAsM,EAAAA,EAAAjU,OAAA,GAEAoU,GACAC,OAAAJ,EAAAjU,OAAA,EAAAgU,EAAAC,EAAA3T,EAAA2T,EAAAjU,OAAA,GAAAM,EACAuB,KAAA8F,EAAAoM,GAAApM,EAAAlI,EACA6D,MAAA0Q,EAAAC,EAAA3T,GAIA,OAFA8T,GAAArJ,OAAAD,EAAAsJ,EAAAvS,KAAAuS,EAAAC,QAEAD,8CClCA,GAAAvJ,GAAArL,EAAA,gBAgCAU,GAAAJ,QAAA,SAAA8T,EAAAtT,GAEA,MADAuK,GAAA+I,EAAAtT,GACAgD,kDCtBApD,EAAAJ,QAAA,SAAAkK,GAGA,QAAAzG,GAAA8B,IACA,IAAA0D,EAAAnI,QAAAyE,IACA0D,EAAA1G,KAAAgD,GAKA,IATA,GAAA0D,GAAAxI,OAAAwS,oBAAA/I,GAQAsK,EAAA/T,OAAAgU,eAAAvK,GACA,OAAAsK,GACA/T,OAAAwS,oBAAAuB,GAAA7T,QAAA8C,GACA+Q,EAAA/T,OAAAgU,eAAAD,EAGA,OAAAvL,6BC5BA,GAAAnE,GAAApF,EAAA,eAuCAgV,GACAC,OAAA7C,OACA8C,OAAA/C,OAGAzR,GAAAJ,QAAA,SAAA+B,EAAAvB,GACA,GAAAqU,GAAA/P,EAAAtE,EAGA,OAAA,SAAAqU,GAAA,cAAAA,IAKAH,EAAAG,IAAA,gBAAArU,KACAA,EAAA,GAAAkU,GAAAG,GAAArU,IAEAuB,IAAAvB,8CCpDA,GAAAR,GAAAI,EAAAJ,UAMAA,GAAAqE,KAAA3E,EAAA,UAMAM,EAAA8E,KAAApF,EAAA,eAKAM,EAAAoF,YAAA1F,EAAA,iBAMAM,EAAAsE,WAAA5E,EAAA,gBAMAM,EAAAwE,UAAA9E,EAAA,eAMAM,EAAA0F,QAAAhG,EAAA,aAMAM,EAAAkJ,WAAAxJ,EAAA,gBAMAM,EAAAiD,KAAAvD,EAAA,UAMAM,EAAAwS,cAAA9S,EAAA,mBAMAM,EAAAqF,IAAA3F,EAAA,YAMAM,EAAA8U,aAAApV,EAAA,kBAMAM,EAAA+K,YAAArL,EAAA,iBAMAM,EAAAgL,YAAAtL,EAAA,iBAMAM,EAAAwG,QAAA9G,EAAA,aAMAM,EAAAyD,YAAA/D,EAAA,iBAMAM,EAAA0D,UAAAhE,EAAA,eAMAM,EAAA6D,kBAAAnE,EAAA,uBAMAM,EAAA8D,gBAAApE,EAAA,qBAMAM,EAAA2D,mBAAAjE,EAAA,wBAMAM,EAAA+D,yBAAArE,EAAA,gbC3GA,QAAAgG,GAAAlF,EAAAuU,EAAAC,EAAAC,GAMA,MAAAC,IAJAH,WAAAA,EACAI,QACAC,QAAA,SAAA/N,GAAA,MAAAA,KAEA7G,MAAA,KAAAwU,EAAA,EAAAA,GAeA,QAAAE,GAAArC,EAAArP,EAAA6R,GAGA,GAAA7R,GAAA,kBAAAA,GAAAkC,SAEAlC,EAAAkC,UAAA1F,EAAA0F,WAEAlC,EAAAxB,aAAAwB,EAAAxB,YAAAH,YAAA2B,GAAA,CACA,GAAA8R,GAAA9R,EAAAkC,QAAA2P,EAIA,OAHA,gBAAAC,KACAA,EAAAJ,EAAArC,EAAAyC,EAAAD,IAEAC,EAIA,GAAAC,GAAAC,EAAA3C,EAAArP,EACA,IAAA+R,EACA,MAAAA,EAIA,IAAAE,EAAAjS,GAAA,CACA,GAAA,aAAAA,GACA,MAAAA,GAAAkS,SAKA,KACA,GAAAC,SAAAC,WAAA,CAEA,OADA,GAAAC,gBACAC,kBAAAtS,GAKA,GACAuS,GAAAJ,SAAAK,gBADA,+BACA,IAMA,OAJAD,GAAAE,YAAAzS,EAAA0S,WAAA,IACAC,KAAAJ,EAAAK,UACAzC,QAAA,KAAA,IAAAnQ,EAAA4S,UAAA,KACAL,EAAAK,UAAA,GACAD,KAEA,MAAA3N,KASA,GAAA6N,GAAAC,EAAA9S,GACA9C,EAAAmS,EAAAkC,WAAAwB,EAAA/S,GAAA6S,CAKA,IAAA,IAAA3V,EAAAR,QAAAsW,EAAAhT,KACA,IAAA9C,EAAAR,QAAA,UAAAQ,EAAA,IACA,IAAAA,EAAAR,QAAA,gBAAAQ,EAAA,IAAA,UAAAA,EAAA,IACA,CACA,GAAA,kBAAA8C,GAAA,CACA,GAAAzB,GAAAyE,EAAAhD,GACAiT,EAAA1U,EAAA,KAAAA,EAAA,EACA,OAAA8Q,GAAAuC,QAAA,YAAAqB,EAAA,IAAA,WAEA,GAAAC,EAAAlT,GACA,MAAAqP,GAAAuC,QAAA7M,OAAA1G,UAAA+D,SAAA3F,KAAAuD,GAAA,SAEA,IAAAmT,EAAAnT,GACA,MAAAqP,GAAAuC,QAAAwB,KAAA/U,UAAAgV,YAAA5W,KAAAuD,GAAA,OAEA,IAAAgT,EAAAhT,GACA,MAAAsT,GAAAtT,GAIA,GAAAuT,GAAA,GAAAC,GAAA,EAAAC,GAAA,IAAA,IASA,IANAxM,EAAAjH,KACAwT,GAAA,EACAC,GAAA,IAAA,MAIA,kBAAAzT,GAAA,CACA,GAAAzB,GAAAyE,EAAAhD,GACAiT,EAAA1U,EAAA,KAAAA,EAAA,EACAgV,GAAA,aAAAN,EAAA,IAcA,GAVAC,EAAAlT,KACAuT,EAAA,IAAAxO,OAAA1G,UAAA+D,SAAA3F,KAAAuD,IAIAmT,EAAAnT,KACAuT,EAAA,IAAAH,KAAA/U,UAAAgV,YAAA5W,KAAAuD,IAIAgT,EAAAhT,GACA,MAAAsT,GAAAtT,EAGA,IAAA,IAAA9C,EAAAR,UAAA8W,GAAA,GAAAxT,EAAAtD,QACA,MAAA+W,GAAA,GAAAF,EAAAE,EAAA,EAGA,IAAA5B,EAAA,EACA,MAAAqB,GAAAlT,GACAqP,EAAAuC,QAAA7M,OAAA1G,UAAA+D,SAAA3F,KAAAuD,GAAA,UAEAqP,EAAAuC,QAAA,WAAA,UAIAvC,GAAAsC,KAAA5S,KAAAiB,EAEA,IAAA0T,EAWA,OATAA,GADAF,EACAG,EAAAtE,EAAArP,EAAA6R,EAAAgB,EAAA3V,GAEAA,EAAAkH,IAAA,SAAAhH,GACA,MAAAwW,GAAAvE,EAAArP,EAAA6R,EAAAgB,EAAAzV,EAAAoW,KAIAnE,EAAAsC,KAAArN,MAEAuP,EAAAH,EAAAH,EAAAE,GAIA,QAAAzB,GAAA3C,EAAArP,GACA,aAAAA,IACA,IAAA,YACA,MAAAqP,GAAAuC,QAAA,YAAA,YAEA,KAAA,SACA,GAAAkC,GAAA,IAAAC,KAAAC,UAAAhU,GAAAmQ,QAAA,SAAA,IACAA,QAAA,KAAA,OACAA,QAAA,OAAA,KAAA,GACA,OAAAd,GAAAuC,QAAAkC,EAAA,SAEA,KAAA,SACA,MAAA,KAAA9T,GAAA,EAAAA,IAAAiU,EAAAA,EACA5E,EAAAuC,QAAA,KAAA,UAEAvC,EAAAuC,QAAA,GAAA5R,EAAA,SAEA,KAAA,UACA,MAAAqP,GAAAuC,QAAA,GAAA5R,EAAA,WAGA,GAAA,OAAAA,EACA,MAAAqP,GAAAuC,QAAA,OAAA,QAKA,QAAA0B,GAAAtT,GACA,MAAA,IAAA3D,MAAAgC,UAAA+D,SAAA3F,KAAAuD,GAAA,IAIA,QAAA2T,GAAAtE,EAAArP,EAAA6R,EAAAgB,EAAA3V,GAEA,IAAA,GADAwW,MACAvX,EAAA,EAAAI,EAAAyD,EAAAtD,OAAAP,EAAAI,IAAAJ,EACAc,OAAAoB,UAAA6E,eAAAzG,KAAAuD,EAAAqO,OAAAlS,IACAuX,EAAA3U,KAAA6U,EAAAvE,EAAArP,EAAA6R,EAAAgB,EACAxE,OAAAlS,IAAA,IAEAuX,EAAA3U,KAAA,GASA,OANA7B,GAAAC,QAAA,SAAAC,GACAA,EAAAgO,MAAA,UACAsI,EAAA3U,KAAA6U,EAAAvE,EAAArP,EAAA6R,EAAAgB,EACAzV,GAAA,MAGAsW,EAIA,QAAAE,GAAAvE,EAAArP,EAAA6R,EAAAgB,EAAAzV,EAAAoW,GACA,GAAAjV,GAAAsF,CAuCA,IAtCA7D,EAAAkU,mBACAlU,EAAAkU,iBAAA9W,GAEAyG,EADA7D,EAAAmU,iBAAA/W,GACAiS,EAAAuC,QAAA,kBAAA,WAEAvC,EAAAuC,QAAA,WAAA,WAGA5R,EAAAmU,iBAAA/W,KACAyG,EAAAwL,EAAAuC,QAAA,WAAA,aAIAiB,EAAAvV,QAAAF,GAAA,IACAmB,EAAA,IAAAnB,EAAA,KAEAyG,IACAwL,EAAAsC,KAAArU,QAAA0C,EAAA5C,IAAA,GAEAyG,EADA,OAAAgO,EACAH,EAAArC,EAAArP,EAAA5C,GAAA,MAEAsU,EAAArC,EAAArP,EAAA5C,GAAAyU,EAAA;oEAEAhO,EAAAvG,QAAA,OAAA,IAEAuG,EADA2P,EACA3P,EAAAuQ,MAAA,MAAAhQ,IAAA,SAAAiQ,GACA,MAAA,KAAAA,IACA9P,KAAA,MAAA+P,OAAA,GAEA,KAAAzQ,EAAAuQ,MAAA,MAAAhQ,IAAA,SAAAiQ,GACA,MAAA,MAAAA,IACA9P,KAAA,QAIAV,EAAAwL,EAAAuC,QAAA,aAAA,gBAGA,KAAArT,EAAA,CACA,GAAAiV,GAAApW,EAAAgO,MAAA,SACA,MAAAvH,EAEAtF,GAAAwV,KAAAC,UAAA,GAAA5W,GACAmB,EAAA6M,MAAA,iCACA7M,EAAAA,EAAA+V,OAAA,EAAA/V,EAAA7B,OAAA,GACA6B,EAAA8Q,EAAAuC,QAAArT,EAAA,UAEAA,EAAAA,EAAA4R,QAAA,KAAA,OACAA,QAAA,OAAA,KACAA,QAAA,WAAA,KACA5R,EAAA8Q,EAAAuC,QAAArT,EAAA,WAIA,MAAAA,GAAA,KAAAsF,EAIA,QAAAgQ,GAAAH,EAAAH,EAAAE,GACA,GAAAc,GAAA,CAOA,OANAb,GAAAc,OAAA,SAAAC,EAAAC,GAGA,MAFAH,KACAG,EAAApX,QAAA,OAAA,GAAAiX,IACAE,EAAAC,EAAAhY,OAAA,GACA,GAEA,GACA+W,EAAA,IACA,KAAAF,EAAA,GAAAA,EAAA,OACA,IACAG,EAAAnP,KAAA,SACA,IACAkP,EAAA,GAGAA,EAAA,GAAAF,EAAA,IAAAG,EAAAnP,KAAA,MAAA,IAAAkP,EAAA,GAGA,QAAAxM,GAAA0N,GACA,MAAA5Q,OAAAkD,QAAA0N,IACA,gBAAAA,IAAA,mBAAAC,EAAAD,GAGA,QAAAzB,GAAAxP,GACA,MAAA,gBAAAA,IAAA,oBAAAkR,EAAAlR,GAGA,QAAAyP,GAAA0B,GACA,MAAA,gBAAAA,IAAA,kBAAAD,EAAAC,GAGA,QAAA7B,GAAAtX,GACA,MAAA,gBAAAA,IAAA,mBAAAkZ,EAAAlZ,GAGA,QAAAkZ,GAAA7Y,GACA,MAAAkB,QAAAoB,UAAA+D,SAAA3F,KAAAV,GA1UA,GAAAiH,GAAA9G,EAAA,aACA6W,EAAA7W,EAAA,mBACA4W,EAAA5W,EAAA,4BAEAU,GAAAJ,QAAA0F,CAyBA,IAAA+P,GAAA,SAAAvL,GACA,MAAA,gBAAAoO,aACApO,YAAAoO,aAEApO,GACA,gBAAAA,IACA,IAAAA,EAAAqO,UACA,gBAAArO,GAAAsO,qGC7BA,GAAA9S,GAAAhG,EAAA,aACA8C,EAAA9C,EAAA,YAeAU,GAAAJ,QAAA,SAAAQ,GACA,GAAA6G,GAAA3B,EAAAlF,GACAsE,EAAArE,OAAAoB,UAAA+D,SAAA3F,KAAAO,EAEA,IAAAgC,EAAAkC,mBAAA2C,EAAAnH,QAAAsC,EAAAkC,kBAAA,CACA,GAAA,sBAAAI,EACA,MAAAtE,GAAAuB,MAAA,KAAAvB,EAAAuB,KAEA,cAAAvB,EAAAuB,KAAA,IADA,YAEA,IAAA,mBAAA+C,EACA,MAAA,WAAAtE,EAAAN,OAAA,KACA,IAAA,oBAAA4E,EAAA,CACA,GAAApE,GAAAD,OAAAC,KAAAF,EAIA,OAAA,cAHAE,EAAAR,OAAA,EACAQ,EAAA+X,OAAA,EAAA,GAAA1Q,KAAA,MAAA,QACArH,EAAAqH,KAAA,OACA,MAEA,MAAAV,GAGA,MAAAA,yDCRAjH,EAAAJ,QAAA,SAAA6S,EAAA9Q,EAAA6G,EAAAhF,GACA,GAAAkP,GAAAD,EAAAE,UAAAhR,GAEA2W,EAAA5F,EAAAlP,gBACAkP,GAAAlP,iBAAA,WACA,GAAAqF,GAAArF,EAAA8U,GAAAzY,KAAAuB,KACA,YAAAiE,KAAAwD,EAAAzH,KAAAyH,EAGA,IAAA0P,GAAA7F,EAAAlK,MACAkK,GAAAlK,OAAA,WACA,GAAAK,GAAAL,EAAA+P,GAAA/F,MAAApR,KAAAR,UACA,YAAAyE,KAAAwD,EAAAzH,KAAAyH,6BCXA7I,EAAAJ,QAAA,SAAA6S,EAAA9Q,EAAA6G,GACA,GAAA+P,GAAA9F,EAAA9Q,GACA6W,EAAA,WAAA,MAAApX,MAEAmX,IAAA,kBAAAA,KACAC,EAAAD,GAEA9F,EAAA9Q,GAAA,WACA,GAAAkH,GAAAL,EAAAgQ,GAAAhG,MAAApR,KAAAR,UACA,YAAAyE,KAAAwD,EAAAzH,KAAAyH,6BCTA7I,EAAAJ,QAAA,SAAA6S,EAAA9Q,EAAAqR,GACA,GAAAyF,GAAApY,OAAAqG,yBAAA+L,EAAA9Q,GACA6W,EAAA,YAEAC,IAAA,kBAAAA,GAAA1V,MACAyV,EAAAC,EAAA1V,KAEA1C,OAAAyC,eAAA2P,EAAA9Q,GACAoB,IAAA,WACA,GAAA8F,GAAAmK,EAAAwF,GAAA3Y,KAAAuB,KACA,YAAAiE,KAAAwD,EAAAzH,KAAAyH,GAEAkJ,cAAA,8BC1CA,GAAAlP,GAAAvD,EAAA,SAaAU,GAAAJ,QAAA,SAAAQ,EAAAS,GACA,GAAAkI,GAAAlG,EAAAzC,EAAA,UACAwD,EAAA/C,EAAA,EACA,OAAAkI,IAAAnF,EAAAA,uCCGA5D,EAAAJ,QAAA,SAAAyC,EAAAyH,EAAA4O,GACA,GAAAtF,GAAA/Q,EAAAgR,UAAAhR,EAAAgR,QAAAhT,OAAAqB,OAAA,MAEAoI,GAAAuJ,UACAvJ,EAAAuJ,QAAAhT,OAAAqB,OAAA,OAGAgX,EAAA,IAAA9X,UAAAd,QAAA4Y,CAEA,KAAA,GAAA7V,KAAAuQ,IACAsF,GACA,WAAA7V,GAAA,SAAAA,GAAA,WAAAA,KACAiH,EAAAuJ,QAAAxQ,GAAAuQ,EAAAvQ,8BCzCA7C,EAAAJ,QAAAN,EAAA,oDCuCA,QAAAyM,GAAA1M,EAAAsZ,EAAAC,GACA,QAAAC,EAAAxZ,EAAAsZ,KAEA,SAAAjU,EAAArF,GACAyZ,EAAAzZ,EAAAsZ,GACA,WAAAjU,EAAArF,GACA0Z,EAAA1Z,EAAAsZ,GACAK,EAAAC,SAAA5Z,GACA6Z,EAAA7Z,EAAAsZ,GACA,cAAAjU,EAAArF,GACA8Z,EAAA9Z,EAAAsZ,EAAAC,KACAQ,EAAA/Z,EAAAsZ,KAEA,WAAAjU,EAAArF,IAAA,WAAAqF,EAAAiU,IACA,UAAAjU,EAAArF,IAAA,UAAAqF,EAAAiU,GACAE,EAAAxZ,EAAAsZ,GAEAU,EAAAha,EAAAsZ,EAAAC,KAaA,QAAAC,GAAAxZ,EAAAsZ,GACA,MAAAtZ,KAAAsZ,EAAA,IAAAtZ,GAAA,EAAAA,GAAA,EAAAsZ,EACAtZ,IAAAA,GAAAsZ,IAAAA,EAcA,QAAAS,GAAA/Z,EAAAsZ,GACA,MAAAjU,GAAArF,KAAAqF,EAAAiU,GAYA,QAAAG,GAAAzZ,EAAAsZ,GACA,MAAA,SAAAjU,EAAAiU,IACAE,EAAAxZ,EAAAia,UAAAX,EAAAW,WAYA,QAAAP,GAAA1Z,EAAAsZ,GACA,MAAA,WAAAjU,EAAAiU,IACAE,EAAAxZ,EAAAmG,WAAAmT,EAAAnT,YAcA,QAAA2T,GAAA9Z,EAAAsZ,EAAAC,GACA,MAAA,cAAAlU,EAAAiU,KACAtZ,KAAAsB,MAAAd,KAAAR,GACAsZ,KAAAhY,MAAAd,KAAA8Y,GACA5M,EAAA1M,EAAAsZ,EAAAC,IAUA,QAAA9G,GAAAzS,GACA,GAAAc,KACA,KAAA,GAAAK,KAAAnB,GAAAc,EAAAgC,KAAA3B,EACA,OAAAL,GAYA,QAAAoZ,GAAAla,EAAAsZ,GACA,GAAAtZ,EAAAS,SAAA6Y,EAAA7Y,OAAA,OAAA,CAKA,KAHA,GAAAP,GAAA,EACAiP,GAAA,EAEAjP,EAAAF,EAAAS,OAAAP,IACA,GAAAF,EAAAE,KAAAoZ,EAAApZ,GAAA,CACAiP,GAAA,CACA,OAIA,MAAAA,GAYA,QAAA0K,GAAA7Z,EAAAsZ,GACA,QAAAK,EAAAC,SAAAN,IACAY,EAAAla,EAAAsZ,GAWA,QAAAa,GAAAna,GACA,MAAA,QAAAA,OAAAgG,KAAAhG,EAcA,QAAAga,GAAAha,EAAAsZ,EAAAC,GACA,IAAAY,EAAAna,KAAAma,EAAAb,GACA,OAAA,CAGA,IAAAtZ,EAAAoC,YAAAkX,EAAAlX,UACA,OAAA,CAGA,IAAAlC,EACA,IAAAqZ,GACA,IAAArZ,EAAA,EAAAA,EAAAqZ,EAAA9Y,OAAAP,IACA,GAAAqZ,EAAArZ,GAAA,KAAAF,GAAAuZ,EAAArZ,GAAA,KAAAoZ,GACAC,EAAArZ,GAAA,KAAAoZ,GAAAC,EAAArZ,GAAA,KAAAF,EACA,OAAA,MAIAuZ,KAGA,KACA,GAAAa,GAAA3H,EAAAzS,GACAqa,EAAA5H,EAAA6G,GACA,MAAAgB,GACA,OAAA,EAMA,GAHAF,EAAA7R,OACA8R,EAAA9R,QAEA2R,EAAAE,EAAAC,GACA,OAAA,CAGAd,GAAAzW,MAAA9C,EAAAsZ,GAEA,IAAAnY,EACA,KAAAjB,EAAAka,EAAA3Z,OAAA,EAAAP,GAAA,EAAAA,IAEA,GADAiB,EAAAiZ,EAAAla,IACAwM,EAAA1M,EAAAmB,GAAAmY,EAAAnY,GAAAoY,GACA,OAAA,CAIA,QAAA,EArPA,GAMAI,GANAtU,EAAApF,EAAA,cAOA,KAAA0Z,EAAA1Z,EAAA,UAAA0Z,OACA,MAAAW,GACAX,KACAA,EAAAC,SAAA,WAAA,OAAA,GAOAjZ,EAAAJ,QAAAmM,yDC3BA/L,EAAAJ,QAAAN,EAAA,sDCoCA,QAAAsa,GAAAxZ,GACA,GAAA6G,GAAA5G,OAAAoB,UAAA+D,SAAA3F,KAAAO,EACA,OAAAyZ,GAAA5S,GAAA4S,EAAA5S,GACA,OAAA7G,EAAA,WACAiF,KAAAjF,EAAA,YACAA,IAAAC,OAAAD,GAAA,eACAA,GAgBA,QAAA0Z,KACA1Y,KAAA2Y,SAjDA,GAAAna,GAAAI,EAAAJ,QAAAga,EAMAC,GACAG,iBAAA,QACAC,kBAAA,SACAC,oBAAA,WACAC,qBAAA,YACAC,gBAAA,OAwBAxa,GAAAka,QAAAA,EAgCAA,EAAArY,UAAA4Y,GAAAT,EA6BAE,EAAArY,UAAA6Y,OAAA,SAAA5V,EAAAT,GACA,MAAA,KAAArD,UAAAd,OAAAsB,KAAA2Y,MAAArV,IACAtD,KAAA2Y,MAAArV,GAAAT,EACA7C,OAqBA0Y,EAAArY,UAAAwC,KAAA,SAAA7D,EAAAsE,GACA,GAAAA,IAAAkV,EAAAxZ,GAAA,OAAA,CACA,IAAA6D,GAAA7C,KAAA2Y,MAAArV,EAEA,IAAAT,GAAA,WAAA2V,EAAA3V,GACA,MAAAA,GAAAA,KAAA7D,EACA,IAAA6D,GAAA,aAAA2V,EAAA3V,GACA,MAAAA,GAAA7D,EAEA,MAAA,IAAAma,gBAAA,cAAA7V,EAAA,qECrIA,SAAAlF,GAAA,GAAA,gBAAAI,QAAA,KAAAI,EAAAA,EAAAJ,QAAAJ,QAAA,IAAA,kBAAA8a,SAAAA,OAAAE,IAAAF,UAAA9a,OAAA,CAAA,GAAAib,EAAAA,GAAA,mBAAAC,QAAAA,WAAA,KAAAC,EAAAA,EAAA,mBAAAC,MAAAA,KAAAxZ,KAAAqZ,EAAAI,YAAArb,MAAA,WAAA,MAAA,SAAAV,GAAAC,EAAAC,EAAAC,GAAA,QAAAC,GAAAC,EAAAC,GAAA,IAAAJ,EAAAG,GAAA,CAAA,IAAAJ,EAAAI,GAAA,CAAA,GAAAE,GAAA,kBAAAC,IAAAA,CAAA,KAAAF,GAAAC,EAAA,MAAAA,GAAAF,GAAA,EAAA,IAAAI,EAAA,MAAAA,GAAAJ,GAAA,EAAA,IAAAK,GAAA,GAAAC,OAAA,uBAAAN,EAAA,IAAA,MAAAK,GAAAE,KAAA,mBAAAF,EAAA,GAAAG,GAAAX,EAAAG,IAAAS,WAAAb,GAAAI,GAAA,GAAAU,KAAAF,EAAAC,QAAA,SAAAd,GAAA,GAAAE,GAAAD,EAAAI,GAAA,GAAAL,EAAA,OAAAI,GAAAF,GAAAF,IAAAa,EAAAA,EAAAC,QAAAd,EAAAC,EAAAC,EAAAC,GAAA,MAAAD,GAAAG,GAAAS,QAAA,IAAA,GAAAL,GAAA,kBAAAD,IAAAA,EAAAH,EAAA,EAAAA,EAAAF,EAAAa,OAAAX,IAAAD,EAAAD,EAAAE,GAAA,OAAAD,KAAAa,GAAA,SAAA+a,EAAA9a,EAAAJ,IACA,SAAA+a,GACA,YA+CA,SAAAI,KACAC,GAAA,CAGA,KAFA,GAAAzb,GAAA0b,EACAlV,EAAAmV,EAAApb,OACAiG,GAAA,CAIA,IAHAkV,EAAAC,EACAA,KACA3b,GAAA,IACAA,EAAAwG,GACAkV,EAAA1b,IAEAwG,GAAAmV,EAAApb,OAEAkb,GAAA,EAIA,QAAAG,GAAAC,GACA,IAAAF,EAAA/Y,KAAAiZ,IAAAJ,GACAK,IAjEA,GAEAA,GAFAC,EAAAX,EAAAY,kBAAAZ,EAAAa,sBAKA,IAAAF,EAAA,CACA,GAAAG,GAAA,EACAC,EAAA,GAAAJ,GAAAP,GACAY,EAAAhB,EAAApF,SAAAqG,eAAA,GACAF,GAAAG,QAAAF,GACAG,eAAA,IAEAT,EAAA,WACAM,EAAAI,KAAAN,IAAAA,EAAA,OAEA,IAAAd,EAAAqB,kBAAA,KAAArB,EAAAsB,eAOAZ,EADA,YAAAV,IAAA,sBAAAA,GAAApF,SAAA2G,cAAA,UACA,WAIA,GAAAC,GAAAxB,EAAApF,SAAA2G,cAAA,SACAC,GAAAC,mBAAA,WACArB,IAEAoB,EAAAC,mBAAA,KACAD,EAAAE,WAAAC,YAAAH,GACAA,EAAA,MAEAxB,EAAApF,SAAAgH,gBAAA1G,YAAAsG,IAGA,WACAK,WAAAzB,EAAA,QAvBA,CACA,GAAA0B,GAAA,GAAA9B,GAAAsB,cACAQ,GAAAC,MAAAC,UAAA5B,EACAM,EAAA,WACAoB,EAAAG,MAAAC,YAAA,IAwBA,GAAA7B,GACAE,IAkBAlb,GAAAJ,QAAAub,IAOAtb,KAAAuB,SAAA,KAAAuZ,EAAAA,EAAA,mBAAAC,MAAAA,KAAA,mBAAAF,QAAAA,gBACAoC,GAAA,SAAAhC,EAAA9a,EAAAJ,GACA,YAIA,SAAAmd,MAUA,QAAAC,GAAAC,GACA,GAAA,kBAAAA,GACA,KAAA,IAAAlS,WAAA,8BAEA3J,MAAA8b,MAAAC,EACA/b,KAAA8Z,SACA9Z,KAAAgc,YAAA,GACAH,IAAAF,GACAM,EAAAjc,KAAA6b,GAsBA,QAAAK,GAAAC,EAAAC,EAAAC,GACArc,KAAAmc,QAAAA,EACA,kBAAAC,KACApc,KAAAoc,YAAAA,EACApc,KAAAsc,cAAAtc,KAAAuc,oBAEA,kBAAAF,KACArc,KAAAqc,WAAAA,EACArc,KAAAwc,aAAAxc,KAAAyc,mBAgBA,QAAAC,GAAAP,EAAA/J,EAAApQ,GACA+X,EAAA,WACA,GAAA4C,EACA,KACAA,EAAAvK,EAAApQ,GACA,MAAAtE,GACA,MAAAkf,GAAAC,OAAAV,EAAAze,GAEAif,IAAAR,EACAS,EAAAC,OAAAV,EAAA,GAAAxS,WAAA,uCAEAiT,EAAAE,QAAAX,EAAAQ,KAoCA,QAAAI,GAAA/d,GAEA,GAAAge,GAAAhe,GAAAA,EAAAge,IACA,IAAAhe,GAAA,gBAAAA,IAAA,kBAAAge,GACA,MAAA,YACAA,EAAA5L,MAAApS,EAAAQ,YAKA,QAAAyc,GAAAzC,EAAAyD,GAGA,QAAAC,GAAAlb,GACAqY,IAGAA,GAAA,EACAuC,EAAAC,OAAArD,EAAAxX,IAGA,QAAAmb,GAAAnb,GACAqY,IAGAA,GAAA,EACAuC,EAAAE,QAAAtD,EAAAxX,IAGA,QAAAob,KACAH,EAAAE,EAAAD,GAlBA,GAAA7C,IAAA,EAqBA5S,EAAA4V,EAAAD,EACA,WAAA3V,EAAA6V,QACAJ,EAAAzV,EAAAzF,OAIA,QAAAqb,GAAAjL,EAAApQ,GACA,GAAAub,KACA,KACAA,EAAAvb,MAAAoQ,EAAApQ,GACAub,EAAAD,OAAA,UACA,MAAA5f,GACA6f,EAAAD,OAAA,QACAC,EAAAvb,MAAAtE,EAEA,MAAA6f,GAIA,QAAAT,GAAA9a,GACA,MAAAA,aAAAhC,MACAgC,EAEA4a,EAAAE,QAAA,GAAA9c,MAAA2b,GAAA3Z,GAIA,QAAA6a,GAAAW,GACA,GAAArB,GAAA,GAAAnc,MAAA2b,EACA,OAAAiB,GAAAC,OAAAV,EAAAqB,GAIA,QAAAvX,GAAAwX,GACA,GAAAjE,GAAAxZ,IACA,IAAA,mBAAAf,OAAAoB,UAAA+D,SAAA3F,KAAAgf,GACA,MAAAzd,MAAA6c,OAAA,GAAAlT,WAAA,oBAGA,IAAAhF,GAAA8Y,EAAA/e,OACA2b,GAAA,CACA,KAAA1V,EACA,MAAA3E,MAAA8c,WAQA,KALA,GAAAY,GAAA,GAAA3X,OAAApB,GACAgZ,EAAA,EACAxf,GAAA,EACAge,EAAA,GAAAnc,MAAA2b,KAEAxd,EAAAwG,IAIA,SAAA3C,EAAA7D,GAOA,QAAAyf,GAAAC,GACAH,EAAAvf,GAAA0f,IACAF,IAAAhZ,GAAA0V,IACAA,GAAA,EACAuC,EAAAE,QAAAX,EAAAuB,IAVAlE,EAAAsD,QAAA9a,GAAAgb,KAAAY,EAAA,SAAAE,GACAzD,IACAA,GAAA,EACAuC,EAAAC,OAAAV,EAAA2B,OAPAL,EAAAtf,GAAAA,EAEA,OAAAge,GAmBA,QAAA4B,GAAAN,GACA,GAAAjE,GAAAxZ,IACA,IAAA,mBAAAf,OAAAoB,UAAA+D,SAAA3F,KAAAgf,GACA,MAAAzd,MAAA6c,OAAA,GAAAlT,WAAA,oBAGA,IAAAhF,GAAA8Y,EAAA/e,OACA2b,GAAA,CACA,KAAA1V,EACA,MAAA3E,MAAA8c,WAMA,KAHA,GAAA3e,IAAA,EACAge,EAAA,GAAAnc,MAAA2b,KAEAxd,EAAAwG,IAIA,SAAA3C,GACAwX,EAAAsD,QAAA9a,GAAAgb,KAAA,SAAAgB,GACA3D,IACAA,GAAA,EACAuC,EAAAE,QAAAX,EAAA6B,KAEA,SAAAF,GACAzD,IACAA,GAAA,EACAuC,EAAAC,OAAAV,EAAA2B,OAZAL,EAAAtf,GAEA,OAAAge,GA7OA,GAAApC,GAAAL,EAAA,GAKAkD,KAEAqB,GAAA,YACAC,GAAA,aACAnC,GAAA,UAEAnd,GAAAJ,QAAAA,EAAAod,EAcAA,EAAAvb,UAAA,MAAA,SAAAgc,GACA,MAAArc,MAAAgd,KAAA,KAAAX,IAEAT,EAAAvb,UAAA2c,KAAA,SAAAZ,EAAAC,GACA,GAAA,kBAAAD,IAAApc,KAAA8b,QAAAoC,GACA,kBAAA7B,IAAArc,KAAA8b,QAAAmC,EACA,MAAAje,KAEA,IAAAmc,GAAA,GAAAnc,MAAAQ,YAAAmb,EACA,IAAA3b,KAAA8b,QAAAC,EAAA,CAEAW,EAAAP,EADAnc,KAAA8b,QAAAoC,EAAA9B,EAAAC,EACArc,KAAAgc,aAEAhc,MAAA8Z,MAAA/Y,KAAA,GAAAmb,GAAAC,EAAAC,EAAAC,GAGA,OAAAF,IAaAD,EAAA7b,UAAAic,cAAA,SAAAta,GACA4a,EAAAE,QAAA9c,KAAAmc,QAAAna,IAEAka,EAAA7b,UAAAkc,mBAAA,SAAAva,GACA0a,EAAA1c,KAAAmc,QAAAnc,KAAAoc,YAAApa,IAEAka,EAAA7b,UAAAmc,aAAA,SAAAxa,GACA4a,EAAAC,OAAA7c,KAAAmc,QAAAna,IAEAka,EAAA7b,UAAAoc,kBAAA,SAAAza,GACA0a,EAAA1c,KAAAmc,QAAAnc,KAAAqc,WAAAra,IAmBA4a,EAAAE,QAAA,SAAAtD,EAAAxX,GACA,GAAAyF,GAAA4V,EAAAN,EAAA/a,EACA,IAAA,UAAAyF,EAAA6V,OACA,MAAAV,GAAAC,OAAArD,EAAA/R,EAAAzF,MAEA,IAAAib,GAAAxV,EAAAzF,KAEA,IAAAib,EACAhB,EAAAzC,EAAAyD,OACA,CACAzD,EAAAsC,MAAAoC,EACA1E,EAAAwC,QAAAha,CAGA,KAFA,GAAA7D,IAAA,EACAwG,EAAA6U,EAAAM,MAAApb,SACAP,EAAAwG,GACA6U,EAAAM,MAAA3b,GAAAme,cAAAta,GAGA,MAAAwX,IAEAoD,EAAAC,OAAA,SAAArD,EAAAsE,GACAtE,EAAAsC,MAAAmC,EACAzE,EAAAwC,QAAA8B,CAGA,KAFA,GAAA3f,IAAA,EACAwG,EAAA6U,EAAAM,MAAApb,SACAP,EAAAwG,GACA6U,EAAAM,MAAA3b,GAAAqe,aAAAsB,EAEA,OAAAtE,IAsDAhb,EAAAse,QAAAA,EAQAte,EAAAqe,OAAAA,EAMAre,EAAAyH,IAAAA,EAuCAzH,EAAAuf,KAAAA,IAmCApf,EAAA,IAAAwf,GAAA,SAAAzE,EAAA9a,EAAAJ,IACA,SAAA+a,GACA,YACA,mBAAAA,GAAAqC,UACArC,EAAAqC,QAAAlC,EAAA,MAGAjb,KAAAuB,SAAA,KAAAuZ,EAAAA,EAAA,mBAAAC,MAAAA,KAAA,mBAAAF,QAAAA,aACAoC,EAAA,IAAA0C,GAAA,SAAA1E,EAAA9a,EAAAJ,GACA,YAIA,SAAA6f,GAAAC,EAAAC,GAAA,KAAAD,YAAAC,IAAA,KAAA,IAAA5U,WAAA,qCAqEA,QAAA6U,GAAAC,EAAAC,GAEAD,EAAAA,MACAC,EAAAA,KACA,KACA,MAAA,IAAAC,MAAAF,EAAAC,GACA,MAAAhhB,GACA,GAAA,cAAAA,EAAA6C,KACA,KAAA7C,EAIA,KAAA,GAFAkhB,GAAA,mBAAAC,aAAAA,YAAA,mBAAAC,eAAAA,cAAA,mBAAAC,gBAAAA,eAAAC,kBACAC,EAAA,GAAAL,GACAzgB,EAAA,EAAAA,EAAAsgB,EAAA/f,OAAAP,GAAA,EACA8gB,EAAAC,OAAAT,EAAAtgB,GAEA,OAAA8gB,GAAAE,QAAAT,EAAApb,OAaA,QAAA8b,GAAAjD,EAAAkD,GACAA,GACAlD,EAAAa,KAAA,SAAAvV,GACA4X,EAAA,KAAA5X,IACA,SAAAqW,GACAuB,EAAAvB,KAKA,QAAAwB,GAAAnD,EAAAkD,EAAAE,GACA,kBAAAF,IACAlD,EAAAa,KAAAqC,GAGA,kBAAAE,IACApD,EAAA,MAAAoD,GAiBA,QAAAC,GAAAC,GAIA,IAAA,GAHA/gB,GAAA+gB,EAAA/gB,OACAghB,EAAA,GAAAC,aAAAjhB,GACAkhB,EAAA,GAAAC,YAAAH,GACAvhB,EAAA,EAAAA,EAAAO,EAAAP,IACAyhB,EAAAzhB,GAAAshB,EAAAK,WAAA3hB,EAEA,OAAAuhB,GAkBA,QAAAK,GAAAC,GACA,MAAA,IAAAC,IAAA,SAAAnD,GACA,GAAAoD,GAAAF,EAAAG,YAAAC,GAAA,aACAC,EAAA7B,GAAA,IACA0B,GAAAI,YAAAF,IAAAG,IAAAF,EAAA,OAEAH,EAAAM,QAAA,SAAA9iB,GAGAA,EAAA+iB,iBACA/iB,EAAAgjB,kBACA5D,GAAA,IAGAoD,EAAAS,WAAA,WACA,GAAAC,GAAAC,UAAAC,UAAA1T,MAAA,iBACA2T,EAAAF,UAAAC,UAAA1T,MAAA,SAGA0P,GAAAiE,IAAAH,GAAAI,SAAAJ,EAAA,GAAA,KAAA,OAEA,MAAA,WACA,OAAA,IAIA,QAAAK,GAAAjB,GACA,MAAA,iBAAAkB,IACAjB,GAAAnD,QAAAoE,IAEAnB,EAAAC,GAAAhD,KAAA,SAAAhb,GAEA,MADAkf,IAAAlf,IAKA,QAAAmf,GAAAC,GACA,GAAAC,GAAAC,GAAAF,EAAA7gB,MAGAghB,IAEAA,GAAApF,QAAA,GAAA8D,IAAA,SAAAnD,GACAyE,EAAAzE,QAAAA,IAIAuE,EAAAG,mBAAAzgB,KAAAwgB,GAGAF,EAAAI,QAGAJ,EAAAI,QAAAJ,EAAAI,QAAAzE,KAAA,WACA,MAAAuE,GAAApF,UAHAkF,EAAAI,QAAAF,EAAApF,QAQA,QAAAuF,GAAAN,GACA,GAAAC,GAAAC,GAAAF,EAAA7gB,MAGAghB,EAAAF,EAAAG,mBAAAlb,KAIAib,IACAA,EAAAzE,UAIA,QAAA6E,GAAAP,EAAAQ,GACA,MAAA,IAAA3B,IAAA,SAAAnD,EAAAD,GAEA,GAAAuE,EAAAS,GAAA,CACA,IAAAD,EAIA,MAAA9E,GAAAsE,EAAAS,GAHAV,GAAAC,GACAA,EAAAS,GAAAC,QAMA,GAAAC,IAAAX,EAAA7gB,KAEAqhB,IACAG,EAAAhhB,KAAAqgB,EAAAzgB,QAGA,IAAAqhB,GAAAhC,GAAAiC,KAAA7Q,MAAA4O,GAAA+B,EAEAH,KACAI,EAAAE,gBAAA,SAAAxkB,GACA,GAAAmkB,GAAAG,EAAAva,MACA,KACAoa,EAAAM,kBAAAf,EAAAgB,WACA1kB,EAAA2kB,YAAA,GAEAR,EAAAM,kBAAA/B,IAEA,MAAA7H,GACA,GAAA,oBAAAA,EAAAhY,KAGA,KAAAgY,EAFA3W,SAAAC,KAAA,iBAAAuf,EAAA7gB,KAAA,oCAAA7C,EAAA2kB,WAAA,eAAA3kB,EAAA4kB,WAAA,sBAAAlB,EAAAgB,UAAA,wBAQAJ,EAAAO,QAAA,SAAA7kB,GACAA,EAAA+iB,iBACA5D,EAAAmF,EAAAlE,QAGAkE,EAAAQ,UAAA,WACA1F,EAAAkF,EAAAva,QACAia,EAAAN,MAKA,QAAAqB,GAAArB,GACA,MAAAO,GAAAP,GAAA,GAGA,QAAAsB,GAAAtB,GACA,MAAAO,GAAAP,GAAA,GAGA,QAAAuB,GAAAvB,EAAAwB,GACA,IAAAxB,EAAAS,GACA,OAAA,CAGA,IAAAgB,IAAAzB,EAAAS,GAAAiB,iBAAAC,SAAA3B,EAAAgB,WACAY,EAAA5B,EAAAzgB,QAAAygB,EAAAS,GAAAlhB,QACAsiB,EAAA7B,EAAAzgB,QAAAygB,EAAAS,GAAAlhB,OAYA,IAVAqiB,IAGA5B,EAAAzgB,UAAAiiB,GACAhhB,QAAAC,KAAA,iBAAAuf,EAAA7gB,KAAA,uCAAA6gB,EAAAS,GAAAlhB,QAAA,eAAAygB,EAAAzgB,QAAA,KAGAygB,EAAAzgB,QAAAygB,EAAAS,GAAAlhB,SAGAsiB,GAAAJ,EAAA,CAIA,GAAAA,EAAA,CACA,GAAAK,GAAA9B,EAAAS,GAAAlhB,QAAA,CACAuiB,GAAA9B,EAAAzgB,UACAygB,EAAAzgB,QAAAuiB,GAIA,OAAA,EAGA,OAAA,EAIA,QAAAC,GAAA9C,GACA,MAAA,IAAAJ,IAAA,SAAAnD,EAAAD,GACA,GAAAuG,GAAA,GAAAC,WACAD,GAAAb,QAAA1F,EACAuG,EAAAE,UAAA,SAAA5lB,GACA,GAAA6lB,GAAAC,KAAA9lB,EAAA+lB,OAAAhc,QAAA,GACAqV,IACA4G,6BAAA,EACA/I,KAAA4I,EACAjgB,KAAA+c,EAAA/c,QAGA8f,EAAAO,mBAAAtD,KAKA,QAAAuD,GAAAC,GAEA,MAAArF,IADAgB,EAAAsE,KAAAD,EAAAlJ,SACArX,KAAAugB,EAAAvgB,OAIA,QAAAygB,GAAA/hB,GACA,MAAAA,IAAAA,EAAA0hB,4BAOA,QAAAM,GAAA3E,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA3C,EAAAyK,aAAAjH,KAAA,WACA,GAAAqE,GAAAC,GAAA9H,EAAA0K,QAAA3jB,KAEA,IAAA8gB,GAAAA,EAAAI,QACA,MAAAJ,GAAAI,SAKA,OADAnC,GAAAnD,EAAAkD,EAAAA,GACAlD,EAKA,QAAAgI,GAAAC,GAgDA,QAAAC,KAGA,MAAApE,IAAAnD,UAlDA,GAAAtD,GAAAxZ,KACAohB,GACAS,GAAA,KAGA,IAAAuC,EACA,IAAA,GAAAjmB,KAAAimB,GACAhD,EAAAjjB,GAAAimB,EAAAjmB,EAKAmjB,MACAA,MAIA,IAAAD,GAAAC,GAAAF,EAAA7gB,KAGA8gB,KACAA,GAEAiD,WAEAzC,GAAA,KAEAJ,QAAA,KAEAD,uBAGAF,GAAAF,EAAA7gB,MAAA8gB,GAIAA,EAAAiD,QAAAvjB,KAAAyY,GAGAA,EAAAyK,aACAzK,EAAAyK,WAAAzK,EAAA+K,MACA/K,EAAA+K,MAAAP,EAYA,KAAA,GARAQ,MAQAC,EAAA,EAAAA,EAAApD,EAAAiD,QAAA5lB,OAAA+lB,IAAA,CACA,GAAAC,GAAArD,EAAAiD,QAAAG,EACAC,KAAAlL,GAEAgL,EAAAzjB,KAAA2jB,EAAAT,aAAA,MAAAI,IAKA,GAAAC,GAAAjD,EAAAiD,QAAA/kB,MAAA,EAIA,OAAA0gB,IAAAha,IAAAue,GAAAxH,KAAA,WAGA,MAFAoE,GAAAS,GAAAR,EAAAQ,GAEAY,EAAArB,KACApE,KAAA,SAAA6E,GAEA,MADAT,GAAAS,GAAAA,EACAc,EAAAvB,EAAA5H,EAAAmL,eAAAhkB,SAEA+hB,EAAAtB,GAEAS,IACA7E,KAAA,SAAA6E,GACAT,EAAAS,GAAAR,EAAAQ,GAAAA,EACArI,EAAA0K,QAAA9C,CAEA,KAAA,GAAAtd,GAAA,EAAAA,EAAAwgB,EAAA5lB,OAAAoF,IAAA,CACA,GAAA4gB,GAAAJ,EAAAxgB,EACA4gB,KAAAlL,IAEAkL,EAAAR,QAAArC,GAAAT,EAAAS,GACA6C,EAAAR,QAAAvjB,QAAAygB,EAAAzgB,YAMA,QAAAikB,GAAAxlB,EAAAigB,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACAW,EAAAzD,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,YAAA9B,YAAAc,EAAAgB,WACA0C,EAAAD,EAAAljB,IAAAvC,EAEA0lB,GAAAtC,UAAA,WACA,GAAAxgB,GAAA8iB,EAAArd,WACAxD,KAAAjC,IACAA,EAAA,MAEA+hB,EAAA/hB,KACAA,EAAA4hB,EAAA5hB,IAEA8a,EAAA9a,IAGA8iB,EAAAvC,QAAA,WACA1F,EAAAiI,EAAAhH,UAEA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAIA,QAAA4I,GAAAC,EAAA3F,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACAW,EAAAzD,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,YAAA9B,YAAAc,EAAAgB,WAEA0C,EAAAD,EAAAI,aACAC,EAAA,CAEAJ,GAAAtC,UAAA,WACA,GAAA2C,GAAAL,EAAArd,MAEA,IAAA0d,EAAA,CACA,GAAAnjB,GAAAmjB,EAAAnjB,KACA+hB,GAAA/hB,KACAA,EAAA4hB,EAAA5hB,GAEA,IAAAyF,GAAAud,EAAAhjB,EAAAmjB,EAAA/lB,IAAA8lB,SAEA,KAAAzd,EACAqV,EAAArV,GAEA0d,EAAA,eAGArI,MAIAgI,EAAAvC,QAAA,WACA1F,EAAAiI,EAAAhH,UAEA,MAAAjB,IAKA,OAFAuC,GAAAjD,EAAAkD,GAEAlD,EAGA,QAAAiJ,GAAAhmB,EAAA4C,EAAAqd,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACA,GAAAuE,EACA5H,GAAA+K,QAAAvH,KAAA,WAEA,MADAoE,GAAA5H,EAAA0K,QACA,kBAAA9f,GAAA3F,KAAAuD,GACAif,EAAAG,EAAAS,IAAA7E,KAAA,SAAAqI,GACA,MAAAA,GACArjB,EAEAmhB,EAAAnhB,KAGAA,IACAgb,KAAA,SAAAhb,GACA,GAAAme,GAAAiB,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,aACAyC,EAAA1E,EAAAG,YAAAc,EAAAgB,WACA0C,EAAAD,EAAAtE,IAAAve,EAAA5C,EAMA,QAAA4C,IACAA,MAAAiC,IAGAkc,EAAAQ,WAAA,eAOA1c,KAAAjC,IACAA,EAAA,MAGA8a,EAAA9a,IAEAme,EAAAK,QAAAL,EAAAoC,QAAA,WACA,GAAAvb,GAAA8d,EAAAhH,MAAAgH,EAAAhH,MAAAgH,EAAA3E,YAAArC,KACAjB,GAAA7V,MAEA,MAAA6V,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAmJ,GAAAlmB,EAAAigB,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACA/D,EAAAiB,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,aACAyC,EAAA1E,EAAAG,YAAAc,EAAAgB,WAOA0C,EAAAD,EAAA,OAAAzlB,EACA+gB,GAAAQ,WAAA,WACA7D,KAGAqD,EAAAoC,QAAA,WACA1F,EAAAiI,EAAAhH,QAKAqC,EAAAK,QAAA,WACA,GAAAxZ,GAAA8d,EAAAhH,MAAAgH,EAAAhH,MAAAgH,EAAA3E,YAAArC,KACAjB,GAAA7V,MAEA,MAAA6V,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAoJ,GAAAlG,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACA/D,EAAAiB,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,aACAyC,EAAA1E,EAAAG,YAAAc,EAAAgB,WACA0C,EAAAD,EAAAU,OAEApF,GAAAQ,WAAA,WACA7D,KAGAqD,EAAAK,QAAAL,EAAAoC,QAAA,WACA,GAAAvb,GAAA8d,EAAAhH,MAAAgH,EAAAhH,MAAAgH,EAAA3E,YAAArC,KACAjB,GAAA7V,MAEA,MAAA6V,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAzd,GAAA2gB,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACAW,EAAAzD,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,YAAA9B,YAAAc,EAAAgB,WACA0C,EAAAD,EAAAW,OAEAV,GAAAtC,UAAA,WACA1F,EAAAgI,EAAArd,SAGAqd,EAAAvC,QAAA,WACA1F,EAAAiI,EAAAhH,UAEA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAA/c,GAAAxB,EAAAyhB,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACA,GAAAjf,EAAA,EAGA,WAFAkf,GAAA,KAKAtD,GAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACAW,EAAAzD,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,YAAA9B,YAAAc,EAAAgB,WAEAqD,GAAA,EACAX,EAAAD,EAAAI,YACAH,GAAAtC,UAAA,WACA,GAAA2C,GAAAL,EAAArd,MACA,KAAA0d,EAIA,WAFArI,GAAA,KAKA,KAAAlf,EAGAkf,EAAAqI,EAAA/lB,KAEAqmB,EAOA3I,EAAAqI,EAAA/lB,MAJAqmB,GAAA,EACAN,EAAAO,QAAA9nB,KAQAknB,EAAAvC,QAAA,WACA1F,EAAAiI,EAAAhH,UAEA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAjd,GAAAmgB,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACAW,EAAAzD,EAAAS,GAAA1B,YAAAiB,EAAAgB,UAAA,YAAA9B,YAAAc,EAAAgB,WAEA0C,EAAAD,EAAAI,aACA/lB,IAEA4lB,GAAAtC,UAAA,WACA,GAAA2C,GAAAL,EAAArd,MAEA,KAAA0d,EAEA,WADArI,GAAA5d,EAIAA,GAAA6B,KAAAokB,EAAA/lB,KACA+lB,EAAA,YAGAL,EAAAvC,QAAA,WACA1F,EAAAiI,EAAAhH,UAEA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EA2CA,QAAAwJ,GAAAC,GAEA,GAEAznB,GAEA0nB,EAAAC,EAAAC,EAAAC,EAJAC,EAAA,IAAAL,EAAAlnB,OACAiG,EAAAihB,EAAAlnB,OAEA+T,EAAA,CAGA,OAAAmT,EAAAA,EAAAlnB,OAAA,KACAunB,IACA,MAAAL,EAAAA,EAAAlnB,OAAA,IACAunB,IAIA,IAAAC,GAAA,GAAAvG,aAAAsG,GACAE,EAAA,GAAAtG,YAAAqG,EAEA,KAAA/nB,EAAA,EAAAA,EAAAwG,EAAAxG,GAAA,EACA0nB,EAAAO,GAAA9mB,QAAAsmB,EAAAznB,IACA2nB,EAAAM,GAAA9mB,QAAAsmB,EAAAznB,EAAA,IACA4nB,EAAAK,GAAA9mB,QAAAsmB,EAAAznB,EAAA,IACA6nB,EAAAI,GAAA9mB,QAAAsmB,EAAAznB,EAAA,IAGAgoB,EAAA1T,KAAAoT,GAAA,EAAAC,GAAA,EACAK,EAAA1T,MAAA,GAAAqT,IAAA,EAAAC,GAAA,EACAI,EAAA1T,MAAA,EAAAsT,IAAA,EAAA,GAAAC,CAEA,OAAAE,GAKA,QAAAG,GAAAH,GAEA,GAEA/nB,GAFAgoB,EAAA,GAAAtG,YAAAqG,GACAI,EAAA,EAGA,KAAAnoB,EAAA,EAAAA,EAAAgoB,EAAAznB,OAAAP,GAAA,EAEAmoB,GAAAF,GAAAD,EAAAhoB,IAAA,GACAmoB,GAAAF,IAAA,EAAAD,EAAAhoB,KAAA,EAAAgoB,EAAAhoB,EAAA,IAAA,GACAmoB,GAAAF,IAAA,GAAAD,EAAAhoB,EAAA,KAAA,EAAAgoB,EAAAhoB,EAAA,IAAA,GACAmoB,GAAAF,GAAA,GAAAD,EAAAhoB,EAAA,GASA,OANAgoB,GAAAznB,OAAA,GAAA,EACA4nB,EAAAA,EAAAC,UAAA,EAAAD,EAAA5nB,OAAA,GAAA,IACAynB,EAAAznB,OAAA,GAAA,IACA4nB,EAAAA,EAAAC,UAAA,EAAAD,EAAA5nB,OAAA,GAAA,MAGA4nB,EAMA,QAAAE,GAAAxkB,EAAAqd,GACA,GAAAoH,GAAA,EASA,IARAzkB,IACAykB,EAAAC,GAAAjoB,KAAAuD,IAOAA,IAAA,yBAAAykB,GAAAzkB,EAAAkkB,QAAA,yBAAAQ,GAAAjoB,KAAAuD,EAAAkkB,SAAA,CAGA,GAAAA,GACAS,EAAAC,EAEA5kB,aAAA2d,cACAuG,EAAAlkB,EACA2kB,GAAAE,KAEAX,EAAAlkB,EAAAkkB,OAEA,uBAAAO,EACAE,GAAAG,GACA,wBAAAL,EACAE,GAAAI,GACA,+BAAAN,EACAE,GAAAK,GACA,wBAAAP,EACAE,GAAAM,GACA,yBAAAR,EACAE,GAAAO,GACA,wBAAAT,EACAE,GAAAQ,GACA,yBAAAV,EACAE,GAAAS,GACA,0BAAAX,EACAE,GAAAU,GACA,0BAAAZ,EACAE,GAAAW,GAEAjI,EAAA,GAAAhhB,OAAA,wCAIAghB,EAAAsH,EAAAN,EAAAH,QACA,IAAA,kBAAAO,EAAA,CAEA,GAAAc,GAAA,GAAAlE,WAEAkE,GAAAC,OAAA,WAEA,GAAA3hB,GAAA4hB,GAAAzlB,EAAAsB,KAAA,IAAA+iB,EAAArmB,KAAAyH,OAEA4X,GAAAuH,GAAAc,GAAA7hB,IAGA0hB,EAAAI,kBAAA3lB,OAEA,KACAqd,EAAAtJ,KAAAC,UAAAhU,IACA,MAAAtE,GACAkE,QAAAkc,MAAA,8CAAA9b,GAEAqd,EAAA,KAAA3hB,IAaA,QAAAkqB,GAAA5lB,GAIA,GAAAA,EAAAukB,UAAA,EAAAsB,MAAAjB,GACA,MAAA7Q,MAAA+R,MAAA9lB,EAMA,IAGA+lB,GAHAnC,EAAA5jB,EAAAukB,UAAAyB,IACA1kB,EAAAtB,EAAAukB,UAAAsB,GAAAG,GAKA,IAAA1kB,IAAAokB,IAAAO,GAAAplB,KAAA+iB,GAAA,CACA,GAAApe,GAAAoe,EAAAxY,MAAA6a,GACAF,GAAAvgB,EAAA,GACAoe,EAAAA,EAAAW,UAAA/e,EAAA,GAAA9I,QAEA,GAAAwnB,GAAAP,EAAAC,EAIA,QAAAtiB,GACA,IAAAujB,IACA,MAAAX,EACA,KAAAwB,IACA,MAAAlJ,IAAA0H,IAAA5iB,KAAAykB,GACA,KAAAjB,IACA,MAAA,IAAAoB,WAAAhC,EACA,KAAAa,IACA,MAAA,IAAAlH,YAAAqG,EACA,KAAAc,IACA,MAAA,IAAAmB,mBAAAjC,EACA,KAAAe,IACA,MAAA,IAAAmB,YAAAlC,EACA,KAAAgB,IACA,MAAA,IAAAmB,aAAAnC,EACA,KAAAiB,IACA,MAAA,IAAAmB,YAAApC,EACA,KAAAkB,IACA,MAAA,IAAAmB,aAAArC,EACA,KAAAmB,IACA,MAAA,IAAAmB,cAAAtC,EACA,KAAAoB,IACA,MAAA,IAAAmB,cAAAvC,EACA,SACA,KAAA,IAAA7nB,OAAA,gBAAAiF,IAsBA,QAAAolB,GAAAtE,GACA,GAAA5K,GAAAxZ,KACAohB,GACAS,GAAA,KAGA,IAAAuC,EACA,IAAA,GAAAjmB,KAAAimB,GACAhD,EAAAjjB,GAAA,gBAAAimB,GAAAjmB,GAAAimB,EAAAjmB,GAAAiG,WAAAggB,EAAAjmB,EAIA,IAAAwqB,GAAA,GAAA1I,IAAA,SAAAnD,EAAAD,GAGA,IACAuE,EAAAS,GAAA+G,aAAAxH,EAAA7gB,KAAA8P,OAAA+Q,EAAAzgB,SAAAygB,EAAAyH,YAAAzH,EAAA0H,MACA,MAAAprB,GACA,MAAAmf,GAAAnf,GAIA0jB,EAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,8BAAA3H,EAAAgB,UAAA,kDAAA,WACA5I,EAAA0K,QAAA9C,EACAtE,KACA,SAAAnf,EAAAmgB,GACAjB,EAAAiB,QAMA,OADAsD,GAAA4H,WAAAC,GACAN,EAGA,QAAAO,GAAA9pB,EAAAigB,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,iBAAA3H,EAAAgB,UAAA,0BAAAhjB,GAAA,SAAAzB,EAAAwrB,GACA,GAAA1hB,GAAA0hB,EAAAC,KAAA1qB,OAAAyqB,EAAAC,KAAAC,KAAA,GAAArnB,MAAA,IAIAyF,KACAA,EAAA2Z,EAAA4H,WAAApB,YAAAngB,IAGAqV,EAAArV,IACA,SAAA9J,EAAAmgB,GAEAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAmN,GAAAtE,EAAA3F,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OAEA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,iBAAA3H,EAAAgB,aAAA,SAAAzkB,EAAAwrB,GAIA,IAAA,GAHAC,GAAAD,EAAAC,KACA1qB,EAAA0qB,EAAA1qB,OAEAP,EAAA,EAAAA,EAAAO,EAAAP,IAAA,CACA,GAAAkrB,GAAAD,EAAAC,KAAAlrB,GACAsJ,EAAA4hB,EAAArnB,KAYA,IARAyF,IACAA,EAAA2Z,EAAA4H,WAAApB,YAAAngB,QAOA,MAJAA,EAAAud,EAAAvd,EAAA4hB,EAAAjqB,IAAAjB,EAAA,IAMA,WADA2e,GAAArV,GAKAqV,KACA,SAAAnf,EAAAmgB,GACAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAoN,GAAAnqB,EAAA4C,EAAAqd,EAAAmK,GACA,GAAAhQ,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,eAIA/Y,KAAAjC,IACAA,EAAA,KAIA,IAAAynB,GAAAznB,EAEAof,EAAA5H,EAAA0K,OACA9C,GAAA4H,WAAAxC,UAAAxkB,EAAA,SAAAA,EAAA8b,GACAA,EACAjB,EAAAiB,GAEAsD,EAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,0BAAA3H,EAAAgB,UAAA,+BAAAhjB,EAAA4C,GAAA,WACA8a,EAAA2M,IACA,SAAA9rB,EAAAmgB,GACAjB,EAAAiB,MAEA,SAAA4L,GAGA,GAAAA,EAAAprB,OAAAorB,EAAAC,UAAA,CAQA,GAAAH,EAAA,EAEA,WADA1M,GAAAyM,EAAAnY,MAAAoI,GAAApa,EAAAqqB,EAAApK,EAAAmK,EAAA,IAGA3M,GAAA6M,UAKA,MAAA7M,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAyN,GAAAxqB,EAAA4C,EAAAqd,GACA,MAAAkK,GAAAnY,MAAApR,MAAAZ,EAAA4C,EAAAqd,EAAA,IAGA,QAAAwK,GAAAzqB,EAAAigB,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,eAAA3H,EAAAgB,UAAA,kBAAAhjB,GAAA,WACA0d,KACA,SAAAnf,EAAAmgB,GAEAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAKA,QAAA2N,GAAAzK,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,eAAA3H,EAAAgB,aAAA,WACAtF,KACA,SAAAnf,EAAAmgB,GACAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAKA,QAAA4N,GAAA1K,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GAEAA,EAAAorB,WAAA,+BAAA3H,EAAAgB,aAAA,SAAAzkB,EAAAwrB,GACA,GAAA1hB,GAAA0hB,EAAAC,KAAAC,KAAA,GAAAW,CAEAlN,GAAArV,IACA,SAAA9J,EAAAmgB,GAEAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAUA,QAAA8N,GAAArsB,EAAAyhB,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,mBAAA3H,EAAAgB,UAAA,yBAAAxkB,EAAA,GAAA,SAAAD,EAAAwrB,GACA,GAAA1hB,GAAA0hB,EAAAC,KAAA1qB,OAAAyqB,EAAAC,KAAAC,KAAA,GAAAjqB,IAAA,IACA0d,GAAArV,IACA,SAAA9J,EAAAmgB,GACAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAGA,QAAA+N,GAAA7K,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACArD,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACA9C,GAAAS,GAAA1B,YAAA,SAAAxiB,GACAA,EAAAorB,WAAA,mBAAA3H,EAAAgB,aAAA,SAAAzkB,EAAAwrB,GAGA,IAAA,GAFAjqB,MAEAf,EAAA,EAAAA,EAAAgrB,EAAAC,KAAA1qB,OAAAP,IACAe,EAAA6B,KAAAooB,EAAAC,KAAAC,KAAAlrB,GAAAiB,IAGA0d,GAAA5d,IACA,SAAAvB,EAAAmgB,GAEAjB,EAAAiB,SAGA,MAAAjB,IAIA,OADAuC,GAAAjD,EAAAkD,GACAlD,EAiBA,QAAAgO,GAAA/F,GACA,GAAA5K,GAAAxZ,KACAohB,IACA,IAAAgD,EACA,IAAA,GAAAjmB,KAAAimB,GACAhD,EAAAjjB,GAAAimB,EAAAjmB,EAaA,OATAijB,GAAAgJ,UAAAhJ,EAAA7gB,KAAA,IAEA6gB,EAAAgB,YAAA5I,EAAAmL,eAAAvC,YACAhB,EAAAgJ,WAAAhJ,EAAAgB,UAAA,KAGA5I,EAAA0K,QAAA9C,EACAA,EAAA4H,WAAAC,GAEAhJ,GAAAnD,UAKA,QAAAuN,GAAAhL,GACA,GAAA7F,GAAAxZ,KACAmc,EAAA3C,EAAA+K,QAAAvH,KAAA,WAGA,IAAA,GAFAoN,GAAA5Q,EAAA0K,QAAAkG,UAEAjsB,EAAAmsB,aAAA5rB,OAAA,EAAAP,GAAA,EAAAA,IAAA,CACA,GAAAiB,GAAAkrB,aAAAlrB,IAAAjB,EAEA,KAAAiB,EAAAE,QAAA8qB,IACAE,aAAAhF,WAAAlmB,KAMA,OADAggB,GAAAjD,EAAAkD,GACAlD,EAMA,QAAAoO,GAAAnrB,EAAAigB,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA3C,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,QACAzc,EAAA6iB,aAAA1F,QAAAxD,EAAAgJ,UAAAhrB,EAUA,OAJAqI,KACAA,EAAA2Z,EAAA4H,WAAApB,YAAAngB,IAGAA,GAIA,OADA2X,GAAAjD,EAAAkD,GACAlD,EAIA,QAAAqO,GAAAxF,EAAA3F,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA3C,EAAA+K,QAAAvH,KAAA,WAcA,IAAA,GAbAoE,GAAA5H,EAAA0K,QACAkG,EAAAhJ,EAAAgJ,UACAK,EAAAL,EAAA1rB,OACAA,EAAA4rB,aAAA5rB,OAQAwmB,EAAA,EAEA/mB,EAAA,EAAAA,EAAAO,EAAAP,IAAA,CACA,GAAAiB,GAAAkrB,aAAAlrB,IAAAjB,EACA,IAAA,IAAAiB,EAAAE,QAAA8qB,GAAA,CAGA,GAAApoB,GAAAsoB,aAAA1F,QAAAxlB,EAYA,IANA4C,IACAA,EAAAof,EAAA4H,WAAApB,YAAA5lB,QAKA,MAFAA,EAAAgjB,EAAAhjB,EAAA5C,EAAAmnB,UAAAkE,GAAAvF,MAGA,MAAAljB,MAMA,OADAod,GAAAjD,EAAAkD,GACAlD,EAIA,QAAAuO,GAAA9sB,EAAAyhB,GACA,GAAA7F,GAAAxZ,KACAmc,EAAA3C,EAAA+K,QAAAvH,KAAA,WACA,GACAvV,GADA2Z,EAAA5H,EAAA0K,OAEA,KACAzc,EAAA6iB,aAAAlrB,IAAAxB,GACA,MAAAkgB,GACArW,EAAA,KAQA,MAJAA,KACAA,EAAAA,EAAA8e,UAAAnF,EAAAgJ,UAAA1rB,SAGA+I,GAIA,OADA2X,GAAAjD,EAAAkD,GACAlD,EAGA,QAAAwO,GAAAtL,GACA,GAAA7F,GAAAxZ,KACAmc,EAAA3C,EAAA+K,QAAAvH,KAAA,WAKA,IAAA,GAJAoE,GAAA5H,EAAA0K,QACAxlB,EAAA4rB,aAAA5rB,OACAQ,KAEAf,EAAA,EAAAA,EAAAO,EAAAP,IACA,IAAAmsB,aAAAlrB,IAAAjB,GAAAmB,QAAA8hB,EAAAgJ,YACAlrB,EAAA6B,KAAAupB,aAAAlrB,IAAAjB,GAAAooB,UAAAnF,EAAAgJ,UAAA1rB,QAIA,OAAAQ,IAIA,OADAkgB,GAAAjD,EAAAkD,GACAlD,EAIA,QAAAyO,GAAAvL,GACA,GAAA7F,GAAAxZ,KACAmc,EAAA3C,EAAAta,OAAA8d,KAAA,SAAA9d,GACA,MAAAA,GAAAR,QAIA,OADA0gB,GAAAjD,EAAAkD,GACAlD,EAIA,QAAA0O,GAAAzrB,EAAAigB,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA3C,EAAA+K,QAAAvH,KAAA,WACA,GAAAoE,GAAA5H,EAAA0K,OACAoG,cAAAhF,WAAAlE,EAAAgJ,UAAAhrB,IAIA,OADAggB,GAAAjD,EAAAkD,GACAlD,EAOA,QAAA2O,GAAA1rB,EAAA4C,EAAAqd,GACA,GAAA7F,GAAAxZ,IAGA,iBAAAZ,KACAwC,QAAAC,KAAAzC,EAAA,2CACAA,EAAAiR,OAAAjR,GAGA,IAAA+c,GAAA3C,EAAA+K,QAAAvH,KAAA,eAGA/Y,KAAAjC,IACAA,EAAA,KAIA,IAAAynB,GAAAznB,CAEA,OAAA,IAAAie,IAAA,SAAAnD,EAAAD,GACA,GAAAuE,GAAA5H,EAAA0K,OACA9C,GAAA4H,WAAAxC,UAAAxkB,EAAA,SAAAA,EAAA8b,GACA,GAAAA,EACAjB,EAAAiB,OAEA,KACAwM,aAAAlF,QAAAhE,EAAAgJ,UAAAhrB,EAAA4C,GACA8a,EAAA2M,GACA,MAAA/rB,GAGA,uBAAAA,EAAA6C,MAAA,+BAAA7C,EAAA6C,MACAsc,EAAAnf,GAEAmf,EAAAnf,SAQA,OADA0hB,GAAAjD,EAAAkD,GACAlD,EA0DA,QAAA4O,GAAAC,EAAAC,GACAD,EAAAC,GAAA,WACA,GAAAC,GAAA1rB,SACA,OAAAwrB,GAAAzG,QAAAvH,KAAA,WACA,MAAAgO,GAAAC,GAAA7Z,MAAA4Z,EAAAE,MAKA,QAAAprB,KACA,IAAA,GAAA3B,GAAA,EAAAA,EAAAqB,UAAAd,OAAAP,IAAA,CACA,GAAAgtB,GAAA3rB,UAAArB,EAEA,IAAAgtB,EACA,IAAA,GAAA/rB,KAAA+rB,GACAA,EAAAjmB,eAAA9F,KACA6J,GAAAkiB,EAAA/rB,IACAI,UAAA,GAAAJ,GAAA+rB,EAAA/rB,GAAAG,QAEAC,UAAA,GAAAJ,GAAA+rB,EAAA/rB,IAOA,MAAAI,WAAA,GAGA,QAAA4rB,IAAAC,GACA,IAAA,GAAAC,KAAAC,IACA,GAAAA,GAAArmB,eAAAomB,IAAAC,GAAAD,KAAAD,EACA,OAAA,CAIA,QAAA,EAjpDA,GAAAG,IAAA,kBAAAC,SAAA,gBAAAA,QAAAzG,SAAA,SAAAhmB,GAAA,aAAAA,IAAA,SAAAA,GAAA,MAAAA,IAAA,kBAAAysB,SAAAzsB,EAAAwB,cAAAirB,QAAAzsB,IAAAysB,OAAAprB,UAAA,eAAArB,IAyBAghB,GArBA,WAEA,IACA,GAAA,mBAAA0L,WACA,MAAAA,UAEA,IAAA,mBAAAC,iBACA,MAAAA,gBAEA,IAAA,mBAAAC,cACA,MAAAA,aAEA,IAAA,mBAAAC,YACA,MAAAA,WAEA,IAAA,mBAAAC,aACA,MAAAA,aAEA,MAAApuB,OAsEA,oBAAAke,UAGAlC,EAAA,EAEA,IA0BAwH,IACAI,GA3BArB,GAAArE,QAyBAwE,GAAA,mCAGAhc,GAAAnF,OAAAoB,UAAA+D,SA8oBA2nB,IACAC,QAAA,eACA7H,aAAAA,EACAY,QAAAA,EACAH,QAAAA,EACAQ,QAAAA,EACAE,WAAAA,EACAC,MAAAA,EACA7mB,OAAAA,EACAU,IAAAA,EACAF,KAAAA,GAMAknB,GAAA,mEAEAqB,GAAA,uBACAQ,GAAA,gCAEArB,GAAA,YACAiB,GAAAjB,GAAAloB,OAGAmoB,GAAA,OACAa,GAAA,OACAZ,GAAA,OACAC,GAAA,OACAC,GAAA,OACAC,GAAA,OACAE,GAAA,OACAD,GAAA,OACAE,GAAA,OACAC,GAAA,OACAC,GAAA,OACAU,GAAAH,GAAAhB,GAAAnoB,OAEAgoB,GAAAznB,OAAAoB,UAAA+D,SAiMA6kB,IACAzC,UAAAA,EACAoB,YAAAA,EACAjC,eAAAA,EACAU,eAAAA,GAkUA4F,IACAD,QAAA,gBACA7H,aAAAuE,EACA3D,QAAAuE,EACA1E,QAAAsE,EACA9D,QAAAwE,EACAtE,WAAAuE,EACAtE,MAAAuE,EACAprB,OAAAqrB,EACA3qB,IAAA6qB,EACA/qB,KAAAgrB,GAoPAgC,IACAF,QAAA,sBACA7H,aAAAgG,EAEApF,QAAAyF,EACA5F,QAAA2F,EACAnF,QAAA0F,EACAxF,WAAAuF,EACAtF,MAAA8E,EACA3rB,OAAAksB,EACAxrB,IAAAsrB,EACAxrB,KAAAyrB,GAKAwB,MAEAZ,IACAa,UAAA,eACAC,aAAA,sBACAC,OAAA,iBAGAC,IAAAhB,GAAAa,UAAAb,GAAAe,OAAAf,GAAAc,cAEAG,IAAA,QAAA,UAAA,UAAA,MAAA,OAAA,SAAA,aAAA,WAEAC,IACA5D,YAAA,GACAyC,OAAAiB,GAAAhtB,QACAgB,KAAA,cAGAuoB,KAAA,QACA1G,UAAA,gBACAzhB,QAAA,GAGA+rB,KAMAA,IAAAnB,GAAAa,WAxkDA,WACA,IAGA,IAAApM,GACA,OAAA,CAMA,IAAA2M,GAAA,mBAAA/D,eAAA,4BAAA/lB,KAAAge,UAAAC,aAAA,SAAAje,KAAAge,UAAAC,aAAA,aAAAje,KAAAge,UAAA+L,UAEAC,EAAA,kBAAAC,SAAA,IAAAA,MAAA1oB,WAAA9E,QAAA,eAIA,SAAAqtB,GAAAE,IAAA,mBAAAnB,YAGA,mBAAAqB,aACA,MAAArvB,GACA,OAAA,MAojDAgvB,GAAAnB,GAAAe,QAhjDA,WACA,MAAA,kBAAA1D,iBAijDA8D,GAAAnB,GAAAc,cA9iDA,WACA,IACA,MAAA,mBAAA/B,eAAA,WAAAA,eAAAA,aAAAlF,QACA,MAAA1nB,GACA,OAAA,KA4iDA,IAAAuL,IAAAlD,MAAAkD,SAAA,SAAAkiB,GACA,MAAA,mBAAAlsB,OAAAoB,UAAA+D,SAAA3F,KAAA0sB,IA0CA6B,GAAA,WACA,QAAAA,GAAA5I,GACA/F,EAAAre,KAAAgtB,GAEAhtB,KAAAosB,UAAAb,GAAAa,UACApsB,KAAAqsB,aAAAd,GAAAc,aACArsB,KAAAssB,OAAAf,GAAAe,OAEAtsB,KAAA2kB,eAAA7kB,KAAA2sB,IACAzsB,KAAAitB,QAAAntB,KAAAE,KAAA2kB,eAAAP,GACApkB,KAAAktB,WAAA,KACAltB,KAAAmtB,YAAA,KACAntB,KAAAotB,QAAA,EACAptB,KAAAkkB,QAAA,KAEAlkB,KAAAqtB,+BACArtB,KAAAstB,UAAAttB,KAAAitB,QAAA3B,QAAA,MAAA,cA+PA,MAtPA0B,GAAA3sB,UAAAW,OAAA,SAAAojB,GAIA,GAAA,gBAAA,KAAAA,EAAA,YAAAoH,GAAApH,IAAA,CAGA,GAAApkB,KAAAotB,OACA,MAAA,IAAA/uB,OAAA,uDAGA,KAAA,GAAAF,KAAAimB,GAAA,CAKA,GAJA,cAAAjmB,IACAimB,EAAAjmB,GAAAimB,EAAAjmB,GAAAgU,QAAA,MAAA,MAGA,YAAAhU,GAAA,gBAAAimB,GAAAjmB,GACA,MAAA,IAAAE,OAAA,qCAGA2B,MAAAitB,QAAA9uB,GAAAimB,EAAAjmB,GAKA,QAAA,UAAAimB,IAAAA,EAAAkH,SACAtrB,KAAAstB,UAAAttB,KAAAitB,QAAA3B,QAIA,MAAA,gBAAAlH,GACApkB,KAAAitB,QAAA7I,GAEApkB,KAAAitB,SAQAD,EAAA3sB,UAAAktB,aAAA,SAAAC,EAAAnO,EAAAE,GACA,GAAApD,GAAA,GAAA8D,IAAA,SAAAnD,EAAAD,GACA,IACA,GAAAwO,GAAAmC,EAAAxB,QACAyB,EAAA,GAAApvB,OAAA,wFACAqvB,EAAA,GAAArvB,OAAA,sCAAAmvB,EAAAxB,QAIA,KAAAwB,EAAAxB,QAEA,WADAnP,GAAA4Q,EAGA,IAAArC,GAAAoC,EAAAxB,SAEA,WADAnP,GAAA6Q,EAKA,KAAA,GADAC,GAAAnB,GAAAoB,OAAA,gBACAzvB,EAAA,EAAAA,EAAAwvB,EAAAjvB,OAAAP,IAAA,CACA,GAAA0vB,GAAAF,EAAAxvB,EACA,KAAA0vB,IAAAL,EAAAK,IAAA,kBAAAL,GAAAK,GAEA,WADAhR,GAAA4Q,GAKA,GAAAK,GAAA7N,GAAAnD,SAAA,EACA,aAAA0Q,KAEAM,EADAN,EAAAO,UAAA,kBAAAP,GAAAO,SACAP,EAAAO,WAEA9N,GAAAnD,UAAA0Q,EAAAO,WAIAD,EAAA9Q,KAAA,SAAAgR,GACAtB,GAAArB,GAAA2C,EACA7B,GAAAd,GAAAmC,EACA1Q,KACAD,GACA,MAAAnf,GACAmf,EAAAnf,KAKA,OADA4hB,GAAAnD,EAAAkD,EAAAE,GACApD,GAGA6Q,EAAA3sB,UAAAirB,OAAA,WACA,MAAAtrB,MAAAgsB,SAAA,MAGAgB,EAAA3sB,UAAA4tB,UAAA,SAAA5C,EAAAhM,EAAAE,GACA,GAAA/F,GAAAxZ,KACAkuB,EAAAjO,GAAAnD,UAAAE,KAAA,WACA,IAAAoO,GAAAC,GASA,CAAA,GAAAc,GAAAd,GACA,MAAAc,IAAAd,EAEA,MAAA,IAAAhtB,OAAA,qBAXA,OAAAgtB,GACA,IAAA7R,GAAA4S,UACA,MAAAL,GACA,KAAAvS,GAAA6S,aACA,MAAAH,GACA,KAAA1S,GAAA8S,OACA,MAAAL,MASA,OADA3M,GAAA4O,EAAA7O,EAAAE,GACA2O,GAGAlB,EAAA3sB,UAAA8tB,cAAA,SAAA9O,GACA,GAAA+O,GAAAnO,GAAAnD,QAAAmM,GAEA,OADA3J,GAAA8O,EAAA/O,GACA+O,GAGApB,EAAA3sB,UAAAkkB,MAAA,SAAAlF,GACA,GAAA7F,GAAAxZ,KAEAmc,EAAA3C,EAAA0T,WAAAlQ,KAAA,WAKA,MAJA,QAAAxD,EAAA4T,SACA5T,EAAA4T,OAAA5T,EAAA2T,eAGA3T,EAAA4T,QAIA,OADA9N,GAAAnD,EAAAkD,EAAAA,GACAlD,GAGA6Q,EAAA3sB,UAAAitB,UAAA,SAAAe,EAAAhP,EAAAE,GASA,QAAA+O,KACA9U,EAAAyT,QAAA3B,OAAA9R,EAAA8R,SAGA,QAAAiD,GAAAjD,GAKA,MAJA9R,GAAAgV,QAAAlD,GACAgD,IAEA9U,EAAA4T,OAAA5T,EAAA2K,aAAA3K,EAAAyT,SACAzT,EAAA4T,OAGA,QAAAqB,GAAAC,GACA,MAAA,YAGA,QAAAC,KACA,KAAAC,EAAAF,EAAAhwB,QAAA,CACA,GAAA2sB,GAAAqD,EAAAE,EAMA,OALAA,KAEApV,EAAA0K,QAAA,KACA1K,EAAA4T,OAAA,KAEA5T,EAAAyU,UAAA5C,GAAArO,KAAAuR,GAAA,MAAAI,GAGAL,GACA,IAAAxQ,GAAA,GAAAzf,OAAA,qCAEA,OADAmb,GAAA0T,WAAAjN,GAAApD,OAAAiB,GACAtE,EAAA0T,WAhBA,GAAA0B,GAAA,CAmBA,OAAAD,MAzCA,GAAAnV,GAAAxZ,IAEAiJ,IAAAolB,KACAA,GAAAA,GAGA,IAAAK,GAAA1uB,KAAA6uB,qBAAAR,GA0CAS,EAAA,OAAA9uB,KAAAktB,WAAAltB,KAAAktB,WAAA,MAAA,WACA,MAAAjN,IAAAnD,YACAmD,GAAAnD,SAqBA,OAnBA9c,MAAAktB,WAAA4B,EAAA9R,KAAA,WACA,GAAAqO,GAAAqD,EAAA,EAIA,OAHAlV,GAAA0K,QAAA,KACA1K,EAAA4T,OAAA,KAEA5T,EAAAyU,UAAA5C,GAAArO,KAAA,SAAAsO,GACA9R,EAAAwS,QAAAV,EAAAU,QACAsC,IACA9U,EAAA6T,+BACA7T,EAAA2T,YAAAsB,EAAAC,OAEA,MAAA,WACAJ,GACA,IAAAxQ,GAAA,GAAAzf,OAAA,qCAEA,OADAmb,GAAA0T,WAAAjN,GAAApD,OAAAiB,GACAtE,EAAA0T,aAGA5N,EAAAtf,KAAAktB,WAAA7N,EAAAE,GACAvf,KAAAktB,YAGAF,EAAA3sB,UAAA0uB,SAAA,SAAA1D,GACA,QAAAqB,GAAArB,IAGA2B,EAAA3sB,UAAAmuB,QAAA,SAAAQ,GACAlvB,EAAAE,KAAAgvB,IAGAhC,EAAA3sB,UAAAwuB,qBAAA,SAAAR,GAEA,IAAA,GADAK,MACAvwB,EAAA,EAAAwG,EAAA0pB,EAAA3vB,OAAAP,EAAAwG,EAAAxG,IAAA,CACA,GAAAktB,GAAAgD,EAAAlwB,EACA6B,MAAA+uB,SAAA1D,IACAqD,EAAA3tB,KAAAsqB,GAGA,MAAAqD,IAGA1B,EAAA3sB,UAAAgtB,6BAAA,WAKA,IAAA,GAAAlvB,GAAA,EAAAA,EAAAquB,GAAA9tB,OAAAP,IACA4sB,EAAA/qB,KAAAwsB,GAAAruB,KAIA6uB,EAAA3sB,UAAA4uB,eAAA,SAAA7K,GACA,MAAA,IAAA4I,GAAA5I,IAGA4I,KAOAkC,GAAA,GAAAlC,GAEApuB,GAAAJ,QAAA0wB,KAEA/Q,EAAA,SAAA,IAAA,oMC9uEA,QAAA3F,GAAAxZ,GACA,GAAAsE,GAAArE,OAAAoB,UAAA+D,SAAA3F,KAAAO,GAAAoO,MAAA+hB,GAAA,GAAA5rB,aAEA,OAAA,kBAAAqY,UAAA5c,YAAA4c,SAAA,UAEA,OAAA5c,EAAA,WAEAiF,KAAAjF,EAAA,YACAsE,EAgBA,QAAAoV,KACA,KAAA1Y,eAAA0Y,IAAA,MAAA,IAAAA,EACA1Y,MAAA2Y,SAzCA,GAaAwW,GAAA,qBAbAvwB,EAAAJ,QAAAga,GA0BAE,QAAAA,EAiCAA,EAAArY,UAAA4Y,GAAAT,EA6BAE,EAAArY,UAAA6Y,OAAA,SAAA5V,EAAAT,GACA,MAAA,KAAArD,UAAAd,OAAAsB,KAAA2Y,MAAArV,IACAtD,KAAA2Y,MAAArV,GAAAT,EACA7C,OAqBA0Y,EAAArY,UAAAwC,KAAA,SAAA7D,EAAAsE,GACA,GAAAA,IAAAkV,EAAAxZ,GAAA,OAAA,CACA,IAAA6D,GAAA7C,KAAA2Y,MAAArV,EAEA,IAAAT,GAAA,WAAA2V,EAAA3V,GACA,MAAAA,GAAAA,KAAA7D,EACA,IAAA6D,GAAA,aAAA2V,EAAA3V,GACA,MAAAA,GAAA7D,EAEA,MAAA,IAAAma,gBAAA,cAAA7V,EAAA,sFCnIA,SAAW6Q,SAAUmF,QA6CnB,QAAS8V,kBAAiBpuB,GACxB,MAAOyY,aACJ2L,QAAQ,qBAAsBpkB,GAC9Bgc,KAAK,SAAA/Z,GACJrB,QAAQytB,IAAI,oBAAqBpsB,KAElCqsB,MAAM,SAAAtoB,GACLpF,QAAQytB,IAAI,yBAA0BroB,KAO5C,QAASuoB,UAASnd,EAAMod,EAAMzV,GAC5B,GAAI0V,OAAA,EACJ,OAAO,YACL,GAAMnoB,GAAUtH,KACVP,EAAOD,UACPkwB,EAAQ,WACZD,EAAU,KACL1V,GACH3H,EAAKhB,MAAM9J,EAAS7H,IAGlBkwB,EAAU5V,IAAc0V,CAC9BG,cAAaH,GACbA,EAAUrU,WAAWsU,EAAOF,GACxBG,GACFvd,EAAKhB,MAAM9J,EAAS7H,IAoB1B,QAASowB,gBAAeC,GACtB,GAAMC,GAAMjoB,KAAKkoB,MAAMloB,KAAKmoB,SAAWH,EAAYpxB,OAGnD,OAFAsC,QAAOkvB,aAAeH,EACtBX,iBAAiBpuB,QACV+uB,EAGT,QAASI,kBAAiBL,GACxB,GACMI,GAAelvB,OAAOkvB,YAO5B,OALqB,KAAjBA,EACQJ,EAAYpxB,OAAS,EAErBwxB,EAAe,EAK7B,QAASE,cAAaN,GACpB,GACMI,GAAelvB,OAAOkvB,YAO5B,OALIA,IAAgBJ,EAAYpxB,OAAS,GAAKwxB,EAAe,EACjD,EAEAA,EAAe,EAM7B,QAASG,mBAAkBP,GACzB,MAAOA,GAAY9uB,OAAOkvB,cAG5B,QAASI,mBACP1uB,QAAQytB,IAAI,oBAEZkB,wBAAwBC,UAAUC,IAAI,UACtCzvB,OAAOkvB,aAAelvB,OAAO0vB,QACzBb,eAAec,UACfR,iBAAiBQ,UACrBvB,iBAAiBpuB,QAAQgc,KAAK,WAC5B1D,OAAOsX,SAASC,WAIpB,QAASC,eACPlvB,QAAQytB,IAAI;4BAEZ0B,oBAAoBP,UAAUC,IAAI,UAClCzvB,OAAOkvB,aAAelvB,OAAO0vB,QACzBb,eAAec,UACfP,aAAaO,UACjBvB,iBAAiBpuB,QAAQgc,KAAK,WAC5B1D,OAAOsX,SAASC,WAIpB,QAASG,iBACPpvB,QAAQytB,IAAI,mBACZruB,OAAO0vB,SAAW1vB,OAAO0vB,QACzBO,wBAAwBT,UAAUU,OAAO,UACzCX,wBAAwBtV,WAAWuV,UAAUU,OAAO,UACpD9B,iBAAiBpuB,QAGnB,QAASmwB,aAAYC,GACnBC,eAAiBD,EAEjBE,UAAUC,UAAYH,EAAWI,OAE7BJ,EAAWK,QACbC,OAAO1vB,MAAQovB,EAAWK,OAG5BE,UAAU,MAAM,GAIlB,QAASC,aAAYC,EAAYC,IAClB,IAATA,GACFC,WAAWV,eAAe1Y,OAE5BqZ,iBAAiBH,GAGnB,QAASE,YAAWpZ,GAClB,GAAIA,EAAO,CACT,GAAMsZ,GAAWtZ,EACdvS,IAAI,SAAAvD,GACH,MAAA,sIAEiCA,EAAKtC,KAFtC,mCAKDgG,KAAK,GACR2rB,aAAYtd,UAAYqd,GAI5B,QAASD,kBAAiBG,GACxB,IAAKA,EACH,KAAM,IAAI9zB,OAAM,4BAGlB,IAAI+zB,IAAY,CAChBD,GAAahzB,QAAQ,SAAAkzB,IACA,IAAfA,IACFD,GAAY,QAGG7yB,MAAMd,KAAKyzB,YAAYI,iBAAiB,gBACnDnzB,QAAQ,SAACozB,EAAcC,IACF,IAAvBL,EAAaK,IACfD,EAAa3d,UAAY,aACzB2d,EAAa/B,UAAUiC,OAAO,QAC9BF,EAAa/B,UAAUC,IAAI,UAE3B8B,EAAa3d,UAAY,aACzB2d,EAAa/B,UAAUiC,OAAO,QAC9BF,EAAa/B,UAAUC,IAAI,YAIb,IAAd2B,GACFM,YAAYnB,UAAY,OACxBmB,YAAYlC,UAAUiC,OAAO,QAC7BC,YAAYlC,UAAUC,IAAI,UAE1BiC,YAAYnB,UAAY,OACxBmB,YAAYlC,UAAUiC,OAAO,QAC7BC,YAAYlC,UAAUC,IAAI,SAI9B,QAASkC,kBAAiBC,GAExB,GAAIC,GAAQ,EACG,QAAXD,IACFC,EAAA,yDAEc9c,KAAKC,UAAU4c,EAAOlwB,UAFpC,qBAGYqT,KAAKC,UAAU4c,EAAO7vB,QAHlC,kBAQF+vB,gBAAgBle,UAAYie,EAG9B,QAASE,iBAAgBH,EAAQld,GAE/B,GAAImd,GAAQ,EACRD,QAA6B3uB,KAAnB2uB,EAAOjzB,QACnBkzB,EAAA,6DAEkB9c,KAAKC,UAAU4c,EAAOjzB,SAFxC,iBAIS+V,IACTmd,EAAA,uDAEY9c,KAAKC,UAAUN,GAF3B,kBAMFsd,cAAcpe,UAAYie,EAM5B,QAASlB,WAAUG,GAEjBY,YAAYlC,UAAUU,OAAO,UAE7B,IAAMxb,GAASud,UAAUvB,OAAO1vB,OAE1BkxB,EAASC,SAASzd,EAExBgd,aAAYlC,UAAUU,OAAO,WAE7BU,YAAYsB,EAAQpB,GAGtB,QAASmB,WAAU30B,MACjB,GAAI80B,QAAQ,CACZ,KACEA,MAAQC,KAAA,eAAoB/0B,KAApB,QACRy0B,gBAAgB,KAAMK,OACtB,MAAOpsB,GACP+rB,gBAAgB/rB,GAElB,MAAOosB,OAGT,QAASD,UAASzd,GAchB,MAZS2b,gBAAe1Y,MAAMvS,IAAI,SAAAvD,GAChC,GAAIywB,IAAc,CAClB,KACM5d,IACF4d,EAAczwB,EAAKA,KAAK6S,IAE1Bid,iBAAiB,MACjB,MAAO3rB,GACP2rB,iBAAiB3rB,GAEnB,MAAOssB,KAMX,QAASC,SAAQvyB,GAqBf,QAASwyB,GAAW91B,IAGK,IAAnBsD,EAAO0vB,SAAmC,KAAdhzB,EAAE+1B,SAAkB/1B,EAAEg2B,WAAah2B,EAAEi2B,SAAWj2B,EAAEk2B,SAEhFtD,kBACuB,KAAd5yB,EAAE+1B,SAAmB/1B,EAAEg2B,WAAah2B,EAAEi2B,UAAWj2B,EAAEk2B,SAI5D9C,cA9BJlvB,QAAQytB,IAAI,iBAGW,IAAnBruB,EAAO0vB,UACTO,wBAAwBT,UAAUC,IAAI,UACtCF,wBAAwBtV,WAAWuV,UAAUC,IAAI,UAOnD,IAAMoD,GAA2BtE,SAAS,SAAA7xB,IAEG,IAAvCo2B,eAAex0B,QAAQ5B,EAAE+1B,UAE3B9B,aAED,IAoBHD,QAAOqC,iBAAiB,UAAWF,GACnC1f,SAAS4f,iBAAiB,UAAWP,GACrCvC,wBAAwB8C,iBAAiB,QAAS/C,eAClDT,wBAAwBwD,iBAAiB,QAASzD,iBAClDS,oBAAoBgD,iBAAiB,QAASjD,aAK9CK,YADiBd,kBAAkBM,WAGnCgB,WAAU,GApWZ,GAAMlY,aAAcvb,QAAQ,eAItByyB,SAAWzyB,QAAQ,yBAMrBmzB,mBAAA,GAGEyC,gBACJ,EACA,GACA,GACA,GACA,IAGE9yB,QACF0vB,SAAS,EACTsD,OAAO,EACP9D,aAAc,EAIhBzW,aACGmL,QAAQ,sBACR5H,KAAK,SAAA/Z,GACJrB,QAAQytB,IAAI,mBAAoBpsB,GAC5BA,IACFjC,OAASiC,GAEXswB,QAAQvyB,UAETsuB,MAAM,SAAAtoB,GACLpF,QAAQytB,IAAI,mBAAoBroB,GAChCusB,QAAQvyB,SAyCZ,IAAMswB,WAAYnd,SAAS8f,eAAe,WACpCvC,OAASvd,SAAS8f,eAAe,QACjC/B,YAAc/d,SAAS8f,eAAe,cACtCvB,YAAcve,SAAS8f,eAAe,cACtCjB,cAAgB7e,SAAS8f,eAAe,eACxCnB,gBAAkB3e,SAAS8f,eAAe,iBAC1ChD,wBAA0B9c,SAAS8f,eAAe,oBAClD1D,wBAA0Bpc,SAAS8f,eAAe,gBAClDlD,oBAAsB5c,SAAS8f,eAAe,iBA8QnD9f,SAAUmF,sFCzWb,IAAMjY,GAASnD,EAAQ,QAAQmD,MAE/BzC,GAAOJ,UAEH+B,KAAM,eACN2zB,KAAM,GACN1C,OAAQ,gEACRC,MAAA,qCACA0C,OAAA,mEAEAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAyDzR,KAAlD5C,EAAOsJ,UAAU+K,GAAS,QAAS,cAI5CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,gCACN2zB,KAAM,GACN1C,OAAQ,sCACRC,MAAA,wCACA0C,OAAA,sEAEAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAA6CzR,KAAtC5C,EAAOsJ,UAAU+K,EAAQ,YAIlCnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOmL,SAASkJ,QAM7BnV,KAAM,+BACN2zB,KAAM,GACN1C,OAAQ,qCACRC,MAAA,kDACA0C,OAAA,gGAEAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAA8CzR,KAAvC5C,EAAOsJ,UAAU+K,EAAQ,aAIlCnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOmL,SAASkJ,QAM7BnV,KAAM,iCACN2zB,KAAM,GACN1C,OAAQ,uCACRC,MAAA,wCACA0C,OAAA,sEAEAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAA8CzR,KAAvC5C,EAAOsJ,UAAU+K,EAAQ,aAIlCnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOmL,SAASkJ,QAM7BnV,KAAM,kBACN2zB,KAAM,GACN1C,OAAQ,wHACRC,MAAA,wCACA0C,OAAA,oNAMAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAA2DzR,KAApD5C,EAAOsJ,UAAU+K,GAAS,SAAU,eAI7CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,eACN2zB,KAAM,GACN1C,OAAA,qEACAC,MAAA,wCACA0C,OAAA,wGAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAoEzR,KAA5D5C,EAAOsJ,UAAU+K,GAAS,QAAS,SAAU,cAIvDnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,cACN2zB,KAAM,GACN1C,OAAA,0EACAC,MAAA,kDACA0C,OAAA,yGAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAyDzR,KAAlD5C,EAAOsJ,UAAU+K,GAAS,QAAS,cAI5CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,gBACN2zB,KAAM,GACN1C,OAAA,2EACAC,MAAA,kDACA0C,OAAA,2GAGAxb,QAEIpY,KAAM,yBACNsC,KAFF,SAEO6S,GACH,WAA0DzR,KAAnD5C,EAAOsJ,UAAU+K,GAAS,SAAU,cAI7CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,kBACN2zB,KAAM,GACN1C,OAAA,2EACAC,MAAA,kDACA0C,OAAA,yHAGAxb,QAEIpY,KAAM,yBACNsC,KAFF,SAEO6S,GACH,WAMSzR,KALP5C,EAAOsJ,UAAU+K,GACf,aACA,QACA,SACA,cAMNnV,KAAM,uBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,kBACN2zB,KAAM,GACN1C,OAAA,6CACAC,MAAA,sDACA0C,OAAA,kIAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAuCzR,KAAhC5C,EAAOsJ,UAAU+K,EAAQ,MAIlCnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOqL,SAASgJ,QAM7BnV,KAAM,iBACN2zB,KAAM,GACN1C,OAAA,oFACAC,MAAA,oFACA0C,OAAA,gMAIAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAMSzR,KALP5C,EAAOsJ,UAAU+K,GACf,aACA,SACA,OACA,aAMNnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,eACN2zB,KAAM,GACN1C,OAAA,kGACAC,MAAA,6CACA0C,OAAA,yHAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAyDzR,KAAlD5C,EAAOsJ,UAAU+K,EAAQ,wBAIlCnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOmL,SAASkJ,QAM7BnV,KAAM,gBACN2zB,KAAM,GACN1C,OAAA,8EACAC,MAAA,gEACA0C,OAAA,4IAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAyDzR,KAAlD5C,EAAOsJ,UAAU+K,GAAS,SAAU,aAI7CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,QAMrCnV,KAAM,kBACN2zB,KAAM,GACN1C,OAAA,iEACAC,MAAA,gEACA0C,OAAA,0IAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAMSzR,KALP5C,EAAOsJ,UAAU+K,GACf,SACA,QACA,SACA,kBAMNnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,MAIjCnV,KAAA,yBACAsC,KAFF,SAEO6S,GACH,WAAiDzR,KAA1C5C,EAAOsJ,UAAU+K,EAAO,GAAI,eAMzCnV,KAAM,eACN2zB,KAAM,GACN1C,OAAA,2DACAC,MAAA,gEACA0C,OAAA,mJAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAMSzR,KALP5C,EAAOsJ,UAAU+K,GACf,SACA,QACA,SACA,kBAMNnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,MAIjCnV,KAAA,yBACAsC,KAFF,SAEO6S,GACH,WAAiDzR,KAA1C5C,EAAOsJ,UAAU+K,EAAO,GAAI,eAMzCnV,KAAM,sBACN2zB,KAAM,GACN1C,OAAA,iGACAC,MAAA,0DACA0C,OAAA,uKAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAuCzR,KAAhC5C,EAAOsJ,UAAU+K,EAAQ,MAIlCnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOqL,SAASgJ,QAM7BnV,KAAM,iBACN2zB,KAAM,GACN1C,OAAA,oFACAC,MAAA,gDACA0C,OAAA,4IAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAiDzR,KAA1C5C,EAAOsJ,UAAU+K,GAAS,EAAG,GAAI,QAI1CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,MAIjCnV,KAAA,kBACAsC,KAFF,SAEO6S,GACH,WAA0CzR,KAAnC5C,EAAOsJ,UAAU+K,EAAO,GAAI,QAMzCnV,KAAM,cACN2zB,KAAM,GACN1C,OAAA,2FACAC,MAAA,oCACA0C,OAAA,8HAGAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAAiDzR,KAA1C5C,EAAOsJ,UAAU+K,GAAS,EAAG,GAAI,QAI1CnV,KAAM,mBACNsC,KAFF,SAEO6S,GACH,WAAkCzR,KAA3B5C,EAAO4H,QAAQyM,MAIxBnV,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAsCzR,KAA/B5C,EAAOyM,SAAS4H,EAAQ,MAIjCnV,KAAA,kBACAsC,KAFF,SAEO6S,GACH,WAA0CzR,KAAnC5C,EAAOsJ,UAAU+K,EAAO,GAAI,MAIrCnV,KAAA,kBACAsC,KAFF,SAEO6S,GACH,WAA2DzR,KAApD5C,EAAOsJ,UAAU+K,EAAOA,EAAOhX,OAAS,GAAI,SAMzD6B,KAAM,gBACN2zB,KAAM,GACN1C,OAAA,+FACAC,MAAA,4LAUA0C,OAAA,gPAUAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAGOzR,KAHA5C,EAAOsJ,UAAU+K,GACtB0e,aAAa,EACbC,gBAAgB,OAKpB9zB,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOgL,SAASqJ,MAIzBnV,KAAM,qBACNsC,KAFF,SAEO6S,GACH,WAAmDzR,KAA5C5C,EAAOyM,SAAS7O,OAAOC,KAAKwW,GAAS,MAI9CnV,KAAA,sBACAsC,KAFF,SAEO6S,GACH,WAA6CzR,KAAtC5C,EAAOoK,OAAOiK,EAAO0e,gBAI9B7zB,KAAA,wBACAsC,KAFF,SAEO6S,GACH,WAAiDzR,KAA1C5C,EAAOsK,QAAQ+J,EAAO2e,qBAMnC9zB,KAAM,eACN2zB,KAAM,GACN1C,OAAA,8FACAC,MAAA,2LAUA0C,OAAA,4OAUAxb,QAEIpY,KAAM,iBACNsC,KAFF,SAEO6S,GACH,WAGOzR,KAHA5C,EAAOsJ,UAAU+K,GACtB0e,aAAa,EACbC,gBAAgB,OAKpB9zB,KAAM,oBACNsC,KAFF,SAEO6S,GACH,WAAmCzR,KAA5B5C,EAAOgL,SAASqJ,MAIzBnV,KAAM,qBACNsC,KAFF,SAEO6S,GACH,WAAmDzR,KAA5C5C,EAAOyM,SAAS7O,OAAOC,KAAKwW,GAAS,MAI9CnV,KAAA,uBACAsC,KAFF,SAEO6S,GACH,WAA8CzR,KAAvC5C,EAAOsK,QAAQ+J,EAAO0e,gBAI/B7zB,KAAA,uBACAsC,KAFF,SAEO6S,GACH,WAAgDzR,KAAzC5C,EAAOoK,OAAOiK,EAAO2e","file":"bundle.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\n * MIT Licensed\n */\n\n/*!\n * Return a function that will copy properties from\n * one object to another excluding any originally\n * listed. Returned function will create a new `{}`.\n *\n * @param {String} excluded properties ...\n * @return {Function}\n */\n\nfunction exclude () {\n var excludes = [].slice.call(arguments);\n\n function excludeProps (res, obj) {\n Object.keys(obj).forEach(function (key) {\n if (!~excludes.indexOf(key)) res[key] = obj[key];\n });\n }\n\n return function extendExclude () {\n var args = [].slice.call(arguments)\n , i = 0\n , res = {};\n\n for (; i < args.length; i++) {\n excludeProps(res, args[i]);\n }\n\n return res;\n };\n};\n\n/*!\n * Primary Exports\n */\n\nmodule.exports = AssertionError;\n\n/**\n * ### AssertionError\n *\n * An extension of the JavaScript `Error` constructor for\n * assertion and validation scenarios.\n *\n * @param {String} message\n * @param {Object} properties to include (optional)\n * @param {callee} start stack function (optional)\n */\n\nfunction AssertionError (message, _props, ssf) {\n var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')\n , props = extend(_props || {});\n\n // default values\n this.message = message || 'Unspecified AssertionError';\n this.showDiff = false;\n\n // copy from properties\n for (var key in props) {\n this[key] = props[key];\n }\n\n // capture stack trace\n ssf = ssf || arguments.callee;\n if (ssf && Error.captureStackTrace) {\n Error.captureStackTrace(this, ssf);\n } else {\n try {\n throw new Error();\n } catch(e) {\n this.stack = e.stack;\n }\n }\n}\n\n/*!\n * Inherit from Error.prototype\n */\n\nAssertionError.prototype = Object.create(Error.prototype);\n\n/*!\n * Statically set name\n */\n\nAssertionError.prototype.name = 'AssertionError';\n\n/*!\n * Ensure correct constructor\n */\n\nAssertionError.prototype.constructor = AssertionError;\n\n/**\n * Allow errors to be converted to JSON for static transfer.\n *\n * @param {Boolean} include stack (default: `true`)\n * @return {Object} object that can be `JSON.stringify`\n */\n\nAssertionError.prototype.toJSON = function (stack) {\n var extend = exclude('constructor', 'toJSON', 'stack')\n , props = extend({ name: this.name }, this);\n\n // include stack if exists and not turned off\n if (false !== stack && this.stack) {\n props.stack = this.stack;\n }\n\n return props;\n};\n","module.exports = require('./lib/chai');\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar used = []\n , exports = module.exports = {};\n\n/*!\n * Chai version\n */\n\nexports.version = '3.5.0';\n\n/*!\n * Assertion Error\n */\n\nexports.AssertionError = require('assertion-error');\n\n/*!\n * Utils for plugins (not exported)\n */\n\nvar util = require('./chai/utils');\n\n/**\n * # .use(function)\n *\n * Provides a way to extend the internals of Chai\n *\n * @param {Function}\n * @returns {this} for chaining\n * @api public\n */\n\nexports.use = function (fn) {\n if (!~used.indexOf(fn)) {\n fn(this, util);\n used.push(fn);\n }\n\n return this;\n};\n\n/*!\n * Utility Functions\n */\n\nexports.util = util;\n\n/*!\n * Configuration\n */\n\nvar config = require('./chai/config');\nexports.config = config;\n\n/*!\n * Primary `Assertion` prototype\n */\n\nvar assertion = require('./chai/assertion');\nexports.use(assertion);\n\n/*!\n * Core Assertions\n */\n\nvar core = require('./chai/core/assertions');\nexports.use(core);\n\n/*!\n * Expect interface\n */\n\nvar expect = require('./chai/interface/expect');\nexports.use(expect);\n\n/*!\n * Should interface\n */\n\nvar should = require('./chai/interface/should');\nexports.use(should);\n\n/*!\n * Assert interface\n */\n\nvar assert = require('./chai/interface/assert');\nexports.use(assert);\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('./config');\n\nmodule.exports = function (_chai, util) {\n /*!\n * Module dependencies.\n */\n\n var AssertionError = _chai.AssertionError\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n _chai.Assertion = Assertion;\n\n /*!\n * Assertion Constructor\n *\n * Creates object for chaining.\n *\n * @api private\n */\n\n function Assertion (obj, msg, stack) {\n flag(this, 'ssfi', stack || arguments.callee);\n flag(this, 'object', obj);\n flag(this, 'message', msg);\n }\n\n Object.defineProperty(Assertion, 'includeStack', {\n get: function() {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n return config.includeStack;\n },\n set: function(value) {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n config.includeStack = value;\n }\n });\n\n Object.defineProperty(Assertion, 'showDiff', {\n get: function() {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n return config.showDiff;\n },\n set: function(value) {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n config.showDiff = value;\n }\n });\n\n Assertion.addProperty = function (name, fn) {\n util.addProperty(this.prototype, name, fn);\n };\n\n Assertion.addMethod = function (name, fn) {\n util.addMethod(this.prototype, name, fn);\n };\n\n Assertion.addChainableMethod = function (name, fn, chainingBehavior) {\n util.addChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n Assertion.overwriteProperty = function (name, fn) {\n util.overwriteProperty(this.prototype, name, fn);\n };\n\n Assertion.overwriteMethod = function (name, fn) {\n util.overwriteMethod(this.prototype, name, fn);\n };\n\n Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {\n util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n /**\n * ### .assert(expression, message, negateMessage, expected, actual, showDiff)\n *\n * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.\n *\n * @name assert\n * @param {Philosophical} expression to be tested\n * @param {String|Function} message or function that returns message to display if expression fails\n * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails\n * @param {Mixed} expected value (remember to check for negation)\n * @param {Mixed} actual (optional) will default to `this.obj`\n * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails\n * @api private\n */\n\n Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {\n var ok = util.test(this, arguments);\n if (true !== showDiff) showDiff = false;\n if (true !== config.showDiff) showDiff = false;\n\n if (!ok) {\n var msg = util.getMessage(this, arguments)\n , actual = util.getActual(this, arguments);\n throw new AssertionError(msg, {\n actual: actual\n , expected: expected\n , showDiff: showDiff\n }, (config.includeStack) ? this.assert : flag(this, 'ssfi'));\n }\n };\n\n /*!\n * ### ._obj\n *\n * Quick reference to stored `actual` value for plugin developers.\n *\n * @api private\n */\n\n Object.defineProperty(Assertion.prototype, '_obj',\n { get: function () {\n return flag(this, 'object');\n }\n , set: function (val) {\n flag(this, 'object', val);\n }\n });\n};\n","module.exports = {\n\n /**\n * ### config.includeStack\n *\n * User configurable property, influences whether stack trace\n * is included in Assertion error message. Default of false\n * suppresses stack trace in the error message.\n *\n * chai.config.includeStack = true; // enable stack on error\n *\n * @param {Boolean}\n * @api public\n */\n\n includeStack: false,\n\n /**\n * ### config.showDiff\n *\n * User configurable property, influences whether or not\n * the `showDiff` flag should be included in the thrown\n * AssertionErrors. `false` will always be `false`; `true`\n * will be true when the assertion has requested a diff\n * be shown.\n *\n * @param {Boolean}\n * @api public\n */\n\n showDiff: true,\n\n /**\n * ### config.truncateThreshold\n *\n * User configurable property, sets length threshold for actual and\n * expected values in assertion errors. If this threshold is exceeded, for\n * example for large data structures, the value is replaced with something\n * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.\n *\n * Set it to zero if you want to disable truncating altogether.\n *\n * This is especially userful when doing assertions on arrays: having this\n * set to a reasonable large value makes the failure messages readily\n * inspectable.\n *\n * chai.config.truncateThreshold = 0; // disable truncating\n *\n * @param {Number}\n * @api public\n */\n\n truncateThreshold: 40\n\n};\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, _) {\n var Assertion = chai.Assertion\n , toString = Object.prototype.toString\n , flag = _.flag;\n\n /**\n * ### Language Chains\n *\n * The following are provided as chainable getters to\n * improve the readability of your assertions. They\n * do not provide testing capabilities unless they\n * have been overwritten by a plugin.\n *\n * **Chains**\n *\n * - to\n * - be\n * - been\n * - is\n * - that\n * - which\n * - and\n * - has\n * - have\n * - with\n * - at\n * - of\n * - same\n *\n * @name language chains\n * @namespace BDD\n * @api public\n */\n\n [ 'to', 'be', 'been'\n , 'is', 'and', 'has', 'have'\n , 'with', 'that', 'which', 'at'\n , 'of', 'same' ].forEach(function (chain) {\n Assertion.addProperty(chain, function () {\n return this;\n });\n });\n\n /**\n * ### .not\n *\n * Negates any of assertions following in the chain.\n *\n * expect(foo).to.not.equal('bar');\n * expect(goodFn).to.not.throw(Error);\n * expect({ foo: 'baz' }).to.have.property('foo')\n * .and.not.equal('bar');\n *\n * @name not\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('not', function () {\n flag(this, 'negate', true);\n });\n\n /**\n * ### .deep\n *\n * Sets the `deep` flag, later used by the `equal` and\n * `property` assertions.\n *\n * expect(foo).to.deep.equal({ bar: 'baz' });\n * expect({ foo: { bar: { baz: 'quux' } } })\n * .to.have.deep.property('foo.bar.baz', 'quux');\n *\n * `.deep.property` special characters can be escaped\n * by adding two slashes before the `.` or `[]`.\n *\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name deep\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('deep', function () {\n flag(this, 'deep', true);\n });\n\n /**\n * ### .any\n *\n * Sets the `any` flag, (opposite of the `all` flag)\n * later used in the `keys` assertion.\n *\n * expect(foo).to.have.any.keys('bar', 'baz');\n *\n * @name any\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('any', function () {\n flag(this, 'any', true);\n flag(this, 'all', false)\n });\n\n\n /**\n * ### .all\n *\n * Sets the `all` flag (opposite of the `any` flag)\n * later used by the `keys` assertion.\n *\n * expect(foo).to.have.all.keys('bar', 'baz');\n *\n * @name all\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('all', function () {\n flag(this, 'all', true);\n flag(this, 'any', false);\n });\n\n /**\n * ### .a(type)\n *\n * The `a` and `an` assertions are aliases that can be\n * used either as language chains or to assert a value's\n * type.\n *\n * // typeof\n * expect('test').to.be.a('string');\n * expect({ foo: 'bar' }).to.be.an('object');\n * expect(null).to.be.a('null');\n * expect(undefined).to.be.an('undefined');\n * expect(new Error).to.be.an('error');\n * expect(new Promise).to.be.a('promise');\n * expect(new Float32Array()).to.be.a('float32array');\n * expect(Symbol()).to.be.a('symbol');\n *\n * // es6 overrides\n * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo');\n *\n * // language chain\n * expect(foo).to.be.an.instanceof(Foo);\n *\n * @name a\n * @alias an\n * @param {String} type\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function an (type, msg) {\n if (msg) flag(this, 'message', msg);\n type = type.toLowerCase();\n var obj = flag(this, 'object')\n , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';\n\n this.assert(\n type === _.type(obj)\n , 'expected #{this} to be ' + article + type\n , 'expected #{this} not to be ' + article + type\n );\n }\n\n Assertion.addChainableMethod('an', an);\n Assertion.addChainableMethod('a', an);\n\n /**\n * ### .include(value)\n *\n * The `include` and `contain` assertions can be used as either property\n * based language chains or as methods to assert the inclusion of an object\n * in an array or a substring in a string. When used as language chains,\n * they toggle the `contains` flag for the `keys` assertion.\n *\n * expect([1,2,3]).to.include(2);\n * expect('foobar').to.contain('foo');\n * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');\n *\n * @name include\n * @alias contain\n * @alias includes\n * @alias contains\n * @param {Object|String|Number} obj\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function includeChainingBehavior () {\n flag(this, 'contains', true);\n }\n\n function include (val, msg) {\n _.expectTypes(this, ['array', 'object', 'string']);\n\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var expected = false;\n\n if (_.type(obj) === 'array' && _.type(val) === 'object') {\n for (var i in obj) {\n if (_.eql(obj[i], val)) {\n expected = true;\n break;\n }\n }\n } else if (_.type(val) === 'object') {\n if (!flag(this, 'negate')) {\n for (var k in val) new Assertion(obj).property(k, val[k]);\n return;\n }\n var subset = {};\n for (var k in val) subset[k] = obj[k];\n expected = _.eql(subset, val);\n } else {\n expected = (obj != undefined) && ~obj.indexOf(val);\n }\n this.assert(\n expected\n , 'expected #{this} to include ' + _.inspect(val)\n , 'expected #{this} to not include ' + _.inspect(val));\n }\n\n Assertion.addChainableMethod('include', include, includeChainingBehavior);\n Assertion.addChainableMethod('contain', include, includeChainingBehavior);\n Assertion.addChainableMethod('contains', include, includeChainingBehavior);\n Assertion.addChainableMethod('includes', include, includeChainingBehavior);\n\n /**\n * ### .ok\n *\n * Asserts that the target is truthy.\n *\n * expect('everything').to.be.ok;\n * expect(1).to.be.ok;\n * expect(false).to.not.be.ok;\n * expect(undefined).to.not.be.ok;\n * expect(null).to.not.be.ok;\n *\n * @name ok\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('ok', function () {\n this.assert(\n flag(this, 'object')\n , 'expected #{this} to be truthy'\n , 'expected #{this} to be falsy');\n });\n\n /**\n * ### .true\n *\n * Asserts that the target is `true`.\n *\n * expect(true).to.be.true;\n * expect(1).to.not.be.true;\n *\n * @name true\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('true', function () {\n this.assert(\n true === flag(this, 'object')\n , 'expected #{this} to be true'\n , 'expected #{this} to be false'\n , this.negate ? false : true\n );\n });\n\n /**\n * ### .false\n *\n * Asserts that the target is `false`.\n *\n * expect(false).to.be.false;\n * expect(0).to.not.be.false;\n *\n * @name false\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('false', function () {\n this.assert(\n false === flag(this, 'object')\n , 'expected #{this} to be false'\n , 'expected #{this} to be true'\n , this.negate ? true : false\n );\n });\n\n /**\n * ### .null\n *\n * Asserts that the target is `null`.\n *\n * expect(null).to.be.null;\n * expect(undefined).to.not.be.null;\n *\n * @name null\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('null', function () {\n this.assert(\n null === flag(this, 'object')\n , 'expected #{this} to be null'\n , 'expected #{this} not to be null'\n );\n });\n\n /**\n * ### .undefined\n *\n * Asserts that the target is `undefined`.\n *\n * expect(undefined).to.be.undefined;\n * expect(null).to.not.be.undefined;\n *\n * @name undefined\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('undefined', function () {\n this.assert(\n undefined === flag(this, 'object')\n , 'expected #{this} to be undefined'\n , 'expected #{this} not to be undefined'\n );\n });\n\n /**\n * ### .NaN\n * Asserts that the target is `NaN`.\n *\n * expect('foo').to.be.NaN;\n * expect(4).not.to.be.NaN;\n *\n * @name NaN\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('NaN', function () {\n this.assert(\n isNaN(flag(this, 'object'))\n , 'expected #{this} to be NaN'\n , 'expected #{this} not to be NaN'\n );\n });\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi'\n * , bar = null\n * , baz;\n *\n * expect(foo).to.exist;\n * expect(bar).to.not.exist;\n * expect(baz).to.not.exist;\n *\n * @name exist\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('exist', function () {\n this.assert(\n null != flag(this, 'object')\n , 'expected #{this} to exist'\n , 'expected #{this} to not exist'\n );\n });\n\n\n /**\n * ### .empty\n *\n * Asserts that the target's length is `0`. For arrays and strings, it checks\n * the `length` property. For objects, it gets the count of\n * enumerable keys.\n *\n * expect([]).to.be.empty;\n * expect('').to.be.empty;\n * expect({}).to.be.empty;\n *\n * @name empty\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('empty', function () {\n var obj = flag(this, 'object')\n , expected = obj;\n\n if (Array.isArray(obj) || 'string' === typeof object) {\n expected = obj.length;\n } else if (typeof obj === 'object') {\n expected = Object.keys(obj).length;\n }\n\n this.assert(\n !expected\n , 'expected #{this} to be empty'\n , 'expected #{this} not to be empty'\n );\n });\n\n /**\n * ### .arguments\n *\n * Asserts that the target is an arguments object.\n *\n * function test () {\n * expect(arguments).to.be.arguments;\n * }\n *\n * @name arguments\n * @alias Arguments\n * @namespace BDD\n * @api public\n */\n\n function checkArguments () {\n var obj = flag(this, 'object')\n , type = Object.prototype.toString.call(obj);\n this.assert(\n '[object Arguments]' === type\n , 'expected #{this} to be arguments but got ' + type\n , 'expected #{this} to not be arguments'\n );\n }\n\n Assertion.addProperty('arguments', checkArguments);\n Assertion.addProperty('Arguments', checkArguments);\n\n /**\n * ### .equal(value)\n *\n * Asserts that the target is strictly equal (`===`) to `value`.\n * Alternately, if the `deep` flag is set, asserts that\n * the target is deeply equal to `value`.\n *\n * expect('hello').to.equal('hello');\n * expect(42).to.equal(42);\n * expect(1).to.not.equal(true);\n * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });\n * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });\n *\n * @name equal\n * @alias equals\n * @alias eq\n * @alias deep.equal\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEqual (val, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'deep')) {\n return this.eql(val);\n } else {\n this.assert(\n val === obj\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{exp}'\n , val\n , this._obj\n , true\n );\n }\n }\n\n Assertion.addMethod('equal', assertEqual);\n Assertion.addMethod('equals', assertEqual);\n Assertion.addMethod('eq', assertEqual);\n\n /**\n * ### .eql(value)\n *\n * Asserts that the target is deeply equal to `value`.\n *\n * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });\n * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);\n *\n * @name eql\n * @alias eqls\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEql(obj, msg) {\n if (msg) flag(this, 'message', msg);\n this.assert(\n _.eql(obj, flag(this, 'object'))\n , 'expected #{this} to deeply equal #{exp}'\n , 'expected #{this} to not deeply equal #{exp}'\n , obj\n , this._obj\n , true\n );\n }\n\n Assertion.addMethod('eql', assertEql);\n Assertion.addMethod('eqls', assertEql);\n\n /**\n * ### .above(value)\n *\n * Asserts that the target is greater than `value`.\n *\n * expect(10).to.be.above(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n *\n * @name above\n * @alias gt\n * @alias greaterThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertAbove (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len > n\n , 'expected #{this} to have a length above #{exp} but got #{act}'\n , 'expected #{this} to not have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj > n\n , 'expected #{this} to be above ' + n\n , 'expected #{this} to be at most ' + n\n );\n }\n }\n\n Assertion.addMethod('above', assertAbove);\n Assertion.addMethod('gt', assertAbove);\n Assertion.addMethod('greaterThan', assertAbove);\n\n /**\n * ### .least(value)\n *\n * Asserts that the target is greater than or equal to `value`.\n *\n * expect(10).to.be.at.least(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.least(2);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);\n *\n * @name least\n * @alias gte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLeast (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= n\n , 'expected #{this} to have a length at least #{exp} but got #{act}'\n , 'expected #{this} to have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj >= n\n , 'expected #{this} to be at least ' + n\n , 'expected #{this} to be below ' + n\n );\n }\n }\n\n Assertion.addMethod('least', assertLeast);\n Assertion.addMethod('gte', assertLeast);\n\n /**\n * ### .below(value)\n *\n * Asserts that the target is less than `value`.\n *\n * expect(5).to.be.below(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n *\n * @name below\n * @alias lt\n * @alias lessThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertBelow (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len < n\n , 'expected #{this} to have a length below #{exp} but got #{act}'\n , 'expected #{this} to not have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj < n\n , 'expected #{this} to be below ' + n\n , 'expected #{this} to be at least ' + n\n );\n }\n }\n\n Assertion.addMethod('below', assertBelow);\n Assertion.addMethod('lt', assertBelow);\n Assertion.addMethod('lessThan', assertBelow);\n\n /**\n * ### .most(value)\n *\n * Asserts that the target is less than or equal to `value`.\n *\n * expect(5).to.be.at.most(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.most(4);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);\n *\n * @name most\n * @alias lte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertMost (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len <= n\n , 'expected #{this} to have a length at most #{exp} but got #{act}'\n , 'expected #{this} to have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj <= n\n , 'expected #{this} to be at most ' + n\n , 'expected #{this} to be above ' + n\n );\n }\n }\n\n Assertion.addMethod('most', assertMost);\n Assertion.addMethod('lte', assertMost);\n\n /**\n * ### .within(start, finish)\n *\n * Asserts that the target is within a range.\n *\n * expect(7).to.be.within(5,10);\n *\n * Can also be used in conjunction with `length` to\n * assert a length range. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * @name within\n * @param {Number} start lowerbound inclusive\n * @param {Number} finish upperbound inclusive\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('within', function (start, finish, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , range = start + '..' + finish;\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= start && len <= finish\n , 'expected #{this} to have a length within ' + range\n , 'expected #{this} to not have a length within ' + range\n );\n } else {\n this.assert(\n obj >= start && obj <= finish\n , 'expected #{this} to be within ' + range\n , 'expected #{this} to not be within ' + range\n );\n }\n });\n\n /**\n * ### .instanceof(constructor)\n *\n * Asserts that the target is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , Chai = new Tea('chai');\n *\n * expect(Chai).to.be.an.instanceof(Tea);\n * expect([ 1, 2, 3 ]).to.be.instanceof(Array);\n *\n * @name instanceof\n * @param {Constructor} constructor\n * @param {String} message _optional_\n * @alias instanceOf\n * @namespace BDD\n * @api public\n */\n\n function assertInstanceOf (constructor, msg) {\n if (msg) flag(this, 'message', msg);\n var name = _.getName(constructor);\n this.assert(\n flag(this, 'object') instanceof constructor\n , 'expected #{this} to be an instance of ' + name\n , 'expected #{this} to not be an instance of ' + name\n );\n };\n\n Assertion.addMethod('instanceof', assertInstanceOf);\n Assertion.addMethod('instanceOf', assertInstanceOf);\n\n /**\n * ### .property(name, [value])\n *\n * Asserts that the target has a property `name`, optionally asserting that\n * the value of that property is strictly equal to `value`.\n * If the `deep` flag is set, you can use dot- and bracket-notation for deep\n * references into objects and arrays.\n *\n * // simple referencing\n * var obj = { foo: 'bar' };\n * expect(obj).to.have.property('foo');\n * expect(obj).to.have.property('foo', 'bar');\n *\n * // deep referencing\n * var deepObj = {\n * green: { tea: 'matcha' }\n * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]\n * };\n *\n * expect(deepObj).to.have.deep.property('green.tea', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');\n *\n * You can also use an array as the starting point of a `deep.property`\n * assertion, or traverse nested arrays.\n *\n * var arr = [\n * [ 'chai', 'matcha', 'konacha' ]\n * , [ { tea: 'chai' }\n * , { tea: 'matcha' }\n * , { tea: 'konacha' } ]\n * ];\n *\n * expect(arr).to.have.deep.property('[0][1]', 'matcha');\n * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');\n *\n * Furthermore, `property` changes the subject of the assertion\n * to be the value of that property from the original object. This\n * permits for further chainable assertions on that property.\n *\n * expect(obj).to.have.property('foo')\n * .that.is.a('string');\n * expect(deepObj).to.have.property('green')\n * .that.is.an('object')\n * .that.deep.equals({ tea: 'matcha' });\n * expect(deepObj).to.have.property('teas')\n * .that.is.an('array')\n * .with.deep.property('[2]')\n * .that.deep.equals({ tea: 'konacha' });\n *\n * Note that dots and bracket in `name` must be backslash-escaped when\n * the `deep` flag is set, while they must NOT be escaped when the `deep`\n * flag is not set.\n *\n * // simple referencing\n * var css = { '.link[target]': 42 };\n * expect(css).to.have.property('.link[target]', 42);\n *\n * // deep referencing\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name property\n * @alias deep.property\n * @param {String} name\n * @param {Mixed} value (optional)\n * @param {String} message _optional_\n * @returns value of property for chaining\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('property', function (name, val, msg) {\n if (msg) flag(this, 'message', msg);\n\n var isDeep = !!flag(this, 'deep')\n , descriptor = isDeep ? 'deep property ' : 'property '\n , negate = flag(this, 'negate')\n , obj = flag(this, 'object')\n , pathInfo = isDeep ? _.getPathInfo(name, obj) : null\n , hasProperty = isDeep\n ? pathInfo.exists\n : _.hasProperty(name, obj)\n , value = isDeep\n ? pathInfo.value\n : obj[name];\n\n if (negate && arguments.length > 1) {\n if (undefined === value) {\n msg = (msg != null) ? msg + ': ' : '';\n throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));\n }\n } else {\n this.assert(\n hasProperty\n , 'expected #{this} to have a ' + descriptor + _.inspect(name)\n , 'expected #{this} to not have ' + descriptor + _.inspect(name));\n }\n\n if (arguments.length > 1) {\n this.assert(\n val === value\n , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'\n , val\n , value\n );\n }\n\n flag(this, 'object', value);\n });\n\n\n /**\n * ### .ownProperty(name)\n *\n * Asserts that the target has an own property `name`.\n *\n * expect('test').to.have.ownProperty('length');\n *\n * @name ownProperty\n * @alias haveOwnProperty\n * @param {String} name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnProperty (name, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n obj.hasOwnProperty(name)\n , 'expected #{this} to have own property ' + _.inspect(name)\n , 'expected #{this} to not have own property ' + _.inspect(name)\n );\n }\n\n Assertion.addMethod('ownProperty', assertOwnProperty);\n Assertion.addMethod('haveOwnProperty', assertOwnProperty);\n\n /**\n * ### .ownPropertyDescriptor(name[, descriptor[, message]])\n *\n * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.\n *\n * expect('test').to.have.ownPropertyDescriptor('length');\n * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });\n * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });\n * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);\n * expect('test').ownPropertyDescriptor('length').to.have.keys('value');\n *\n * @name ownPropertyDescriptor\n * @alias haveOwnPropertyDescriptor\n * @param {String} name\n * @param {Object} descriptor _optional_\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnPropertyDescriptor (name, descriptor, msg) {\n if (typeof descriptor === 'string') {\n msg = descriptor;\n descriptor = null;\n }\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);\n if (actualDescriptor && descriptor) {\n this.assert(\n _.eql(descriptor, actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)\n , descriptor\n , actualDescriptor\n , true\n );\n } else {\n this.assert(\n actualDescriptor\n , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)\n , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)\n );\n }\n flag(this, 'object', actualDescriptor);\n }\n\n Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);\n Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);\n\n /**\n * ### .length\n *\n * Sets the `doLength` flag later used as a chain precursor to a value\n * comparison for the `length` property.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * *Deprecation notice:* Using `length` as an assertion will be deprecated\n * in version 2.4.0 and removed in 3.0.0. Code using the old style of\n * asserting for `length` property value using `length(value)` should be\n * switched to use `lengthOf(value)` instead.\n *\n * @name length\n * @namespace BDD\n * @api public\n */\n\n /**\n * ### .lengthOf(value[, message])\n *\n * Asserts that the target's `length` property has\n * the expected value.\n *\n * expect([ 1, 2, 3]).to.have.lengthOf(3);\n * expect('foobar').to.have.lengthOf(6);\n *\n * @name lengthOf\n * @param {Number} length\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLengthChain () {\n flag(this, 'doLength', true);\n }\n\n function assertLength (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n\n this.assert(\n len == n\n , 'expected #{this} to have a length of #{exp} but got #{act}'\n , 'expected #{this} to not have a length of #{act}'\n , n\n , len\n );\n }\n\n Assertion.addChainableMethod('length', assertLength, assertLengthChain);\n Assertion.addMethod('lengthOf', assertLength);\n\n /**\n * ### .match(regexp)\n *\n * Asserts that the target matches a regular expression.\n *\n * expect('foobar').to.match(/^foo/);\n *\n * @name match\n * @alias matches\n * @param {RegExp} RegularExpression\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n function assertMatch(re, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n re.exec(obj)\n , 'expected #{this} to match ' + re\n , 'expected #{this} not to match ' + re\n );\n }\n\n Assertion.addMethod('match', assertMatch);\n Assertion.addMethod('matches', assertMatch);\n\n /**\n * ### .string(string)\n *\n * Asserts that the string target contains another string.\n *\n * expect('foobar').to.have.string('bar');\n *\n * @name string\n * @param {String} string\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('string', function (str, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('string');\n\n this.assert(\n ~obj.indexOf(str)\n , 'expected #{this} to contain ' + _.inspect(str)\n , 'expected #{this} to not contain ' + _.inspect(str)\n );\n });\n\n\n /**\n * ### .keys(key1, [key2], [...])\n *\n * Asserts that the target contains any or all of the passed-in keys.\n * Use in combination with `any`, `all`, `contains`, or `have` will affect\n * what will pass.\n *\n * When used in conjunction with `any`, at least one key that is passed\n * in must exist in the target object. This is regardless whether or not\n * the `have` or `contain` qualifiers are used. Note, either `any` or `all`\n * should be used in the assertion. If neither are used, the assertion is\n * defaulted to `all`.\n *\n * When both `all` and `contain` are used, the target object must have at\n * least all of the passed-in keys but may have more keys not listed.\n *\n * When both `all` and `have` are used, the target object must both contain\n * all of the passed-in keys AND the number of keys in the target object must\n * match the number of keys passed in (in other words, a target object must\n * have all and only all of the passed-in keys).\n *\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});\n * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});\n *\n *\n * @name keys\n * @alias key\n * @param {...String|Array|Object} keys\n * @namespace BDD\n * @api public\n */\n\n function assertKeys (keys) {\n var obj = flag(this, 'object')\n , str\n , ok = true\n , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';\n\n switch (_.type(keys)) {\n case \"array\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n break;\n case \"object\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n keys = Object.keys(keys);\n break;\n default:\n keys = Array.prototype.slice.call(arguments);\n }\n\n if (!keys.length) throw new Error('keys required');\n\n var actual = Object.keys(obj)\n , expected = keys\n , len = keys.length\n , any = flag(this, 'any')\n , all = flag(this, 'all');\n\n if (!any && !all) {\n all = true;\n }\n\n // Has any\n if (any) {\n var intersection = expected.filter(function(key) {\n return ~actual.indexOf(key);\n });\n ok = intersection.length > 0;\n }\n\n // Has all\n if (all) {\n ok = keys.every(function(key){\n return ~actual.indexOf(key);\n });\n if (!flag(this, 'negate') && !flag(this, 'contains')) {\n ok = ok && keys.length == actual.length;\n }\n }\n\n // Key string\n if (len > 1) {\n keys = keys.map(function(key){\n return _.inspect(key);\n });\n var last = keys.pop();\n if (all) {\n str = keys.join(', ') + ', and ' + last;\n }\n if (any) {\n str = keys.join(', ') + ', or ' + last;\n }\n } else {\n str = _.inspect(keys[0]);\n }\n\n // Form\n str = (len > 1 ? 'keys ' : 'key ') + str;\n\n // Have / include\n str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;\n\n // Assertion\n this.assert(\n ok\n , 'expected #{this} to ' + str\n , 'expected #{this} to not ' + str\n , expected.slice(0).sort()\n , actual.sort()\n , true\n );\n }\n\n Assertion.addMethod('keys', assertKeys);\n Assertion.addMethod('key', assertKeys);\n\n /**\n * ### .throw(constructor)\n *\n * Asserts that the function target will throw a specific error, or specific type of error\n * (as determined using `instanceof`), optionally with a RegExp or string inclusion test\n * for the error's message.\n *\n * var err = new ReferenceError('This is a bad function.');\n * var fn = function () { throw err; }\n * expect(fn).to.throw(ReferenceError);\n * expect(fn).to.throw(Error);\n * expect(fn).to.throw(/bad function/);\n * expect(fn).to.not.throw('good function');\n * expect(fn).to.throw(ReferenceError, /bad function/);\n * expect(fn).to.throw(err);\n *\n * Please note that when a throw expectation is negated, it will check each\n * parameter independently, starting with error constructor type. The appropriate way\n * to check for the existence of a type of error but for a message that does not match\n * is to use `and`.\n *\n * expect(fn).to.throw(ReferenceError)\n * .and.not.throw(/good function/);\n *\n * @name throw\n * @alias throws\n * @alias Throw\n * @param {ErrorConstructor} constructor\n * @param {String|RegExp} expected error message\n * @param {String} message _optional_\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @returns error for chaining (null if no error)\n * @namespace BDD\n * @api public\n */\n\n function assertThrows (constructor, errMsg, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('function');\n\n var thrown = false\n , desiredError = null\n , name = null\n , thrownError = null;\n\n if (arguments.length === 0) {\n errMsg = null;\n constructor = null;\n } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {\n errMsg = constructor;\n constructor = null;\n } else if (constructor && constructor instanceof Error) {\n desiredError = constructor;\n constructor = null;\n errMsg = null;\n } else if (typeof constructor === 'function') {\n name = constructor.prototype.name;\n if (!name || (name === 'Error' && constructor !== Error)) {\n name = constructor.name || (new constructor()).name;\n }\n } else {\n constructor = null;\n }\n\n try {\n obj();\n } catch (err) {\n // first, check desired error\n if (desiredError) {\n this.assert(\n err === desiredError\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}'\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (err instanceof Error ? err.toString() : err)\n );\n\n flag(this, 'object', err);\n return this;\n }\n\n // next, check constructor\n if (constructor) {\n this.assert(\n err instanceof constructor\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp} but #{act} was thrown'\n , name\n , (err instanceof Error ? err.toString() : err)\n );\n\n if (!errMsg) {\n flag(this, 'object', err);\n return this;\n }\n }\n\n // next, check message\n var message = 'error' === _.type(err) && \"message\" in err\n ? err.message\n : '' + err;\n\n if ((message != null) && errMsg && errMsg instanceof RegExp) {\n this.assert(\n errMsg.exec(message)\n , 'expected #{this} to throw error matching #{exp} but got #{act}'\n , 'expected #{this} to throw error not matching #{exp}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else if ((message != null) && errMsg && 'string' === typeof errMsg) {\n this.assert(\n ~message.indexOf(errMsg)\n , 'expected #{this} to throw error including #{exp} but got #{act}'\n , 'expected #{this} to throw error not including #{act}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else {\n thrown = true;\n thrownError = err;\n }\n }\n\n var actuallyGot = ''\n , expectedThrown = name !== null\n ? name\n : desiredError\n ? '#{exp}' //_.inspect(desiredError)\n : 'an error';\n\n if (thrown) {\n actuallyGot = ' but #{act} was thrown'\n }\n\n this.assert(\n thrown === true\n , 'expected #{this} to throw ' + expectedThrown + actuallyGot\n , 'expected #{this} to not throw ' + expectedThrown + actuallyGot\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (thrownError instanceof Error ? thrownError.toString() : thrownError)\n );\n\n flag(this, 'object', thrownError);\n };\n\n Assertion.addMethod('throw', assertThrows);\n Assertion.addMethod('throws', assertThrows);\n Assertion.addMethod('Throw', assertThrows);\n\n /**\n * ### .respondTo(method)\n *\n * Asserts that the object or class target will respond to a method.\n *\n * Klass.prototype.bar = function(){};\n * expect(Klass).to.respondTo('bar');\n * expect(obj).to.respondTo('bar');\n *\n * To check if a constructor will respond to a static function,\n * set the `itself` flag.\n *\n * Klass.baz = function(){};\n * expect(Klass).itself.to.respondTo('baz');\n *\n * @name respondTo\n * @alias respondsTo\n * @param {String} method\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function respondTo (method, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , itself = flag(this, 'itself')\n , context = ('function' === _.type(obj) && !itself)\n ? obj.prototype[method]\n : obj[method];\n\n this.assert(\n 'function' === typeof context\n , 'expected #{this} to respond to ' + _.inspect(method)\n , 'expected #{this} to not respond to ' + _.inspect(method)\n );\n }\n\n Assertion.addMethod('respondTo', respondTo);\n Assertion.addMethod('respondsTo', respondTo);\n\n /**\n * ### .itself\n *\n * Sets the `itself` flag, later used by the `respondTo` assertion.\n *\n * function Foo() {}\n * Foo.bar = function() {}\n * Foo.prototype.baz = function() {}\n *\n * expect(Foo).itself.to.respondTo('bar');\n * expect(Foo).itself.not.to.respondTo('baz');\n *\n * @name itself\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('itself', function () {\n flag(this, 'itself', true);\n });\n\n /**\n * ### .satisfy(method)\n *\n * Asserts that the target passes a given truth test.\n *\n * expect(1).to.satisfy(function(num) { return num > 0; });\n *\n * @name satisfy\n * @alias satisfies\n * @param {Function} matcher\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function satisfy (matcher, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var result = matcher(obj);\n this.assert(\n result\n , 'expected #{this} to satisfy ' + _.objDisplay(matcher)\n , 'expected #{this} to not satisfy' + _.objDisplay(matcher)\n , this.negate ? false : true\n , result\n );\n }\n\n Assertion.addMethod('satisfy', satisfy);\n Assertion.addMethod('satisfies', satisfy);\n\n /**\n * ### .closeTo(expected, delta)\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * expect(1.5).to.be.closeTo(1, 0.5);\n *\n * @name closeTo\n * @alias approximately\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function closeTo(expected, delta, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj, msg).is.a('number');\n if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {\n throw new Error('the arguments to closeTo or approximately must be numbers');\n }\n\n this.assert(\n Math.abs(obj - expected) <= delta\n , 'expected #{this} to be close to ' + expected + ' +/- ' + delta\n , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta\n );\n }\n\n Assertion.addMethod('closeTo', closeTo);\n Assertion.addMethod('approximately', closeTo);\n\n function isSubsetOf(subset, superset, cmp) {\n return subset.every(function(elem) {\n if (!cmp) return superset.indexOf(elem) !== -1;\n\n return superset.some(function(elem2) {\n return cmp(elem, elem2);\n });\n })\n }\n\n /**\n * ### .members(set)\n *\n * Asserts that the target is a superset of `set`,\n * or that the target and `set` have the same strictly-equal (===) members.\n * Alternately, if the `deep` flag is set, set members are compared for deep\n * equality.\n *\n * expect([1, 2, 3]).to.include.members([3, 2]);\n * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);\n *\n * expect([4, 2]).to.have.members([2, 4]);\n * expect([5, 2]).to.not.have.members([5, 2, 1]);\n *\n * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);\n *\n * @name members\n * @param {Array} set\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('members', function (subset, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj).to.be.an('array');\n new Assertion(subset).to.be.an('array');\n\n var cmp = flag(this, 'deep') ? _.eql : undefined;\n\n if (flag(this, 'contains')) {\n return this.assert(\n isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to be a superset of #{act}'\n , 'expected #{this} to not be a superset of #{act}'\n , obj\n , subset\n );\n }\n\n this.assert(\n isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to have the same members as #{act}'\n , 'expected #{this} to not have the same members as #{act}'\n , obj\n , subset\n );\n });\n\n /**\n * ### .oneOf(list)\n *\n * Assert that a value appears somewhere in the top level of array `list`.\n *\n * expect('a').to.be.oneOf(['a', 'b', 'c']);\n * expect(9).to.not.be.oneOf(['z']);\n * expect([3]).to.not.be.oneOf([1, 2, [3]]);\n *\n * var three = [3];\n * // for object-types, contents are not compared\n * expect(three).to.not.be.oneOf([1, 2, [3]]);\n * // comparing references works\n * expect(three).to.be.oneOf([1, 2, three]);\n *\n * @name oneOf\n * @param {Array<*>} list\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function oneOf (list, msg) {\n if (msg) flag(this, 'message', msg);\n var expected = flag(this, 'object');\n new Assertion(list).to.be.an('array');\n\n this.assert(\n list.indexOf(expected) > -1\n , 'expected #{this} to be one of #{exp}'\n , 'expected #{this} to not be one of #{exp}'\n , list\n , expected\n );\n }\n\n Assertion.addMethod('oneOf', oneOf);\n\n\n /**\n * ### .change(function)\n *\n * Asserts that a function changes an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 3 };\n * var noChangeFn = function() { return 'foo' + 'bar'; }\n * expect(fn).to.change(obj, 'val');\n * expect(noChangeFn).to.not.change(obj, 'val')\n *\n * @name change\n * @alias changes\n * @alias Change\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertChanges (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n initial !== object[prop]\n , 'expected .' + prop + ' to change'\n , 'expected .' + prop + ' to not change'\n );\n }\n\n Assertion.addChainableMethod('change', assertChanges);\n Assertion.addChainableMethod('changes', assertChanges);\n\n /**\n * ### .increase(function)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * expect(fn).to.increase(obj, 'val');\n *\n * @name increase\n * @alias increases\n * @alias Increase\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertIncreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial > 0\n , 'expected .' + prop + ' to increase'\n , 'expected .' + prop + ' to not increase'\n );\n }\n\n Assertion.addChainableMethod('increase', assertIncreases);\n Assertion.addChainableMethod('increases', assertIncreases);\n\n /**\n * ### .decrease(function)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * expect(fn).to.decrease(obj, 'val');\n *\n * @name decrease\n * @alias decreases\n * @alias Decrease\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertDecreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial < 0\n , 'expected .' + prop + ' to decrease'\n , 'expected .' + prop + ' to not decrease'\n );\n }\n\n Assertion.addChainableMethod('decrease', assertDecreases);\n Assertion.addChainableMethod('decreases', assertDecreases);\n\n /**\n * ### .extensible\n *\n * Asserts that the target is extensible (can have new properties added to\n * it).\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect({}).to.be.extensible;\n * expect(nonExtensibleObject).to.not.be.extensible;\n * expect(sealedObject).to.not.be.extensible;\n * expect(frozenObject).to.not.be.extensible;\n *\n * @name extensible\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('extensible', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isExtensible;\n\n try {\n isExtensible = Object.isExtensible(obj);\n } catch (err) {\n if (err instanceof TypeError) isExtensible = false;\n else throw err;\n }\n\n this.assert(\n isExtensible\n , 'expected #{this} to be extensible'\n , 'expected #{this} to not be extensible'\n );\n });\n\n /**\n * ### .sealed\n *\n * Asserts that the target is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect(sealedObject).to.be.sealed;\n * expect(frozenObject).to.be.sealed;\n * expect({}).to.not.be.sealed;\n *\n * @name sealed\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('sealed', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isSealed;\n\n try {\n isSealed = Object.isSealed(obj);\n } catch (err) {\n if (err instanceof TypeError) isSealed = true;\n else throw err;\n }\n\n this.assert(\n isSealed\n , 'expected #{this} to be sealed'\n , 'expected #{this} to not be sealed'\n );\n });\n\n /**\n * ### .frozen\n *\n * Asserts that the target is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n *\n * expect(frozenObject).to.be.frozen;\n * expect({}).to.not.be.frozen;\n *\n * @name frozen\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('frozen', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isFrozen;\n\n try {\n isFrozen = Object.isFrozen(obj);\n } catch (err) {\n if (err instanceof TypeError) isFrozen = true;\n else throw err;\n }\n\n this.assert(\n isFrozen\n , 'expected #{this} to be frozen'\n , 'expected #{this} to not be frozen'\n );\n });\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\n\nmodule.exports = function (chai, util) {\n\n /*!\n * Chai dependencies.\n */\n\n var Assertion = chai.Assertion\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n /**\n * ### assert(expression, message)\n *\n * Write your own test expressions.\n *\n * assert('foo' !== 'bar', 'foo is not bar');\n * assert(Array.isArray([]), 'empty arrays are arrays');\n *\n * @param {Mixed} expression to test for truthiness\n * @param {String} message to display on error\n * @name assert\n * @namespace Assert\n * @api public\n */\n\n var assert = chai.assert = function (express, errmsg) {\n var test = new Assertion(null, null, chai.assert);\n test.assert(\n express\n , errmsg\n , '[ negation message unavailable ]'\n );\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure. Node.js `assert` module-compatible.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Assert\n * @api public\n */\n\n assert.fail = function (actual, expected, message, operator) {\n message = message || 'assert.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, assert.fail);\n };\n\n /**\n * ### .isOk(object, [message])\n *\n * Asserts that `object` is truthy.\n *\n * assert.isOk('everything', 'everything is ok');\n * assert.isOk(false, 'this will fail');\n *\n * @name isOk\n * @alias ok\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isOk = function (val, msg) {\n new Assertion(val, msg).is.ok;\n };\n\n /**\n * ### .isNotOk(object, [message])\n *\n * Asserts that `object` is falsy.\n *\n * assert.isNotOk('everything', 'this will fail');\n * assert.isNotOk(false, 'this will pass');\n *\n * @name isNotOk\n * @alias notOk\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotOk = function (val, msg) {\n new Assertion(val, msg).is.not.ok;\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * assert.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.equal = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.equal);\n\n test.assert(\n exp == flag(test, 'object')\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .notEqual(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * assert.notEqual(3, 4, 'these numbers are not equal');\n *\n * @name notEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notEqual = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.notEqual);\n\n test.assert(\n exp != flag(test, 'object')\n , 'expected #{this} to not equal #{exp}'\n , 'expected #{this} to equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .strictEqual(actual, expected, [message])\n *\n * Asserts strict equality (`===`) of `actual` and `expected`.\n *\n * assert.strictEqual(true, true, 'these booleans are strictly equal');\n *\n * @name strictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.strictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.equal(exp);\n };\n\n /**\n * ### .notStrictEqual(actual, expected, [message])\n *\n * Asserts strict inequality (`!==`) of `actual` and `expected`.\n *\n * assert.notStrictEqual(3, '3', 'no coercion for strict equality');\n *\n * @name notStrictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notStrictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.equal(exp);\n };\n\n /**\n * ### .deepEqual(actual, expected, [message])\n *\n * Asserts that `actual` is deeply equal to `expected`.\n *\n * assert.deepEqual({ tea: 'green' }, { tea: 'green' });\n *\n * @name deepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.eql(exp);\n };\n\n /**\n * ### .notDeepEqual(actual, expected, [message])\n *\n * Assert that `actual` is not deeply equal to `expected`.\n *\n * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });\n *\n * @name notDeepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.eql(exp);\n };\n\n /**\n * ### .isAbove(valueToCheck, valueToBeAbove, [message])\n *\n * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`\n *\n * assert.isAbove(5, 2, '5 is strictly greater than 2');\n *\n * @name isAbove\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAbove\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAbove = function (val, abv, msg) {\n new Assertion(val, msg).to.be.above(abv);\n };\n\n /**\n * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])\n *\n * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`\n *\n * assert.isAtLeast(5, 2, '5 is greater or equal to 2');\n * assert.isAtLeast(3, 3, '3 is greater or equal to 3');\n *\n * @name isAtLeast\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtLeast\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtLeast = function (val, atlst, msg) {\n new Assertion(val, msg).to.be.least(atlst);\n };\n\n /**\n * ### .isBelow(valueToCheck, valueToBeBelow, [message])\n *\n * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`\n *\n * assert.isBelow(3, 6, '3 is strictly less than 6');\n *\n * @name isBelow\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeBelow\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBelow = function (val, blw, msg) {\n new Assertion(val, msg).to.be.below(blw);\n };\n\n /**\n * ### .isAtMost(valueToCheck, valueToBeAtMost, [message])\n *\n * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`\n *\n * assert.isAtMost(3, 6, '3 is less than or equal to 6');\n * assert.isAtMost(4, 4, '4 is less than or equal to 4');\n *\n * @name isAtMost\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtMost\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtMost = function (val, atmst, msg) {\n new Assertion(val, msg).to.be.most(atmst);\n };\n\n /**\n * ### .isTrue(value, [message])\n *\n * Asserts that `value` is true.\n *\n * var teaServed = true;\n * assert.isTrue(teaServed, 'the tea has been served');\n *\n * @name isTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isTrue = function (val, msg) {\n new Assertion(val, msg).is['true'];\n };\n\n /**\n * ### .isNotTrue(value, [message])\n *\n * Asserts that `value` is not true.\n *\n * var tea = 'tasty chai';\n * assert.isNotTrue(tea, 'great, time for tea!');\n *\n * @name isNotTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotTrue = function (val, msg) {\n new Assertion(val, msg).to.not.equal(true);\n };\n\n /**\n * ### .isFalse(value, [message])\n *\n * Asserts that `value` is false.\n *\n * var teaServed = false;\n * assert.isFalse(teaServed, 'no tea yet? hmm...');\n *\n * @name isFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFalse = function (val, msg) {\n new Assertion(val, msg).is['false'];\n };\n\n /**\n * ### .isNotFalse(value, [message])\n *\n * Asserts that `value` is not false.\n *\n * var tea = 'tasty chai';\n * assert.isNotFalse(tea, 'great, time for tea!');\n *\n * @name isNotFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFalse = function (val, msg) {\n new Assertion(val, msg).to.not.equal(false);\n };\n\n /**\n * ### .isNull(value, [message])\n *\n * Asserts that `value` is null.\n *\n * assert.isNull(err, 'there was no error');\n *\n * @name isNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNull = function (val, msg) {\n new Assertion(val, msg).to.equal(null);\n };\n\n /**\n * ### .isNotNull(value, [message])\n *\n * Asserts that `value` is not null.\n *\n * var tea = 'tasty chai';\n * assert.isNotNull(tea, 'great, time for tea!');\n *\n * @name isNotNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNull = function (val, msg) {\n new Assertion(val, msg).to.not.equal(null);\n };\n\n /**\n * ### .isNaN\n * Asserts that value is NaN\n *\n * assert.isNaN('foo', 'foo is NaN');\n *\n * @name isNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNaN = function (val, msg) {\n new Assertion(val, msg).to.be.NaN;\n };\n\n /**\n * ### .isNotNaN\n * Asserts that value is not NaN\n *\n * assert.isNotNaN(4, '4 is not NaN');\n *\n * @name isNotNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n assert.isNotNaN = function (val, msg) {\n new Assertion(val, msg).not.to.be.NaN;\n };\n\n /**\n * ### .isUndefined(value, [message])\n *\n * Asserts that `value` is `undefined`.\n *\n * var tea;\n * assert.isUndefined(tea, 'no tea defined');\n *\n * @name isUndefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isUndefined = function (val, msg) {\n new Assertion(val, msg).to.equal(undefined);\n };\n\n /**\n * ### .isDefined(value, [message])\n *\n * Asserts that `value` is not `undefined`.\n *\n * var tea = 'cup of chai';\n * assert.isDefined(tea, 'tea has been defined');\n *\n * @name isDefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isDefined = function (val, msg) {\n new Assertion(val, msg).to.not.equal(undefined);\n };\n\n /**\n * ### .isFunction(value, [message])\n *\n * Asserts that `value` is a function.\n *\n * function serveTea() { return 'cup of tea'; };\n * assert.isFunction(serveTea, 'great, we can have tea now');\n *\n * @name isFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFunction = function (val, msg) {\n new Assertion(val, msg).to.be.a('function');\n };\n\n /**\n * ### .isNotFunction(value, [message])\n *\n * Asserts that `value` is _not_ a function.\n *\n * var serveTea = [ 'heat', 'pour', 'sip' ];\n * assert.isNotFunction(serveTea, 'great, we have listed the steps');\n *\n * @name isNotFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFunction = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('function');\n };\n\n /**\n * ### .isObject(value, [message])\n *\n * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).\n * _The assertion does not match subclassed objects._\n *\n * var selection = { name: 'Chai', serve: 'with spices' };\n * assert.isObject(selection, 'tea selection is an object');\n *\n * @name isObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isObject = function (val, msg) {\n new Assertion(val, msg).to.be.a('object');\n };\n\n /**\n * ### .isNotObject(value, [message])\n *\n * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).\n *\n * var selection = 'chai'\n * assert.isNotObject(selection, 'tea selection is not an object');\n * assert.isNotObject(null, 'null is not an object');\n *\n * @name isNotObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotObject = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('object');\n };\n\n /**\n * ### .isArray(value, [message])\n *\n * Asserts that `value` is an array.\n *\n * var menu = [ 'green', 'chai', 'oolong' ];\n * assert.isArray(menu, 'what kind of tea do we want?');\n *\n * @name isArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isArray = function (val, msg) {\n new Assertion(val, msg).to.be.an('array');\n };\n\n /**\n * ### .isNotArray(value, [message])\n *\n * Asserts that `value` is _not_ an array.\n *\n * var menu = 'green|chai|oolong';\n * assert.isNotArray(menu, 'what kind of tea do we want?');\n *\n * @name isNotArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotArray = function (val, msg) {\n new Assertion(val, msg).to.not.be.an('array');\n };\n\n /**\n * ### .isString(value, [message])\n *\n * Asserts that `value` is a string.\n *\n * var teaOrder = 'chai';\n * assert.isString(teaOrder, 'order placed');\n *\n * @name isString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isString = function (val, msg) {\n new Assertion(val, msg).to.be.a('string');\n };\n\n /**\n * ### .isNotString(value, [message])\n *\n * Asserts that `value` is _not_ a string.\n *\n * var teaOrder = 4;\n * assert.isNotString(teaOrder, 'order placed');\n *\n * @name isNotString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotString = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('string');\n };\n\n /**\n * ### .isNumber(value, [message])\n *\n * Asserts that `value` is a number.\n *\n * var cups = 2;\n * assert.isNumber(cups, 'how many cups');\n *\n * @name isNumber\n * @param {Number} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNumber = function (val, msg) {\n new Assertion(val, msg).to.be.a('number');\n };\n\n /**\n * ### .isNotNumber(value, [message])\n *\n * Asserts that `value` is _not_ a number.\n *\n * var cups = '2 cups please';\n * assert.isNotNumber(cups, 'how many cups');\n *\n * @name isNotNumber\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNumber = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('number');\n };\n\n /**\n * ### .isBoolean(value, [message])\n *\n * Asserts that `value` is a boolean.\n *\n * var teaReady = true\n * , teaServed = false;\n *\n * assert.isBoolean(teaReady, 'is the tea ready');\n * assert.isBoolean(teaServed, 'has tea been served');\n *\n * @name isBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBoolean = function (val, msg) {\n new Assertion(val, msg).to.be.a('boolean');\n };\n\n /**\n * ### .isNotBoolean(value, [message])\n *\n * Asserts that `value` is _not_ a boolean.\n *\n * var teaReady = 'yep'\n * , teaServed = 'nope';\n *\n * assert.isNotBoolean(teaReady, 'is the tea ready');\n * assert.isNotBoolean(teaServed, 'has tea been served');\n *\n * @name isNotBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotBoolean = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('boolean');\n };\n\n /**\n * ### .typeOf(value, name, [message])\n *\n * Asserts that `value`'s type is `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');\n * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');\n * assert.typeOf('tea', 'string', 'we have a string');\n * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');\n * assert.typeOf(null, 'null', 'we have a null');\n * assert.typeOf(undefined, 'undefined', 'we have an undefined');\n *\n * @name typeOf\n * @param {Mixed} value\n * @param {String} name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.typeOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.a(type);\n };\n\n /**\n * ### .notTypeOf(value, name, [message])\n *\n * Asserts that `value`'s type is _not_ `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.notTypeOf('tea', 'number', 'strings are not numbers');\n *\n * @name notTypeOf\n * @param {Mixed} value\n * @param {String} typeof name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notTypeOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.a(type);\n };\n\n /**\n * ### .instanceOf(object, constructor, [message])\n *\n * Asserts that `value` is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new Tea('chai');\n *\n * assert.instanceOf(chai, Tea, 'chai is an instance of tea');\n *\n * @name instanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.instanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.instanceOf(type);\n };\n\n /**\n * ### .notInstanceOf(object, constructor, [message])\n *\n * Asserts `value` is not an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new String('chai');\n *\n * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');\n *\n * @name notInstanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInstanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.instanceOf(type);\n };\n\n /**\n * ### .include(haystack, needle, [message])\n *\n * Asserts that `haystack` includes `needle`. Works\n * for strings and arrays.\n *\n * assert.include('foobar', 'bar', 'foobar contains string \"bar\"');\n * assert.include([ 1, 2, 3 ], 3, 'array contains value');\n *\n * @name include\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.include = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.include).include(inc);\n };\n\n /**\n * ### .notInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` does not include `needle`. Works\n * for strings and arrays.\n *\n * assert.notInclude('foobar', 'baz', 'string not include substring');\n * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');\n *\n * @name notInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notInclude).not.include(inc);\n };\n\n /**\n * ### .match(value, regexp, [message])\n *\n * Asserts that `value` matches the regular expression `regexp`.\n *\n * assert.match('foobar', /^foo/, 'regexp matches');\n *\n * @name match\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.match = function (exp, re, msg) {\n new Assertion(exp, msg).to.match(re);\n };\n\n /**\n * ### .notMatch(value, regexp, [message])\n *\n * Asserts that `value` does not match the regular expression `regexp`.\n *\n * assert.notMatch('foobar', /^foo/, 'regexp does not match');\n *\n * @name notMatch\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notMatch = function (exp, re, msg) {\n new Assertion(exp, msg).to.not.match(re);\n };\n\n /**\n * ### .property(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`.\n *\n * assert.property({ tea: { green: 'matcha' }}, 'tea');\n *\n * @name property\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.property = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.property(prop);\n };\n\n /**\n * ### .notProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`.\n *\n * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');\n *\n * @name notProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.property(prop);\n };\n\n /**\n * ### .deepProperty(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`, which can be a\n * string using dot- and bracket-notation for deep reference.\n *\n * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');\n *\n * @name deepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop);\n };\n\n /**\n * ### .notDeepProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`, which\n * can be a string using dot- and bracket-notation for deep reference.\n *\n * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');\n *\n * @name notDeepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop);\n };\n\n /**\n * ### .propertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`.\n *\n * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');\n *\n * @name propertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.property(prop, val);\n };\n\n /**\n * ### .propertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`.\n *\n * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');\n *\n * @name propertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.property(prop, val);\n };\n\n /**\n * ### .deepPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`. `property` can use dot- and bracket-notation for deep\n * reference.\n *\n * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');\n *\n * @name deepPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop, val);\n };\n\n /**\n * ### .deepPropertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`. `property` can use dot- and\n * bracket-notation for deep reference.\n *\n * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');\n *\n * @name deepPropertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop, val);\n };\n\n /**\n * ### .lengthOf(object, length, [message])\n *\n * Asserts that `object` has a `length` property with the expected value.\n *\n * assert.lengthOf([1,2,3], 3, 'array has length of 3');\n * assert.lengthOf('foobar', 6, 'string has length of 6');\n *\n * @name lengthOf\n * @param {Mixed} object\n * @param {Number} length\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.lengthOf = function (exp, len, msg) {\n new Assertion(exp, msg).to.have.length(len);\n };\n\n /**\n * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * assert.throws(fn, 'function throws a reference error');\n * assert.throws(fn, /function throws a reference error/);\n * assert.throws(fn, ReferenceError);\n * assert.throws(fn, ReferenceError, 'function throws a reference error');\n * assert.throws(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throws\n * @alias throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.throws = function (fn, errt, errs, msg) {\n if ('string' === typeof errt || errt instanceof RegExp) {\n errs = errt;\n errt = null;\n }\n\n var assertErr = new Assertion(fn, msg).to.throw(errt, errs);\n return flag(assertErr, 'object');\n };\n\n /**\n * ### .doesNotThrow(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * assert.doesNotThrow(fn, Error, 'function does not throw');\n *\n * @name doesNotThrow\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotThrow = function (fn, type, msg) {\n if ('string' === typeof type) {\n msg = type;\n type = null;\n }\n\n new Assertion(fn, msg).to.not.Throw(type);\n };\n\n /**\n * ### .operator(val1, operator, val2, [message])\n *\n * Compares two values using `operator`.\n *\n * assert.operator(1, '<', 2, 'everything is ok');\n * assert.operator(1, '>', 2, 'this will fail');\n *\n * @name operator\n * @param {Mixed} val1\n * @param {String} operator\n * @param {Mixed} val2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.operator = function (val, operator, val2, msg) {\n var ok;\n switch(operator) {\n case '==':\n ok = val == val2;\n break;\n case '===':\n ok = val === val2;\n break;\n case '>':\n ok = val > val2;\n break;\n case '>=':\n ok = val >= val2;\n break;\n case '<':\n ok = val < val2;\n break;\n case '<=':\n ok = val <= val2;\n break;\n case '!=':\n ok = val != val2;\n break;\n case '!==':\n ok = val !== val2;\n break;\n default:\n throw new Error('Invalid operator \"' + operator + '\"');\n }\n var test = new Assertion(ok, msg);\n test.assert(\n true === flag(test, 'object')\n , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)\n , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );\n };\n\n /**\n * ### .closeTo(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.closeTo(1.5, 1, 0.5, 'numbers are close');\n *\n * @name closeTo\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.closeTo = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.closeTo(exp, delta);\n };\n\n /**\n * ### .approximately(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.approximately(1.5, 1, 0.5, 'numbers are close');\n *\n * @name approximately\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.approximately = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.approximately(exp, delta);\n };\n\n /**\n * ### .sameMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members.\n * Order is not taken into account.\n *\n * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');\n *\n * @name sameMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.members(set2);\n }\n\n /**\n * ### .sameDeepMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members - using a deep equality checking.\n * Order is not taken into account.\n *\n * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members');\n *\n * @name sameDeepMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameDeepMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.deep.members(set2);\n }\n\n /**\n * ### .includeMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset`.\n * Order is not taken into account.\n *\n * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');\n *\n * @name includeMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.members(subset);\n }\n\n /**\n * ### .includeDeepMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` - using deep equality checking.\n * Order is not taken into account.\n * Duplicates are ignored.\n *\n * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');\n *\n * @name includeDeepMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeDeepMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.deep.members(subset);\n }\n\n /**\n * ### .oneOf(inList, list, [message])\n *\n * Asserts that non-object, non-array value `inList` appears in the flat array `list`.\n *\n * assert.oneOf(1, [ 2, 1 ], 'Not found in list');\n *\n * @name oneOf\n * @param {*} inList\n * @param {Array<*>} list\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.oneOf = function (inList, list, msg) {\n new Assertion(inList, msg).to.be.oneOf(list);\n }\n\n /**\n * ### .changes(function, object, property)\n *\n * Asserts that a function changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 22 };\n * assert.changes(fn, obj, 'val');\n *\n * @name changes\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changes = function (fn, obj, prop) {\n new Assertion(fn).to.change(obj, prop);\n }\n\n /**\n * ### .doesNotChange(function, object, property)\n *\n * Asserts that a function does not changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { console.log('foo'); };\n * assert.doesNotChange(fn, obj, 'val');\n *\n * @name doesNotChange\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotChange = function (fn, obj, prop) {\n new Assertion(fn).to.not.change(obj, prop);\n }\n\n /**\n * ### .increases(function, object, property)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 13 };\n * assert.increases(fn, obj, 'val');\n *\n * @name increases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increases = function (fn, obj, prop) {\n new Assertion(fn).to.increase(obj, prop);\n }\n\n /**\n * ### .doesNotIncrease(function, object, property)\n *\n * Asserts that a function does not increase object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 8 };\n * assert.doesNotIncrease(fn, obj, 'val');\n *\n * @name doesNotIncrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotIncrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.increase(obj, prop);\n }\n\n /**\n * ### .decreases(function, object, property)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.decreases(fn, obj, 'val');\n *\n * @name decreases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreases = function (fn, obj, prop) {\n new Assertion(fn).to.decrease(obj, prop);\n }\n\n /**\n * ### .doesNotDecrease(function, object, property)\n *\n * Asserts that a function does not decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * assert.doesNotDecrease(fn, obj, 'val');\n *\n * @name doesNotDecrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotDecrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.decrease(obj, prop);\n }\n\n /*!\n * ### .ifError(object)\n *\n * Asserts if value is not a false value, and throws if it is a true value.\n * This is added to allow for chai to be a drop-in replacement for Node's\n * assert class.\n *\n * var err = new Error('I am a custom error');\n * assert.ifError(err); // Rethrows err!\n *\n * @name ifError\n * @param {Object} object\n * @namespace Assert\n * @api public\n */\n\n assert.ifError = function (val) {\n if (val) {\n throw(val);\n }\n };\n\n /**\n * ### .isExtensible(object)\n *\n * Asserts that `object` is extensible (can have new properties added to it).\n *\n * assert.isExtensible({});\n *\n * @name isExtensible\n * @alias extensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.be.extensible;\n };\n\n /**\n * ### .isNotExtensible(object)\n *\n * Asserts that `object` is _not_ extensible.\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freese({});\n *\n * assert.isNotExtensible(nonExtensibleObject);\n * assert.isNotExtensible(sealedObject);\n * assert.isNotExtensible(frozenObject);\n *\n * @name isNotExtensible\n * @alias notExtensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.extensible;\n };\n\n /**\n * ### .isSealed(object)\n *\n * Asserts that `object` is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.seal({});\n *\n * assert.isSealed(sealedObject);\n * assert.isSealed(frozenObject);\n *\n * @name isSealed\n * @alias sealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isSealed = function (obj, msg) {\n new Assertion(obj, msg).to.be.sealed;\n };\n\n /**\n * ### .isNotSealed(object)\n *\n * Asserts that `object` is _not_ sealed.\n *\n * assert.isNotSealed({});\n *\n * @name isNotSealed\n * @alias notSealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotSealed = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.sealed;\n };\n\n /**\n * ### .isFrozen(object)\n *\n * Asserts that `object` is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n * assert.frozen(frozenObject);\n *\n * @name isFrozen\n * @alias frozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.be.frozen;\n };\n\n /**\n * ### .isNotFrozen(object)\n *\n * Asserts that `object` is _not_ frozen.\n *\n * assert.isNotFrozen({});\n *\n * @name isNotFrozen\n * @alias notFrozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.frozen;\n };\n\n /*!\n * Aliases.\n */\n\n (function alias(name, as){\n assert[as] = assert[name];\n return alias;\n })\n ('isOk', 'ok')\n ('isNotOk', 'notOk')\n ('throws', 'throw')\n ('throws', 'Throw')\n ('isExtensible', 'extensible')\n ('isNotExtensible', 'notExtensible')\n ('isSealed', 'sealed')\n ('isNotSealed', 'notSealed')\n ('isFrozen', 'frozen')\n ('isNotFrozen', 'notFrozen');\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n chai.expect = function (val, message) {\n return new chai.Assertion(val, message);\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Expect\n * @api public\n */\n\n chai.expect.fail = function (actual, expected, message, operator) {\n message = message || 'expect.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, chai.expect.fail);\n };\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n var Assertion = chai.Assertion;\n\n function loadShould () {\n // explicitly define this method as function as to have it's name to include as `ssfi`\n function shouldGetter() {\n if (this instanceof String || this instanceof Number || this instanceof Boolean ) {\n return new Assertion(this.valueOf(), null, shouldGetter);\n }\n return new Assertion(this, null, shouldGetter);\n }\n function shouldSetter(value) {\n // See https://github.com/chaijs/chai/issues/86: this makes\n // `whatever.should = someValue` actually set `someValue`, which is\n // especially useful for `global.should = require('chai').should()`.\n //\n // Note that we have to use [[DefineProperty]] instead of [[Put]]\n // since otherwise we would trigger this very setter!\n Object.defineProperty(this, 'should', {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n // modify Object.prototype to have `should`\n Object.defineProperty(Object.prototype, 'should', {\n set: shouldSetter\n , get: shouldGetter\n , configurable: true\n });\n\n var should = {};\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Should\n * @api public\n */\n\n should.fail = function (actual, expected, message, operator) {\n message = message || 'should.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, should.fail);\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * should.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * should.throw(fn, 'function throws a reference error');\n * should.throw(fn, /function throws a reference error/);\n * should.throw(fn, ReferenceError);\n * should.throw(fn, ReferenceError, 'function throws a reference error');\n * should.throw(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.Throw(errt, errs);\n };\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi';\n *\n * should.exist(foo, 'foo exists');\n *\n * @name exist\n * @namespace Should\n * @api public\n */\n\n should.exist = function (val, msg) {\n new Assertion(val, msg).to.exist;\n }\n\n // negation\n should.not = {}\n\n /**\n * ### .not.equal(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * should.not.equal(3, 4, 'these numbers are not equal');\n *\n * @name not.equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.not.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.not.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * should.not.throw(fn, Error, 'function does not throw');\n *\n * @name not.throw\n * @alias not.Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.not.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.not.Throw(errt, errs);\n };\n\n /**\n * ### .not.exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var bar = null;\n *\n * should.not.exist(bar, 'bar does not exist');\n *\n * @name not.exist\n * @namespace Should\n * @api public\n */\n\n should.not.exist = function (val, msg) {\n new Assertion(val, msg).to.not.exist;\n }\n\n should['throw'] = should['Throw'];\n should.not['throw'] = should.not['Throw'];\n\n return should;\n };\n\n chai.should = loadShould;\n chai.Should = loadShould;\n};\n","/*!\n * Chai - addChainingMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar transferFlags = require('./transferFlags');\nvar flag = require('./flag');\nvar config = require('../config');\n\n/*!\n * Module variables\n */\n\n// Check whether `__proto__` is supported\nvar hasProtoSupport = '__proto__' in Object;\n\n// Without `__proto__` support, this module will need to add properties to a function.\n// However, some Function.prototype methods cannot be overwritten,\n// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).\nvar excludeNames = /^(?:length|name|arguments|caller)$/;\n\n// Cache `Function` properties\nvar call = Function.prototype.call,\n apply = Function.prototype.apply;\n\n/**\n * ### addChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Adds a method to an object, such that the method can also be chained.\n *\n * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);\n *\n * The result can then be used as both a method assertion, executing both `method` and\n * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.\n *\n * expect(fooStr).to.be.foo('bar');\n * expect(fooStr).to.be.foo.equal('foo');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for `name`, when called\n * @param {Function} chainingBehavior function to be called every time the property is accessed\n * @namespace Utils\n * @name addChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n if (typeof chainingBehavior !== 'function') {\n chainingBehavior = function () { };\n }\n\n var chainableBehavior = {\n method: method\n , chainingBehavior: chainingBehavior\n };\n\n // save the methods so we can overwrite them later, if we need to.\n if (!ctx.__methods) {\n ctx.__methods = {};\n }\n ctx.__methods[name] = chainableBehavior;\n\n Object.defineProperty(ctx, name,\n { get: function () {\n chainableBehavior.chainingBehavior.call(this);\n\n var assert = function assert() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', assert);\n var result = chainableBehavior.method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n\n // Use `__proto__` if available\n if (hasProtoSupport) {\n // Inherit all properties from the object by replacing the `Function` prototype\n var prototype = assert.__proto__ = Object.create(this);\n // Restore the `call` and `apply` methods from `Function`\n prototype.call = call;\n prototype.apply = apply;\n }\n // Otherwise, redefine all properties (slow!)\n else {\n var asserterNames = Object.getOwnPropertyNames(ctx);\n asserterNames.forEach(function (asserterName) {\n if (!excludeNames.test(asserterName)) {\n var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);\n Object.defineProperty(assert, asserterName, pd);\n }\n });\n }\n\n transferFlags(this, assert);\n return assert;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - addMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\n\n/**\n * ### .addMethod (ctx, name, method)\n *\n * Adds a method to the prototype of an object.\n *\n * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(fooStr).to.be.foo('bar');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for name\n * @namespace Utils\n * @name addMethod\n * @api public\n */\nvar flag = require('./flag');\n\nmodule.exports = function (ctx, name, method) {\n ctx[name] = function () {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', ctx[name]);\n var result = method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - addProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\nvar flag = require('./flag');\n\n/**\n * ### addProperty (ctx, name, getter)\n *\n * Adds a property to the prototype of an object.\n *\n * utils.addProperty(chai.Assertion.prototype, 'foo', function () {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.instanceof(Foo);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.foo;\n *\n * @param {Object} ctx object to which the property is added\n * @param {String} name of property to add\n * @param {Function} getter function to be used for name\n * @namespace Utils\n * @name addProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n Object.defineProperty(ctx, name,\n { get: function addProperty() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', addProperty);\n\n var result = getter.call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - expectTypes utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### expectTypes(obj, types)\n *\n * Ensures that the object being tested against is of a valid type.\n *\n * utils.expectTypes(this, ['array', 'object', 'string']);\n *\n * @param {Mixed} obj constructed Assertion\n * @param {Array} type A list of allowed types for this assertion\n * @namespace Utils\n * @name expectTypes\n * @api public\n */\n\nvar AssertionError = require('assertion-error');\nvar flag = require('./flag');\nvar type = require('type-detect');\n\nmodule.exports = function (obj, types) {\n var obj = flag(obj, 'object');\n types = types.map(function (t) { return t.toLowerCase(); });\n types.sort();\n\n // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum'\n var str = types.map(function (t, index) {\n var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';\n var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';\n return or + art + ' ' + t;\n }).join(', ');\n\n if (!types.some(function (expected) { return type(obj) === expected; })) {\n throw new AssertionError(\n 'object tested must be ' + str + ', but ' + type(obj) + ' given'\n );\n }\n};\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### flag(object, key, [value])\n *\n * Get or set a flag value on an object. If a\n * value is provided it will be set, else it will\n * return the currently set value or `undefined` if\n * the value is not set.\n *\n * utils.flag(this, 'foo', 'bar'); // setter\n * utils.flag(this, 'foo'); // getter, returns `bar`\n *\n * @param {Object} object constructed Assertion\n * @param {String} key\n * @param {Mixed} value (optional)\n * @namespace Utils\n * @name flag\n * @api private\n */\n\nmodule.exports = function (obj, key, value) {\n var flags = obj.__flags || (obj.__flags = Object.create(null));\n if (arguments.length === 3) {\n flags[key] = value;\n } else {\n return flags[key];\n }\n};\n","/*!\n * Chai - getActual utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getActual(object, [actual])\n *\n * Returns the `actual` value for an Assertion\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getActual\n */\n\nmodule.exports = function (obj, args) {\n return args.length > 4 ? args[4] : obj._obj;\n};\n","/*!\n * Chai - getEnumerableProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getEnumerableProperties(object)\n *\n * This allows the retrieval of enumerable property names of an object,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getEnumerableProperties\n * @api public\n */\n\nmodule.exports = function getEnumerableProperties(object) {\n var result = [];\n for (var name in object) {\n result.push(name);\n }\n return result;\n};\n","/*!\n * Chai - message composition utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag')\n , getActual = require('./getActual')\n , inspect = require('./inspect')\n , objDisplay = require('./objDisplay');\n\n/**\n * ### .getMessage(object, message, negateMessage)\n *\n * Construct the error message based on flags\n * and template tags. Template tags will return\n * a stringified inspection of the object referenced.\n *\n * Message template tags:\n * - `#{this}` current asserted object\n * - `#{act}` actual value\n * - `#{exp}` expected value\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getMessage\n * @api public\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , val = flag(obj, 'object')\n , expected = args[3]\n , actual = getActual(obj, args)\n , msg = negate ? args[2] : args[1]\n , flagMsg = flag(obj, 'message');\n\n if(typeof msg === \"function\") msg = msg();\n msg = msg || '';\n msg = msg\n .replace(/#\\{this\\}/g, function () { return objDisplay(val); })\n .replace(/#\\{act\\}/g, function () { return objDisplay(actual); })\n .replace(/#\\{exp\\}/g, function () { return objDisplay(expected); });\n\n return flagMsg ? flagMsg + ': ' + msg : msg;\n};\n","/*!\n * Chai - getName utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getName(func)\n *\n * Gets the name of a function, in a cross-browser way.\n *\n * @param {Function} a function (usually a constructor)\n * @namespace Utils\n * @name getName\n */\n\nmodule.exports = function (func) {\n if (func.name) return func.name;\n\n var match = /^\\s?function ([^(]*)\\(/.exec(func);\n return match && match[1] ? match[1] : \"\";\n};\n","/*!\n * Chai - getPathInfo utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar hasProperty = require('./hasProperty');\n\n/**\n * ### .getPathInfo(path, object)\n *\n * This allows the retrieval of property info in an\n * object given a string path.\n *\n * The path info consists of an object with the\n * following properties:\n *\n * * parent - The parent object of the property referenced by `path`\n * * name - The name of the final property, a number if it was an array indexer\n * * value - The value of the property, if it exists, otherwise `undefined`\n * * exists - Whether the property exists or not\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} info\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nmodule.exports = function getPathInfo(path, obj) {\n var parsed = parsePath(path),\n last = parsed[parsed.length - 1];\n\n var info = {\n parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj,\n name: last.p || last.i,\n value: _getPathValue(parsed, obj)\n };\n info.exists = hasProperty(info.name, info.parent);\n\n return info;\n};\n\n\n/*!\n * ## parsePath(path)\n *\n * Helper function used to parse string object\n * paths. Use in conjunction with `_getPathValue`.\n *\n * var parsed = parsePath('myobject.property.subprop');\n *\n * ### Paths:\n *\n * * Can be as near infinitely deep and nested\n * * Arrays are also valid using the formal `myobject.document[3].property`.\n * * Literal dots and brackets (not delimiter) must be backslash-escaped.\n *\n * @param {String} path\n * @returns {Object} parsed\n * @api private\n */\n\nfunction parsePath (path) {\n var str = path.replace(/([^\\\\])\\[/g, '$1.[')\n , parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n return parts.map(function (value) {\n var re = /^\\[(\\d+)\\]$/\n , mArr = re.exec(value);\n if (mArr) return { i: parseFloat(mArr[1]) };\n else return { p: value.replace(/\\\\([.\\[\\]])/g, '$1') };\n });\n}\n\n\n/*!\n * ## _getPathValue(parsed, obj)\n *\n * Helper companion function for `.parsePath` that returns\n * the value located at the parsed address.\n *\n * var value = getPathValue(parsed, obj);\n *\n * @param {Object} parsed definition from `parsePath`.\n * @param {Object} object to search against\n * @param {Number} object to search against\n * @returns {Object|Undefined} value\n * @api private\n */\n\nfunction _getPathValue (parsed, obj, index) {\n var tmp = obj\n , res;\n\n index = (index === undefined ? parsed.length : index);\n\n for (var i = 0, l = index; i < l; i++) {\n var part = parsed[i];\n if (tmp) {\n if ('undefined' !== typeof part.p)\n tmp = tmp[part.p];\n else if ('undefined' !== typeof part.i)\n tmp = tmp[part.i];\n if (i == (l - 1)) res = tmp;\n } else {\n res = undefined;\n }\n }\n return res;\n}\n","/*!\n * Chai - getPathValue utility\n * Copyright(c) 2012-2014 Jake Luer \n * @see https://github.com/logicalparadox/filtr\n * MIT Licensed\n */\n\nvar getPathInfo = require('./getPathInfo');\n\n/**\n * ### .getPathValue(path, object)\n *\n * This allows the retrieval of values in an\n * object given a string path.\n *\n * var obj = {\n * prop1: {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n * , prop2: {\n * arr: [ { nested: 'Universe' } ]\n * , str: 'Hello again!'\n * }\n * }\n *\n * The following would be the results.\n *\n * getPathValue('prop1.str', obj); // Hello\n * getPathValue('prop1.att[2]', obj); // b\n * getPathValue('prop2.arr[0].nested', obj); // Universe\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} value or `undefined`\n * @namespace Utils\n * @name getPathValue\n * @api public\n */\nmodule.exports = function(path, obj) {\n var info = getPathInfo(path, obj);\n return info.value;\n};\n","/*!\n * Chai - getProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getProperties(object)\n *\n * This allows the retrieval of property names of an object, enumerable or not,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getProperties\n * @api public\n */\n\nmodule.exports = function getProperties(object) {\n var result = Object.getOwnPropertyNames(object);\n\n function addProperty(property) {\n if (result.indexOf(property) === -1) {\n result.push(property);\n }\n }\n\n var proto = Object.getPrototypeOf(object);\n while (proto !== null) {\n Object.getOwnPropertyNames(proto).forEach(addProperty);\n proto = Object.getPrototypeOf(proto);\n }\n\n return result;\n};\n","/*!\n * Chai - hasProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar type = require('type-detect');\n\n/**\n * ### .hasProperty(object, name)\n *\n * This allows checking whether an object has\n * named property or numeric array index.\n *\n * Basically does the same thing as the `in`\n * operator but works properly with natives\n * and null/undefined values.\n *\n * var obj = {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n *\n * The following would be the results.\n *\n * hasProperty('str', obj); // true\n * hasProperty('constructor', obj); // true\n * hasProperty('bar', obj); // false\n *\n * hasProperty('length', obj.str); // true\n * hasProperty(1, obj.str); // true\n * hasProperty(5, obj.str); // false\n *\n * hasProperty('length', obj.arr); // true\n * hasProperty(2, obj.arr); // true\n * hasProperty(3, obj.arr); // false\n *\n * @param {Objuect} object\n * @param {String|Number} name\n * @returns {Boolean} whether it exists\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nvar literals = {\n 'number': Number\n , 'string': String\n};\n\nmodule.exports = function hasProperty(name, obj) {\n var ot = type(obj);\n\n // Bad Object, obviously no props at all\n if(ot === 'null' || ot === 'undefined')\n return false;\n\n // The `in` operator does not work with certain literals\n // box these before the check\n if(literals[ot] && typeof obj !== 'object')\n obj = new literals[ot](obj);\n\n return name in obj;\n};\n","/*!\n * chai\n * Copyright(c) 2011 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Main exports\n */\n\nvar exports = module.exports = {};\n\n/*!\n * test utility\n */\n\nexports.test = require('./test');\n\n/*!\n * type utility\n */\n\nexports.type = require('type-detect');\n\n/*!\n * expectTypes utility\n */\nexports.expectTypes = require('./expectTypes');\n\n/*!\n * message utility\n */\n\nexports.getMessage = require('./getMessage');\n\n/*!\n * actual utility\n */\n\nexports.getActual = require('./getActual');\n\n/*!\n * Inspect util\n */\n\nexports.inspect = require('./inspect');\n\n/*!\n * Object Display util\n */\n\nexports.objDisplay = require('./objDisplay');\n\n/*!\n * Flag utility\n */\n\nexports.flag = require('./flag');\n\n/*!\n * Flag transferring utility\n */\n\nexports.transferFlags = require('./transferFlags');\n\n/*!\n * Deep equal utility\n */\n\nexports.eql = require('deep-eql');\n\n/*!\n * Deep path value\n */\n\nexports.getPathValue = require('./getPathValue');\n\n/*!\n * Deep path info\n */\n\nexports.getPathInfo = require('./getPathInfo');\n\n/*!\n * Check if a property exists\n */\n\nexports.hasProperty = require('./hasProperty');\n\n/*!\n * Function name\n */\n\nexports.getName = require('./getName');\n\n/*!\n * add Property\n */\n\nexports.addProperty = require('./addProperty');\n\n/*!\n * add Method\n */\n\nexports.addMethod = require('./addMethod');\n\n/*!\n * overwrite Property\n */\n\nexports.overwriteProperty = require('./overwriteProperty');\n\n/*!\n * overwrite Method\n */\n\nexports.overwriteMethod = require('./overwriteMethod');\n\n/*!\n * Add a chainable method\n */\n\nexports.addChainableMethod = require('./addChainableMethod');\n\n/*!\n * Overwrite chainable method\n */\n\nexports.overwriteChainableMethod = require('./overwriteChainableMethod');\n","// This is (almost) directly from Node.js utils\n// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js\n\nvar getName = require('./getName');\nvar getProperties = require('./getProperties');\nvar getEnumerableProperties = require('./getEnumerableProperties');\n\nmodule.exports = inspect;\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Boolean} showHidden Flag that shows hidden (not enumerable)\n * properties of objects.\n * @param {Number} depth Depth in which to descend in object. Default is 2.\n * @param {Boolean} colors Flag to turn on ANSI escape codes to color the\n * output. Default is false (no coloring).\n * @namespace Utils\n * @name inspect\n */\nfunction inspect(obj, showHidden, depth, colors) {\n var ctx = {\n showHidden: showHidden,\n seen: [],\n stylize: function (str) { return str; }\n };\n return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));\n}\n\n// Returns true if object is a DOM element.\nvar isDOMElement = function (object) {\n if (typeof HTMLElement === 'object') {\n return object instanceof HTMLElement;\n } else {\n return object &&\n typeof object === 'object' &&\n object.nodeType === 1 &&\n typeof object.nodeName === 'string';\n }\n};\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (value && typeof value.inspect === 'function' &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes);\n if (typeof ret !== 'string') {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // If this is a DOM element, try to get the outer HTML.\n if (isDOMElement(value)) {\n if ('outerHTML' in value) {\n return value.outerHTML;\n // This value does not have an outerHTML attribute,\n // it could still be an XML element\n } else {\n // Attempt to serialize it\n try {\n if (document.xmlVersion) {\n var xmlSerializer = new XMLSerializer();\n return xmlSerializer.serializeToString(value);\n } else {\n // Firefox 11- do not support outerHTML\n // It does, however, support innerHTML\n // Use the following to render the element\n var ns = \"http://www.w3.org/1999/xhtml\";\n var container = document.createElementNS(ns, '_');\n\n container.appendChild(value.cloneNode(false));\n html = container.innerHTML\n .replace('><', '>' + value.innerHTML + '<');\n container.innerHTML = '';\n return html;\n }\n } catch (err) {\n // This could be a non-native DOM implementation,\n // continue with the normal flow:\n // printing the element as if it is an object.\n }\n }\n }\n\n // Look up the keys of the object.\n var visibleKeys = getEnumerableProperties(value);\n var keys = ctx.showHidden ? getProperties(value) : visibleKeys;\n\n // Some type of object without properties can be shortcutted.\n // In IE, errors have a single `stack` property, or if they are vanilla `Error`,\n // a `stack` plus `description` property; ignore those for consistency.\n if (keys.length === 0 || (isError(value) && (\n (keys.length === 1 && keys[0] === 'stack') ||\n (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')\n ))) {\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n return ctx.stylize('[Function' + nameSuffix + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n base = ' [Function' + nameSuffix + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n return formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n switch (typeof value) {\n case 'undefined':\n return ctx.stylize('undefined', 'undefined');\n\n case 'string':\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n\n case 'number':\n if (value === 0 && (1/value) === -Infinity) {\n return ctx.stylize('-0', 'number');\n }\n return ctx.stylize('' + value, 'number');\n\n case 'boolean':\n return ctx.stylize('' + value, 'boolean');\n }\n // For some reason typeof null is \"object\", so special case here.\n if (value === null) {\n return ctx.stylize('null', 'null');\n }\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (Object.prototype.hasOwnProperty.call(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str;\n if (value.__lookupGetter__) {\n if (value.__lookupGetter__(key)) {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n }\n if (visibleKeys.indexOf(key) < 0) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(value[key]) < 0) {\n if (recurseTimes === null) {\n str = formatValue(ctx, value[key], null);\n } else {\n str = formatValue(ctx, value[key], recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (typeof name === 'undefined') {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\nfunction isArray(ar) {\n return Array.isArray(ar) ||\n (typeof ar === 'object' && objectToString(ar) === '[object Array]');\n}\n\nfunction isRegExp(re) {\n return typeof re === 'object' && objectToString(re) === '[object RegExp]';\n}\n\nfunction isDate(d) {\n return typeof d === 'object' && objectToString(d) === '[object Date]';\n}\n\nfunction isError(e) {\n return typeof e === 'object' && objectToString(e) === '[object Error]';\n}\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar inspect = require('./inspect');\nvar config = require('../config');\n\n/**\n * ### .objDisplay (object)\n *\n * Determines if an object or an array matches\n * criteria to be inspected in-line for error\n * messages or should be truncated.\n *\n * @param {Mixed} javascript object to inspect\n * @name objDisplay\n * @namespace Utils\n * @api public\n */\n\nmodule.exports = function (obj) {\n var str = inspect(obj)\n , type = Object.prototype.toString.call(obj);\n\n if (config.truncateThreshold && str.length >= config.truncateThreshold) {\n if (type === '[object Function]') {\n return !obj.name || obj.name === ''\n ? '[Function]'\n : '[Function: ' + obj.name + ']';\n } else if (type === '[object Array]') {\n return '[ Array(' + obj.length + ') ]';\n } else if (type === '[object Object]') {\n var keys = Object.keys(obj)\n , kstr = keys.length > 2\n ? keys.splice(0, 2).join(', ') + ', ...'\n : keys.join(', ');\n return '{ Object (' + kstr + ') }';\n } else {\n return str;\n }\n } else {\n return str;\n }\n};\n","/*!\n * Chai - overwriteChainableMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Overwites an already existing chainable method\n * and provides access to the previous function or\n * property. Must return functions to be used for\n * name.\n *\n * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',\n * function (_super) {\n * }\n * , function (_super) {\n * }\n * );\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteChainableMethod('foo', fn, fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.have.length(3);\n * expect(myFoo).to.have.length.above(3);\n *\n * @param {Object} ctx object whose method / property is to be overwritten\n * @param {String} name of method / property to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @param {Function} chainingBehavior function that returns a function to be used for property\n * @namespace Utils\n * @name overwriteChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n var chainableBehavior = ctx.__methods[name];\n\n var _chainingBehavior = chainableBehavior.chainingBehavior;\n chainableBehavior.chainingBehavior = function () {\n var result = chainingBehavior(_chainingBehavior).call(this);\n return result === undefined ? this : result;\n };\n\n var _method = chainableBehavior.method;\n chainableBehavior.method = function () {\n var result = method(_method).apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - overwriteMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteMethod (ctx, name, fn)\n *\n * Overwites an already existing method and provides\n * access to previous function. Must return function\n * to be used for name.\n *\n * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {\n * return function (str) {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.value).to.equal(str);\n * } else {\n * _super.apply(this, arguments);\n * }\n * }\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.equal('bar');\n *\n * @param {Object} ctx object whose method is to be overwritten\n * @param {String} name of method to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @namespace Utils\n * @name overwriteMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method) {\n var _method = ctx[name]\n , _super = function () { return this; };\n\n if (_method && 'function' === typeof _method)\n _super = _method;\n\n ctx[name] = function () {\n var result = method(_super).apply(this, arguments);\n return result === undefined ? this : result;\n }\n};\n","/*!\n * Chai - overwriteProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteProperty (ctx, name, fn)\n *\n * Overwites an already existing property getter and provides\n * access to previous value. Must return function to use as getter.\n *\n * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {\n * return function () {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.name).to.equal('bar');\n * } else {\n * _super.call(this);\n * }\n * }\n * });\n *\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.ok;\n *\n * @param {Object} ctx object whose property is to be overwritten\n * @param {String} name of property to overwrite\n * @param {Function} getter function that returns a getter function to be used for name\n * @namespace Utils\n * @name overwriteProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n var _get = Object.getOwnPropertyDescriptor(ctx, name)\n , _super = function () {};\n\n if (_get && 'function' === typeof _get.get)\n _super = _get.get\n\n Object.defineProperty(ctx, name,\n { get: function () {\n var result = getter(_super).call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - test utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag');\n\n/**\n * # test(object, expression)\n *\n * Test and object for expression.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name test\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , expr = args[0];\n return negate ? !expr : expr;\n};\n","/*!\n * Chai - transferFlags utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### transferFlags(assertion, object, includeAll = true)\n *\n * Transfer all the flags for `assertion` to `object`. If\n * `includeAll` is set to `false`, then the base Chai\n * assertion flags (namely `object`, `ssfi`, and `message`)\n * will not be transferred.\n *\n *\n * var newAssertion = new Assertion();\n * utils.transferFlags(assertion, newAssertion);\n *\n * var anotherAsseriton = new Assertion(myObj);\n * utils.transferFlags(assertion, anotherAssertion, false);\n *\n * @param {Assertion} assertion the assertion to transfer the flags from\n * @param {Object} object the object to transfer the flags to; usually a new assertion\n * @param {Boolean} includeAll\n * @namespace Utils\n * @name transferFlags\n * @api private\n */\n\nmodule.exports = function (assertion, object, includeAll) {\n var flags = assertion.__flags || (assertion.__flags = Object.create(null));\n\n if (!object.__flags) {\n object.__flags = Object.create(null);\n }\n\n includeAll = arguments.length === 3 ? includeAll : true;\n\n for (var flag in flags) {\n if (includeAll ||\n (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {\n object.__flags[flag] = flags[flag];\n }\n }\n};\n","module.exports = require('./lib/eql');\n","/*!\n * deep-eql\n * Copyright(c) 2013 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar type = require('type-detect');\n\n/*!\n * Buffer.isBuffer browser shim\n */\n\nvar Buffer;\ntry { Buffer = require('buffer').Buffer; }\ncatch(ex) {\n Buffer = {};\n Buffer.isBuffer = function() { return false; }\n}\n\n/*!\n * Primary Export\n */\n\nmodule.exports = deepEqual;\n\n/**\n * Assert super-strict (egal) equality between\n * two objects of any type.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @param {Array} memoised (optional)\n * @return {Boolean} equal match\n */\n\nfunction deepEqual(a, b, m) {\n if (sameValue(a, b)) {\n return true;\n } else if ('date' === type(a)) {\n return dateEqual(a, b);\n } else if ('regexp' === type(a)) {\n return regexpEqual(a, b);\n } else if (Buffer.isBuffer(a)) {\n return bufferEqual(a, b);\n } else if ('arguments' === type(a)) {\n return argumentsEqual(a, b, m);\n } else if (!typeEqual(a, b)) {\n return false;\n } else if (('object' !== type(a) && 'object' !== type(b))\n && ('array' !== type(a) && 'array' !== type(b))) {\n return sameValue(a, b);\n } else {\n return objectEqual(a, b, m);\n }\n}\n\n/*!\n * Strict (egal) equality test. Ensures that NaN always\n * equals NaN and `-0` does not equal `+0`.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} equal match\n */\n\nfunction sameValue(a, b) {\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n return a !== a && b !== b;\n}\n\n/*!\n * Compare the types of two given objects and\n * return if they are equal. Note that an Array\n * has a type of `array` (not `object`) and arguments\n * have a type of `arguments` (not `array`/`object`).\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction typeEqual(a, b) {\n return type(a) === type(b);\n}\n\n/*!\n * Compare two Date objects by asserting that\n * the time values are equal using `saveValue`.\n *\n * @param {Date} a\n * @param {Date} b\n * @return {Boolean} result\n */\n\nfunction dateEqual(a, b) {\n if ('date' !== type(b)) return false;\n return sameValue(a.getTime(), b.getTime());\n}\n\n/*!\n * Compare two regular expressions by converting them\n * to string and checking for `sameValue`.\n *\n * @param {RegExp} a\n * @param {RegExp} b\n * @return {Boolean} result\n */\n\nfunction regexpEqual(a, b) {\n if ('regexp' !== type(b)) return false;\n return sameValue(a.toString(), b.toString());\n}\n\n/*!\n * Assert deep equality of two `arguments` objects.\n * Unfortunately, these must be sliced to arrays\n * prior to test to ensure no bad behavior.\n *\n * @param {Arguments} a\n * @param {Arguments} b\n * @param {Array} memoize (optional)\n * @return {Boolean} result\n */\n\nfunction argumentsEqual(a, b, m) {\n if ('arguments' !== type(b)) return false;\n a = [].slice.call(a);\n b = [].slice.call(b);\n return deepEqual(a, b, m);\n}\n\n/*!\n * Get enumerable properties of a given object.\n *\n * @param {Object} a\n * @return {Array} property names\n */\n\nfunction enumerable(a) {\n var res = [];\n for (var key in a) res.push(key);\n return res;\n}\n\n/*!\n * Simple equality for flat iterable objects\n * such as Arrays or Node.js buffers.\n *\n * @param {Iterable} a\n * @param {Iterable} b\n * @return {Boolean} result\n */\n\nfunction iterableEqual(a, b) {\n if (a.length !== b.length) return false;\n\n var i = 0;\n var match = true;\n\n for (; i < a.length; i++) {\n if (a[i] !== b[i]) {\n match = false;\n break;\n }\n }\n\n return match;\n}\n\n/*!\n * Extension to `iterableEqual` specifically\n * for Node.js Buffers.\n *\n * @param {Buffer} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction bufferEqual(a, b) {\n if (!Buffer.isBuffer(b)) return false;\n return iterableEqual(a, b);\n}\n\n/*!\n * Block for `objectEqual` ensuring non-existing\n * values don't get in.\n *\n * @param {Mixed} object\n * @return {Boolean} result\n */\n\nfunction isValue(a) {\n return a !== null && a !== undefined;\n}\n\n/*!\n * Recursively check the equality of two objects.\n * Once basic sameness has been established it will\n * defer to `deepEqual` for each enumerable key\n * in the object.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction objectEqual(a, b, m) {\n if (!isValue(a) || !isValue(b)) {\n return false;\n }\n\n if (a.prototype !== b.prototype) {\n return false;\n }\n\n var i;\n if (m) {\n for (i = 0; i < m.length; i++) {\n if ((m[i][0] === a && m[i][1] === b)\n || (m[i][0] === b && m[i][1] === a)) {\n return true;\n }\n }\n } else {\n m = [];\n }\n\n try {\n var ka = enumerable(a);\n var kb = enumerable(b);\n } catch (ex) {\n return false;\n }\n\n ka.sort();\n kb.sort();\n\n if (!iterableEqual(ka, kb)) {\n return false;\n }\n\n m.push([ a, b ]);\n\n var key;\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], m)) {\n return false;\n }\n }\n\n return true;\n}\n","module.exports = require('./lib/type');\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/*!\n * Detectable javascript natives\n */\n\nvar natives = {\n '[object Array]': 'array'\n , '[object RegExp]': 'regexp'\n , '[object Function]': 'function'\n , '[object Arguments]': 'arguments'\n , '[object Date]': 'date'\n};\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\n\nfunction getType (obj) {\n var str = Object.prototype.toString.call(obj);\n if (natives[str]) return natives[str];\n if (obj === null) return 'null';\n if (obj === undefined) return 'undefined';\n if (obj === Object(obj)) return 'object';\n return typeof obj;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library () {\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function (type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function (obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","/*!\n localForage -- Offline Storage, Improved\n Version 1.5.0\n https://localforage.github.io/localForage\n (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && typeof obj === 'object' && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nexports.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nexports.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nexports.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nexports.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {}\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support (#5572)\n // since Safari 10.1 shipped with fetch, we can use that to detect it\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage && localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs;\nvar dbContexts;\nvar toString = Object.prototype.toString;\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, 'readwrite');\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve) {\n deferredOperation.resolve = resolve;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n resolve(openreq.result);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + ' can\\'t be downgraded from version ' + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Initialize a singleton container for all running localForages.\n if (!dbContexts) {\n dbContexts = {};\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n var req = store.put(value, key);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var advanced = false;\n var req = store.openCursor();\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var req = store.openCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys\n};\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' (id INTEGER PRIMARY KEY, key unique, value)', [], function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n t.executeSql('INSERT OR REPLACE INTO ' + dbInfo.storeName + ' (key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n t.executeSql('SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n\n resolve(result);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1\n};\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = dbInfo.name + '/';\n\n if (dbInfo.storeName !== self._defaultConfig.storeName) {\n dbInfo.keyPrefix += dbInfo.storeName + '/';\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n if (localStorage.key(i).indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(localStorage.key(i).substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n // Default API, from Gaia/localStorage.\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2\n};\n\n// Custom drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar CustomDrivers = {};\n\nvar DriverType = {\n INDEXEDDB: 'asyncStorage',\n LOCALSTORAGE: 'localStorageWrapper',\n WEBSQL: 'webSQLStorage'\n};\n\nvar DefaultDriverOrder = [DriverType.INDEXEDDB, DriverType.WEBSQL, DriverType.LOCALSTORAGE];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'];\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nvar driverSupport = {};\n// Check to see if IndexedDB is available and if it is the latest\n// implementation; it's our preferred backend library. We use \"_spec_test\"\n// as the name of the database because it's not the one we'll operate on,\n// but it's useful to make sure its using the right spec.\n// See: https://github.com/mozilla/localForage/issues/128\ndriverSupport[DriverType.INDEXEDDB] = isIndexedDBValid();\n\ndriverSupport[DriverType.WEBSQL] = isWebSQLValid();\n\ndriverSupport[DriverType.LOCALSTORAGE] = isLocalStorageValid();\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var key in arg) {\n if (arg.hasOwnProperty(key)) {\n if (isArray(arg[key])) {\n arguments[0][key] = arg[key].slice();\n } else {\n arguments[0][key] = arg[key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nfunction isLibraryDriver(driverName) {\n for (var driver in DriverType) {\n if (DriverType.hasOwnProperty(driver) && DriverType[driver] === driverName) {\n return true;\n }\n }\n\n return false;\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n this.INDEXEDDB = DriverType.INDEXEDDB;\n this.LOCALSTORAGE = DriverType.LOCALSTORAGE;\n this.WEBSQL = DriverType.WEBSQL;\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n var namingError = new Error('Custom driver name already in use: ' + driverObject._driver);\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n if (isLibraryDriver(driverObject._driver)) {\n reject(namingError);\n return;\n }\n\n var customDriverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0; i < customDriverMethods.length; i++) {\n var customDriverMethod = customDriverMethods[i];\n if (!customDriverMethod || !driverObject[customDriverMethod] || typeof driverObject[customDriverMethod] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var supportPromise = Promise$1.resolve(true);\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n supportPromise = driverObject._support();\n } else {\n supportPromise = Promise$1.resolve(!!driverObject._support);\n }\n }\n\n supportPromise.then(function (supportResult) {\n driverSupport[driverName] = supportResult;\n CustomDrivers[driverName] = driverObject;\n resolve();\n }, reject);\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var self = this;\n var getDriverPromise = Promise$1.resolve().then(function () {\n if (isLibraryDriver(driverName)) {\n switch (driverName) {\n case self.INDEXEDDB:\n return asyncStorage;\n case self.LOCALSTORAGE:\n return localStorageWrapper;\n case self.WEBSQL:\n return webSQLStorage;\n }\n } else if (CustomDrivers[driverName]) {\n return CustomDrivers[driverName];\n } else {\n throw new Error('Driver not found.');\n }\n });\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!driverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0; i < LibraryMethods.length; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nvar objectTypeRegexp = /^\\[object (.*)\\]$/;\n\nfunction getType(obj) {\n var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase();\n // Let \"new String('')\" return 'object'\n if (typeof Promise === 'function' && obj instanceof Promise) return 'promise';\n // PhantomJS has type \"DOMWindow\" for null\n if (obj === null) return 'null';\n // PhantomJS has type \"DOMWindow\" for undefined\n if (obj === undefined) return 'undefined';\n return type;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library() {\n if (!(this instanceof Library)) return new Library();\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function(type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function(obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","(function (document, window) {\n // DEPENDENCIES\n // ============================================================\n const localforage = require('localforage');\n\n // PROBLEMS\n // ============================================================\n const problems = require('../problems/arrays.js');\n\n // CONFIG\n // ============================================================\n\n // Hoist current problem\n let currentProblem;\n\n // Keys to ignore while user is navigating around the textarea but not changing any code\n const ignoreKeyCodes = [\n 9, // Tab\n 37, // Left arrow\n 39, // Right arrow\n 38, // Up arrow\n 40 // Down arrow\n ];\n\n let config = {\n shuffle: true,\n timer: false,\n currentIndex: 0\n };\n\n // Pull config from localforage\n localforage\n .getItem('js_practice_config')\n .then(val => {\n console.log('localforage val:', val);\n if (val) {\n config = val;\n }\n loadApp(config);\n })\n .catch(err => {\n console.log('localforage err:', err);\n loadApp(config);\n });\n\n function updateLocalstore(config) {\n return localforage\n .setItem('js_practice_config', config)\n .then(val => {\n console.log('Settings updated:', val);\n })\n .catch(err => {\n console.log('Settings update error:', err);\n });\n }\n\n // HELPERS\n // ============================================================\n\n function debounce(func, wait, immediate) {\n let timeout;\n return function () {\n const context = this;\n const args = arguments;\n const later = function () {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n }\n\n // UI\n // ============================================================\n\n // elements\n const problemEl = document.getElementById('problem');\n const codeEl = document.getElementById('code');\n const testSuiteEl = document.getElementById('test-suite');\n const testTotalEl = document.getElementById('test-total');\n const evalConsoleEl = document.getElementById('eval-output');\n const assertConsoleEl = document.getElementById('assert-output');\n const shuffleProblemsButtonEl = document.getElementById('shuffle-problems');\n const previousProblemButtonEl = document.getElementById('prev-problem');\n const nextProblemButtonEl = document.getElementById('next-problem');\n\n // Get indexes\n function getRandomIndex(problemsArr) {\n const ind = Math.floor(Math.random() * problemsArr.length);\n config.currentIndex = ind;\n updateLocalstore(config);\n return ind;\n }\n\n function getPreviousIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at beginning, go to end\n if (currentIndex === 0) {\n probInd = problemsArr.length - 1;\n } else {\n probInd = currentIndex - 1;\n }\n return probInd;\n }\n\n function getNextIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at end or invalid, restart series\n if (currentIndex >= problemsArr.length - 1 || currentIndex < 0) {\n probInd = 0;\n } else {\n probInd = currentIndex + 1;\n }\n return probInd;\n }\n\n // Get problems\n function getCurrentProblem(problemsArr) {\n return problemsArr[config.currentIndex];\n }\n\n function previousProblem() {\n console.log('previousProblem!');\n // Activate back button, for visual queue of nav feedback\n previousProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getPreviousIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function nextProblem() {\n console.log('nextProblem!');\n // Activate next button, for visual queue of nav feedback\n nextProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getNextIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function toggleShuffle() {\n console.log('toggle shuffle!');\n config.shuffle = !config.shuffle; // Flip it\n shuffleProblemsButtonEl.classList.toggle('active');\n previousProblemButtonEl.parentNode.classList.toggle('hidden');\n updateLocalstore(config);\n }\n\n function loadProblem(problemObj) {\n currentProblem = problemObj;\n // Prob question\n problemEl.innerText = problemObj.prompt;\n // Prob given code\n if (problemObj.given) {\n codeEl.value = problemObj.given;\n }\n // Seed the tests, pass (init = true) as second param\n testSuite(null, true);\n }\n\n // TODO: Build the assert errors into the test dom on each update.\n function updateTests(testStatus, init) {\n if (init === true) {\n buildTests(currentProblem.tests);\n }\n updateTestStatus(testStatus);\n }\n\n function buildTests(tests) {\n if (tests) {\n const testsDom = tests\n .map(test => {\n return `
\n
[✘]
\n
${test.name}
\n
`;\n })\n .join('');\n testSuiteEl.innerHTML = testsDom;\n }\n }\n\n function updateTestStatus(testStatuses) {\n if (!testStatuses) {\n throw new Error('No testStatuses provided.');\n }\n // Find out if all tests have passed or not\n let allPassed = true;\n testStatuses.forEach(testPassed => {\n if (testPassed !== true) {\n allPassed = false;\n }\n });\n const testEls = [].slice.call(testSuiteEl.querySelectorAll('.test-state'));\n testEls.forEach((testStatusEl, iter) => {\n if (testStatuses[iter] === true) {\n testStatusEl.innerHTML = '[✓]';\n testStatusEl.classList.remove('fail');\n testStatusEl.classList.add('pass');\n } else {\n testStatusEl.innerHTML = '[✘]';\n testStatusEl.classList.remove('pass');\n testStatusEl.classList.add('fail');\n }\n });\n\n if (allPassed === true) {\n testTotalEl.innerText = 'PASS';\n testTotalEl.classList.remove('fail');\n testTotalEl.classList.add('pass');\n } else {\n testTotalEl.innerText = 'FAIL';\n testTotalEl.classList.remove('pass');\n testTotalEl.classList.add('fail');\n }\n }\n\n function printAssertError(errObj) {\n // Make element string\n let inner = '';\n if (errObj !== null) {\n inner = `\n
\n Expected: ${JSON.stringify(errObj.expected)}\n Actual: ${JSON.stringify(errObj.actual)}\n
`;\n }\n\n // Prepend element\n assertConsoleEl.innerHTML = inner;\n }\n\n function printEvalOutput(errObj, output) {\n // Make element string\n let inner = '';\n if (errObj && errObj.message !== undefined) {\n inner = `\n
\n Syntax Error: ${JSON.stringify(errObj.message)}\n
`;\n } else if (output) {\n inner = `\n
\n Output: ${JSON.stringify(output)}\n
`;\n }\n // Prepend element\n evalConsoleEl.innerHTML = inner;\n }\n\n // VERIFICATION LOGIC\n // ============================================================\n\n function testSuite(init) {\n // Show 'working' indicator\n testTotalEl.classList.toggle('working');\n // Run stuff\n const output = getOutput(codeEl.value);\n // Run tests on code, return object/array of test results\n const tested = runTests(output);\n // Hide 'working' indicator\n testTotalEl.classList.toggle('working');\n // Update UI with results\n updateTests(tested, init);\n }\n\n function getOutput(code) {\n let evald = false;\n try {\n evald = eval(`(function(){${code}})()`); // eslint-disable-line no-eval\n printEvalOutput(null, evald); // Print current output\n } catch (err) {\n printEvalOutput(err);\n }\n return evald;\n }\n\n function runTests(output) {\n let tested = false;\n tested = currentProblem.tests.map(test => {\n let testOutcome = false;\n try {\n if (output) {\n testOutcome = test.test(output);\n }\n printAssertError(null);\n } catch (err) {\n printAssertError(err);\n }\n return testOutcome;\n });\n return tested;\n }\n\n // Wrapped to prevent race with local config retrieval\n function loadApp(config) {\n console.log('loading app!');\n\n // Show current toggle state\n if (config.shuffle === true) {\n shuffleProblemsButtonEl.classList.add('active');\n previousProblemButtonEl.parentNode.classList.add('hidden');\n }\n\n // Keybinding stuff\n // ============================================================\n\n // Debounced code validation\n const debouncedInputValidation = debounce(e => {\n // If not arrow keys or other non-character keys\n if (ignoreKeyCodes.indexOf(e.keyCode) === -1) {\n // Run test suite\n testSuite();\n }\n }, 200);\n\n function problemNav(e) {\n // Go to previous problem keybinding\n // If CMD/CTRL + SHIFT + RETURN/ENTER\n if (config.shuffle === false && e.keyCode === 13 && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem\n previousProblem();\n } else if (e.keyCode === 13 && !e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem keybinding\n // If CMD/CTRL + RETURN/ENTER\n // Go to next problem\n nextProblem();\n }\n }\n\n // Event Bindings\n // ============================================================\n\n // Bind it up\n codeEl.addEventListener('keydown', debouncedInputValidation);\n document.addEventListener('keydown', problemNav);\n shuffleProblemsButtonEl.addEventListener('click', toggleShuffle);\n previousProblemButtonEl.addEventListener('click', previousProblem);\n nextProblemButtonEl.addEventListener('click', nextProblem);\n\n // Start it up!\n // Load current problem\n const currProb = getCurrentProblem(problems);\n loadProblem(currProb);\n // Initalized test suite with starting failures\n testSuite(true);\n }\n})(document, window);\n","const assert = require('chai').assert;\n\nmodule.exports = [\n {\n name: 'Create Array',\n time: 10,\n prompt: 'Create and return an array that contains \\'apple\\' and \\'banana\\'',\n given: `const fruits = [];\\rreturn fruits;`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['apple', 'banana']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[0];`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'apple') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'orange') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[1];`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'banana') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.forEach()',\n time: 20,\n prompt: 'Loop over the array, add an \\'x\\' to the end of each name, push each fruit into a new array, then return the new array.',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['applex', 'bananax']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.push()',\n time: 10,\n prompt: `Add 'orange' to the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 3 items',\n test(output) {\n return assert.lengthOf(output, 3) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.pop()',\n time: 10,\n prompt: `Remove 'orange' from the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['apple', 'banana']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.shift()',\n time: 10,\n prompt: `Remove 'apple' from the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test(output) {\n return assert.deepEqual(output, ['banana', 'orange']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.unshift()',\n time: 10,\n prompt: `Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined\n );\n }\n },\n {\n name: 'Must return an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.indexOf()',\n time: 10,\n prompt: `Return the index of 'banana' in the Array.`,\n given: `const fruits = ['strawberry', 'banana', 'mango'];\\r`,\n answer: `const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 1) === undefined;\n }\n },\n {\n name: 'Returns a Number',\n test(output) {\n return assert.isNumber(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.concat()',\n time: 10,\n prompt: `Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,\n given: `const fruits = ['strawberry', 'banana'];\\rconst otherFruits = ['pear','peach'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\\r`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.join()',\n time: 10,\n prompt: `Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.`,\n given: `const fruits = ['strawberry', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\\r`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'strawberry-banana') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.slice()',\n time: 20,\n prompt: `Return just the citrus fruits from the 'fruits' array using 'Array.slice()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['orange', 'lemon']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.reverse()',\n time: 10,\n prompt: `Reverse the order of the 'fruit' array using 'Array.reverse()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined\n );\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n },\n {\n name: `First item is 'banana'`,\n test(output) {\n return assert.deepEqual(output[0], 'banana') === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.sort()',\n time: 10,\n prompt: `Sort the order of the 'fruit' array using 'Array.sort()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined\n );\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n },\n {\n name: `First item is 'banana'`,\n test(output) {\n return assert.deepEqual(output[0], 'banana') === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: `Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'`,\n given: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\\r`,\n answer: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 3) === undefined;\n }\n },\n {\n name: 'Returns a Number',\n test(output) {\n return assert.isNumber(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.filter()',\n time: 10,\n prompt: `Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'`,\n given: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\\r`,\n answer: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, [8, 13, 21]) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 3 items',\n test(output) {\n return assert.lengthOf(output, 3) === undefined;\n }\n },\n {\n name: `First item is 8`,\n test(output) {\n return assert.deepEqual(output[0], 8) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.map()',\n time: 10,\n prompt: `Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'`,\n given: `const numbers = [25, 121, 169];\\r`,\n answer: `const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, [5, 11, 13]) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 3 items',\n test(output) {\n return assert.lengthOf(output, 3) === undefined;\n }\n },\n {\n name: `First item is 5`,\n test(output) {\n return assert.deepEqual(output[0], 5) === undefined;\n }\n },\n {\n name: `Last item is 13`,\n test(output) {\n return assert.deepEqual(output[output.length - 1], 13) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.every()',\n time: 10,\n prompt: `Return object that returns whether each array contains all even numbers using Array.every().`,\n given: `\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};`,\n answer: `\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n return element % 2 === 0\n}\nreturn {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n};`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;\n }\n },\n {\n name: 'Returns an Object',\n test(output) {\n return assert.isObject(output) === undefined;\n }\n },\n {\n name: 'Object has 2 items',\n test(output) {\n return assert.lengthOf(Object.keys(output), 2) === undefined;\n }\n },\n {\n name: `First value is true`,\n test(output) {\n return assert.isTrue(output.evenNumbers) === undefined;\n }\n },\n {\n name: `Second value is false`,\n test(output) {\n return assert.isFalse(output.someOddNumbers) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.some()',\n time: 10,\n prompt: `Return object that returns whether each array contains some odd numbers using Array.some().`,\n given: `\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 4, 7, 8];\nfunction isOdd(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};`,\n answer: `\nconst evenNumbers = [1, 3, 5, 7];\nconst someOddNumbers = [1, 3, 6, 7];\nfunction isOdd(element) {\n return element % 2 !== 0;\n}\nreturn {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n};`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;\n }\n },\n {\n name: 'Returns an Object',\n test(output) {\n return assert.isObject(output) === undefined;\n }\n },\n {\n name: 'Object has 2 items',\n test(output) {\n return assert.lengthOf(Object.keys(output), 2) === undefined;\n }\n },\n {\n name: `First value is false`,\n test(output) {\n return assert.isFalse(output.evenNumbers) === undefined;\n }\n },\n {\n name: `Second value is true`,\n test(output) {\n return assert.isTrue(output.someOddNumbers) === undefined;\n }\n }\n ]\n }\n // Next problems to create:\n // forEach? fix one above that tried, but can't verify forEach was used\n // some\n // reduce\n // reduceRight\n // Array.from and other ways to turn array-like into array\n];\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/.registry.npmjs.org/browser-pack/6.0.2/node_modules/browser-pack/_prelude.js","node_modules/.registry.npmjs.org/assertion-error/1.0.2/node_modules/assertion-error/index.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/index.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/assertion.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/config.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/core/assertions.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/interface/assert.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/interface/expect.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/interface/should.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/addChainableMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/addMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/addProperty.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/expectTypes.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/flag.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getActual.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getEnumerableProperties.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getMessage.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getName.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getPathInfo.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getPathValue.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getProperties.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/hasProperty.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/index.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/inspect.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/objDisplay.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/overwriteMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/overwriteProperty.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/test.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/transferFlags.js","node_modules/.registry.npmjs.org/deep-eql/0.1.3/node_modules/deep-eql/index.js","node_modules/.registry.npmjs.org/deep-eql/0.1.3/node_modules/deep-eql/lib/eql.js","node_modules/.registry.npmjs.org/localforage/1.5.0/node_modules/localforage/dist/node_modules/localforage/dist/localforage.js","node_modules/.registry.npmjs.org/type-detect/0.1.1/node_modules/type-detect/index.js","node_modules/.registry.npmjs.org/type-detect/0.1.1/node_modules/type-detect/lib/type.js","node_modules/.registry.npmjs.org/type-detect/1.0.0/node_modules/type-detect/lib/type.js","src/js/index.js","src/problems/arrays.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","exclude","excludeProps","res","obj","Object","keys","forEach","key","excludes","indexOf","slice","arguments","args","AssertionError","message","_props","ssf","extend","props","this","showDiff","callee","captureStackTrace","stack","prototype","create","name","constructor","toJSON","used","version","util","use","fn","push","config","assertion","core","expect","should","assert","_chai","Assertion","msg","flag","defineProperty","get","console","warn","includeStack","set","value","addProperty","addMethod","addChainableMethod","chainingBehavior","overwriteProperty","overwriteMethod","overwriteChainableMethod","expr","negateMsg","expected","_actual","ok","test","getMessage","actual","getActual","val","truncateThreshold","chai","_","an","type","toLowerCase","article","charAt","includeChainingBehavior","include","expectTypes","eql","k","property","subset","undefined","inspect","checkArguments","toString","assertEqual","_obj","assertEql","assertAbove","to","have","len","assertLeast","assertBelow","assertMost","assertInstanceOf","getName","assertOwnProperty","hasOwnProperty","assertOwnPropertyDescriptor","descriptor","actualDescriptor","getOwnPropertyDescriptor","assertLengthChain","assertLength","assertMatch","re","exec","assertKeys","str","mixedArgsMsg","Array","any","all","filter","every","map","last","pop","join","sort","assertThrows","errMsg","is","thrown","desiredError","thrownError","RegExp","err","actuallyGot","expectedThrown","respondTo","method","itself","context","satisfy","matcher","result","objDisplay","negate","closeTo","delta","Math","abs","isSubsetOf","superset","cmp","elem","some","elem2","oneOf","list","be","assertChanges","object","prop","initial","assertIncreases","assertDecreases","chain","isNaN","isArray","start","finish","range","isDeep","pathInfo","getPathInfo","hasProperty","exists","isExtensible","TypeError","isSealed","isFrozen","express","errmsg","fail","operator","isOk","isNotOk","not","equal","act","exp","notEqual","strictEqual","notStrictEqual","deepEqual","notDeepEqual","isAbove","abv","above","isAtLeast","atlst","least","isBelow","blw","below","isAtMost","atmst","most","isTrue","isNotTrue","isFalse","isNotFalse","isNull","isNotNull","NaN","isNotNaN","isUndefined","isDefined","isFunction","isNotFunction","isObject","isNotObject","isNotArray","isString","isNotString","isNumber","isNotNumber","isBoolean","isNotBoolean","typeOf","notTypeOf","instanceOf","notInstanceOf","inc","notInclude","match","notMatch","notProperty","deepProperty","deep","notDeepProperty","propertyVal","propertyNotVal","deepPropertyVal","deepPropertyNotVal","lengthOf","throws","errt","errs","assertErr","throw","doesNotThrow","Throw","val2","approximately","sameMembers","set1","set2","same","members","sameDeepMembers","includeMembers","includeDeepMembers","inList","changes","change","doesNotChange","increases","increase","doesNotIncrease","decreases","decrease","doesNotDecrease","ifError","extensible","isNotExtensible","sealed","isNotSealed","frozen","isNotFrozen","alias","as","loadShould","shouldGetter","String","Number","Boolean","valueOf","shouldSetter","enumerable","configurable","writable","val1","exist","Should","transferFlags","hasProtoSupport","excludeNames","Function","apply","ctx","chainableBehavior","__methods","__proto__","getOwnPropertyNames","asserterName","pd","getter","types","index","art","flags","__flags","flagMsg","replace","func","parsePath","path","mArr","parseFloat","p","_getPathValue","parsed","tmp","part","info","parent","proto","getPrototypeOf","literals","number","string","ot","getPathValue","showHidden","depth","colors","formatValue","seen","stylize","recurseTimes","ret","primitive","formatPrimitive","isDOMElement","outerHTML","document","xmlVersion","XMLSerializer","serializeToString","container","createElementNS","appendChild","cloneNode","html","innerHTML","visibleKeys","getEnumerableProperties","getProperties","isError","nameSuffix","isRegExp","isDate","Date","toUTCString","formatError","base","array","braces","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","Infinity","__lookupGetter__","__lookupSetter__","split","line","substr","numLinesEst","reduce","prev","cur","ar","objectToString","d","HTMLElement","nodeType","nodeName","splice","_chainingBehavior","_method","_super","_get","includeAll","b","m","sameValue","dateEqual","regexpEqual","Buffer","isBuffer","bufferEqual","argumentsEqual","typeEqual","objectEqual","getTime","iterableEqual","isValue","ka","kb","ex","define","amd","g","window","global","self","localforage","_dereq_","nextTick","draining","oldQueue","queue","immediate","task","scheduleDrain","Mutation","MutationObserver","WebKitMutationObserver","called","observer","element","createTextNode","observe","characterData","data","setImmediate","MessageChannel","createElement","scriptEl","onreadystatechange","parentNode","removeChild","documentElement","setTimeout","channel","port1","onmessage","port2","postMessage","2","INTERNAL","Promise","resolver","state","PENDING","outcome","safelyResolveThenable","QueueItem","promise","onFulfilled","onRejected","callFulfilled","otherCallFulfilled","callRejected","otherCallRejected","unwrap","returnValue","handlers","reject","resolve","getThen","then","thenable","onError","onSuccess","tryToUnwrap","tryCatch","status","out","reason","iterable","values","resolved","resolveFromAll","outValue","error","race","response","REJECTED","FULFILLED","3","4","_classCallCheck","instance","Constructor","createBlob","parts","properties","Blob","Builder","BlobBuilder","MSBlobBuilder","MozBlobBuilder","WebKitBlobBuilder","builder","append","getBlob","executeCallback","callback","executeTwoCallbacks","errorCallback","_binStringToArrayBuffer","bin","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","_checkBlobSupportWithoutCaching","idb","Promise$1","txn","transaction","DETECT_BLOB_SUPPORT_STORE","blob","objectStore","put","onabort","preventDefault","stopPropagation","oncomplete","matchedChrome","navigator","userAgent","matchedEdge","parseInt","_checkBlobSupport","supportsBlobs","_deferReadiness","dbInfo","dbContext","dbContexts","deferredOperation","deferredOperations","dbReady","_advanceReadiness","_getConnection","upgradeNeeded","db","close","dbArgs","openreq","open","onupgradeneeded","createObjectStore","storeName","oldVersion","newVersion","onerror","onsuccess","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","objectStoreNames","contains","isDowngrade","isUpgrade","incVersion","_encodeBlob","reader","FileReader","onloadend","base64","btoa","target","__local_forage_encoded_blob","readAsBinaryString","_decodeBlob","encodedBlob","atob","_isEncodedBlob","_fullyReady","_initReady","_dbInfo","_initStorage","options","ignoreErrors","forages","ready","initPromises","j","forage","_defaultConfig","getItem","store","req","iterate","iterator","openCursor","iterationNumber","cursor","setItem","blobSupport","removeItem","clear","count","advanced","advance","stringToBuffer","serializedString","encoded1","encoded2","encoded3","encoded4","bufferLength","buffer","bytes","BASE_CHARS","bufferToString","base64String","substring","serialize","valueType","toString$1","marker","SERIALIZED_MARKER","TYPE_ARRAYBUFFER","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_UINT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","fileReader","onload","BLOB_TYPE_PREFIX","TYPE_BLOB","readAsArrayBuffer","deserialize","SERIALIZED_MARKER_LENGTH","parse","blobType","TYPE_SERIALIZED_MARKER_LENGTH","BLOB_TYPE_PREFIX_REGEX","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","_initStorage$1","dbInfoPromise","openDatabase","description","size","executeSql","serializer","localforageSerializer","getItem$1","results","rows","item","iterate$1","_setItem","retriesLeft","originalValue","sqlError","QUOTA_ERR","setItem$1","removeItem$1","clear$1","length$1","c","key$1","keys$1","_initStorage$2","keyPrefix","clear$2","localStorage","getItem$2","iterate$2","keyPrefixLength","key$2","keys$2","length$2","removeItem$2","setItem$2","callWhenReady","localForageInstance","libraryMethod","_args","arg","isLibraryDriver","driverName","driver","DriverType","_typeof","Symbol","indexedDB","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","asyncStorage","_driver","webSQLStorage","localStorageWrapper","CustomDrivers","INDEXEDDB","LOCALSTORAGE","WEBSQL","DefaultDriverOrder","LibraryMethods","DefaultConfig","driverSupport","isSafari","platform","hasFetch","fetch","IDBKeyRange","LocalForage","_config","_driverSet","_initDriver","_ready","_wrapLibraryMethodsWithReady","setDriver","defineDriver","driverObject","complianceError","namingError","customDriverMethods","concat","customDriverMethod","supportPromise","_support","supportResult","getDriver","getDriverPromise","getSerializer","serializerPromise","drivers","setDriverToConfig","extendSelfWithDriver","_extend","initDriver","supportedDrivers","driverPromiseLoop","currentDriverIndex","_getSupportedDrivers","oldDriverSetDone","supports","libraryMethodsAndProperties","createInstance","localforage_js","getType","natives","Library","tests","[object Array]","[object RegExp]","[object Function]","[object Arguments]","[object Date]","of","ReferenceError","objectTypeRegexp","updateLocalstore","log","catch","debounce","wait","timeout","later","callNow","clearTimeout","getRandomIndex","problemsArr","ind","floor","random","currentIndex","getPreviousIndex","getNextIndex","getCurrentProblem","previousProblem","previousProblemButtonEl","classList","add","shuffle","problems","location","reload","nextProblem","nextProblemButtonEl","toggleShuffle","shuffleProblemsButtonEl","toggle","loadProblem","problemObj","currentProblem","problemEl","innerText","prompt","given","codeEl","testSuite","updateTests","testStatus","init","buildTests","updateTestStatus","testsDom","testSuiteEl","testStatuses","allPassed","testPassed","querySelectorAll","testStatusEl","iter","remove","testTotalEl","printAssertError","errObj","inner","assertConsoleEl","printEvalOutput","evalConsoleEl","getOutput","tested","runTests","evald","eval","testOutcome","loadApp","problemNav","keyCode","shiftKey","metaKey","ctrlKey","debouncedInputValidation","ignoreKeyCodes","addEventListener","timer","getElementById","time","answer","evenNumbers","someOddNumbers"],"mappings":"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","file":"bundle.min.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o\n * MIT Licensed\n */\n\n/*!\n * Return a function that will copy properties from\n * one object to another excluding any originally\n * listed. Returned function will create a new `{}`.\n *\n * @param {String} excluded properties ...\n * @return {Function}\n */\n\nfunction exclude () {\n var excludes = [].slice.call(arguments);\n\n function excludeProps (res, obj) {\n Object.keys(obj).forEach(function (key) {\n if (!~excludes.indexOf(key)) res[key] = obj[key];\n });\n }\n\n return function extendExclude () {\n var args = [].slice.call(arguments)\n , i = 0\n , res = {};\n\n for (; i < args.length; i++) {\n excludeProps(res, args[i]);\n }\n\n return res;\n };\n};\n\n/*!\n * Primary Exports\n */\n\nmodule.exports = AssertionError;\n\n/**\n * ### AssertionError\n *\n * An extension of the JavaScript `Error` constructor for\n * assertion and validation scenarios.\n *\n * @param {String} message\n * @param {Object} properties to include (optional)\n * @param {callee} start stack function (optional)\n */\n\nfunction AssertionError (message, _props, ssf) {\n var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')\n , props = extend(_props || {});\n\n // default values\n this.message = message || 'Unspecified AssertionError';\n this.showDiff = false;\n\n // copy from properties\n for (var key in props) {\n this[key] = props[key];\n }\n\n // capture stack trace\n ssf = ssf || arguments.callee;\n if (ssf && Error.captureStackTrace) {\n Error.captureStackTrace(this, ssf);\n } else {\n try {\n throw new Error();\n } catch(e) {\n this.stack = e.stack;\n }\n }\n}\n\n/*!\n * Inherit from Error.prototype\n */\n\nAssertionError.prototype = Object.create(Error.prototype);\n\n/*!\n * Statically set name\n */\n\nAssertionError.prototype.name = 'AssertionError';\n\n/*!\n * Ensure correct constructor\n */\n\nAssertionError.prototype.constructor = AssertionError;\n\n/**\n * Allow errors to be converted to JSON for static transfer.\n *\n * @param {Boolean} include stack (default: `true`)\n * @return {Object} object that can be `JSON.stringify`\n */\n\nAssertionError.prototype.toJSON = function (stack) {\n var extend = exclude('constructor', 'toJSON', 'stack')\n , props = extend({ name: this.name }, this);\n\n // include stack if exists and not turned off\n if (false !== stack && this.stack) {\n props.stack = this.stack;\n }\n\n return props;\n};\n","module.exports = require('./lib/chai');\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar used = []\n , exports = module.exports = {};\n\n/*!\n * Chai version\n */\n\nexports.version = '3.5.0';\n\n/*!\n * Assertion Error\n */\n\nexports.AssertionError = require('assertion-error');\n\n/*!\n * Utils for plugins (not exported)\n */\n\nvar util = require('./chai/utils');\n\n/**\n * # .use(function)\n *\n * Provides a way to extend the internals of Chai\n *\n * @param {Function}\n * @returns {this} for chaining\n * @api public\n */\n\nexports.use = function (fn) {\n if (!~used.indexOf(fn)) {\n fn(this, util);\n used.push(fn);\n }\n\n return this;\n};\n\n/*!\n * Utility Functions\n */\n\nexports.util = util;\n\n/*!\n * Configuration\n */\n\nvar config = require('./chai/config');\nexports.config = config;\n\n/*!\n * Primary `Assertion` prototype\n */\n\nvar assertion = require('./chai/assertion');\nexports.use(assertion);\n\n/*!\n * Core Assertions\n */\n\nvar core = require('./chai/core/assertions');\nexports.use(core);\n\n/*!\n * Expect interface\n */\n\nvar expect = require('./chai/interface/expect');\nexports.use(expect);\n\n/*!\n * Should interface\n */\n\nvar should = require('./chai/interface/should');\nexports.use(should);\n\n/*!\n * Assert interface\n */\n\nvar assert = require('./chai/interface/assert');\nexports.use(assert);\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('./config');\n\nmodule.exports = function (_chai, util) {\n /*!\n * Module dependencies.\n */\n\n var AssertionError = _chai.AssertionError\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n _chai.Assertion = Assertion;\n\n /*!\n * Assertion Constructor\n *\n * Creates object for chaining.\n *\n * @api private\n */\n\n function Assertion (obj, msg, stack) {\n flag(this, 'ssfi', stack || arguments.callee);\n flag(this, 'object', obj);\n flag(this, 'message', msg);\n }\n\n Object.defineProperty(Assertion, 'includeStack', {\n get: function() {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n return config.includeStack;\n },\n set: function(value) {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n config.includeStack = value;\n }\n });\n\n Object.defineProperty(Assertion, 'showDiff', {\n get: function() {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n return config.showDiff;\n },\n set: function(value) {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n config.showDiff = value;\n }\n });\n\n Assertion.addProperty = function (name, fn) {\n util.addProperty(this.prototype, name, fn);\n };\n\n Assertion.addMethod = function (name, fn) {\n util.addMethod(this.prototype, name, fn);\n };\n\n Assertion.addChainableMethod = function (name, fn, chainingBehavior) {\n util.addChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n Assertion.overwriteProperty = function (name, fn) {\n util.overwriteProperty(this.prototype, name, fn);\n };\n\n Assertion.overwriteMethod = function (name, fn) {\n util.overwriteMethod(this.prototype, name, fn);\n };\n\n Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {\n util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n /**\n * ### .assert(expression, message, negateMessage, expected, actual, showDiff)\n *\n * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.\n *\n * @name assert\n * @param {Philosophical} expression to be tested\n * @param {String|Function} message or function that returns message to display if expression fails\n * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails\n * @param {Mixed} expected value (remember to check for negation)\n * @param {Mixed} actual (optional) will default to `this.obj`\n * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails\n * @api private\n */\n\n Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {\n var ok = util.test(this, arguments);\n if (true !== showDiff) showDiff = false;\n if (true !== config.showDiff) showDiff = false;\n\n if (!ok) {\n var msg = util.getMessage(this, arguments)\n , actual = util.getActual(this, arguments);\n throw new AssertionError(msg, {\n actual: actual\n , expected: expected\n , showDiff: showDiff\n }, (config.includeStack) ? this.assert : flag(this, 'ssfi'));\n }\n };\n\n /*!\n * ### ._obj\n *\n * Quick reference to stored `actual` value for plugin developers.\n *\n * @api private\n */\n\n Object.defineProperty(Assertion.prototype, '_obj',\n { get: function () {\n return flag(this, 'object');\n }\n , set: function (val) {\n flag(this, 'object', val);\n }\n });\n};\n","module.exports = {\n\n /**\n * ### config.includeStack\n *\n * User configurable property, influences whether stack trace\n * is included in Assertion error message. Default of false\n * suppresses stack trace in the error message.\n *\n * chai.config.includeStack = true; // enable stack on error\n *\n * @param {Boolean}\n * @api public\n */\n\n includeStack: false,\n\n /**\n * ### config.showDiff\n *\n * User configurable property, influences whether or not\n * the `showDiff` flag should be included in the thrown\n * AssertionErrors. `false` will always be `false`; `true`\n * will be true when the assertion has requested a diff\n * be shown.\n *\n * @param {Boolean}\n * @api public\n */\n\n showDiff: true,\n\n /**\n * ### config.truncateThreshold\n *\n * User configurable property, sets length threshold for actual and\n * expected values in assertion errors. If this threshold is exceeded, for\n * example for large data structures, the value is replaced with something\n * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.\n *\n * Set it to zero if you want to disable truncating altogether.\n *\n * This is especially userful when doing assertions on arrays: having this\n * set to a reasonable large value makes the failure messages readily\n * inspectable.\n *\n * chai.config.truncateThreshold = 0; // disable truncating\n *\n * @param {Number}\n * @api public\n */\n\n truncateThreshold: 40\n\n};\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, _) {\n var Assertion = chai.Assertion\n , toString = Object.prototype.toString\n , flag = _.flag;\n\n /**\n * ### Language Chains\n *\n * The following are provided as chainable getters to\n * improve the readability of your assertions. They\n * do not provide testing capabilities unless they\n * have been overwritten by a plugin.\n *\n * **Chains**\n *\n * - to\n * - be\n * - been\n * - is\n * - that\n * - which\n * - and\n * - has\n * - have\n * - with\n * - at\n * - of\n * - same\n *\n * @name language chains\n * @namespace BDD\n * @api public\n */\n\n [ 'to', 'be', 'been'\n , 'is', 'and', 'has', 'have'\n , 'with', 'that', 'which', 'at'\n , 'of', 'same' ].forEach(function (chain) {\n Assertion.addProperty(chain, function () {\n return this;\n });\n });\n\n /**\n * ### .not\n *\n * Negates any of assertions following in the chain.\n *\n * expect(foo).to.not.equal('bar');\n * expect(goodFn).to.not.throw(Error);\n * expect({ foo: 'baz' }).to.have.property('foo')\n * .and.not.equal('bar');\n *\n * @name not\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('not', function () {\n flag(this, 'negate', true);\n });\n\n /**\n * ### .deep\n *\n * Sets the `deep` flag, later used by the `equal` and\n * `property` assertions.\n *\n * expect(foo).to.deep.equal({ bar: 'baz' });\n * expect({ foo: { bar: { baz: 'quux' } } })\n * .to.have.deep.property('foo.bar.baz', 'quux');\n *\n * `.deep.property` special characters can be escaped\n * by adding two slashes before the `.` or `[]`.\n *\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name deep\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('deep', function () {\n flag(this, 'deep', true);\n });\n\n /**\n * ### .any\n *\n * Sets the `any` flag, (opposite of the `all` flag)\n * later used in the `keys` assertion.\n *\n * expect(foo).to.have.any.keys('bar', 'baz');\n *\n * @name any\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('any', function () {\n flag(this, 'any', true);\n flag(this, 'all', false)\n });\n\n\n /**\n * ### .all\n *\n * Sets the `all` flag (opposite of the `any` flag)\n * later used by the `keys` assertion.\n *\n * expect(foo).to.have.all.keys('bar', 'baz');\n *\n * @name all\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('all', function () {\n flag(this, 'all', true);\n flag(this, 'any', false);\n });\n\n /**\n * ### .a(type)\n *\n * The `a` and `an` assertions are aliases that can be\n * used either as language chains or to assert a value's\n * type.\n *\n * // typeof\n * expect('test').to.be.a('string');\n * expect({ foo: 'bar' }).to.be.an('object');\n * expect(null).to.be.a('null');\n * expect(undefined).to.be.an('undefined');\n * expect(new Error).to.be.an('error');\n * expect(new Promise).to.be.a('promise');\n * expect(new Float32Array()).to.be.a('float32array');\n * expect(Symbol()).to.be.a('symbol');\n *\n * // es6 overrides\n * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo');\n *\n * // language chain\n * expect(foo).to.be.an.instanceof(Foo);\n *\n * @name a\n * @alias an\n * @param {String} type\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function an (type, msg) {\n if (msg) flag(this, 'message', msg);\n type = type.toLowerCase();\n var obj = flag(this, 'object')\n , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';\n\n this.assert(\n type === _.type(obj)\n , 'expected #{this} to be ' + article + type\n , 'expected #{this} not to be ' + article + type\n );\n }\n\n Assertion.addChainableMethod('an', an);\n Assertion.addChainableMethod('a', an);\n\n /**\n * ### .include(value)\n *\n * The `include` and `contain` assertions can be used as either property\n * based language chains or as methods to assert the inclusion of an object\n * in an array or a substring in a string. When used as language chains,\n * they toggle the `contains` flag for the `keys` assertion.\n *\n * expect([1,2,3]).to.include(2);\n * expect('foobar').to.contain('foo');\n * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');\n *\n * @name include\n * @alias contain\n * @alias includes\n * @alias contains\n * @param {Object|String|Number} obj\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function includeChainingBehavior () {\n flag(this, 'contains', true);\n }\n\n function include (val, msg) {\n _.expectTypes(this, ['array', 'object', 'string']);\n\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var expected = false;\n\n if (_.type(obj) === 'array' && _.type(val) === 'object') {\n for (var i in obj) {\n if (_.eql(obj[i], val)) {\n expected = true;\n break;\n }\n }\n } else if (_.type(val) === 'object') {\n if (!flag(this, 'negate')) {\n for (var k in val) new Assertion(obj).property(k, val[k]);\n return;\n }\n var subset = {};\n for (var k in val) subset[k] = obj[k];\n expected = _.eql(subset, val);\n } else {\n expected = (obj != undefined) && ~obj.indexOf(val);\n }\n this.assert(\n expected\n , 'expected #{this} to include ' + _.inspect(val)\n , 'expected #{this} to not include ' + _.inspect(val));\n }\n\n Assertion.addChainableMethod('include', include, includeChainingBehavior);\n Assertion.addChainableMethod('contain', include, includeChainingBehavior);\n Assertion.addChainableMethod('contains', include, includeChainingBehavior);\n Assertion.addChainableMethod('includes', include, includeChainingBehavior);\n\n /**\n * ### .ok\n *\n * Asserts that the target is truthy.\n *\n * expect('everything').to.be.ok;\n * expect(1).to.be.ok;\n * expect(false).to.not.be.ok;\n * expect(undefined).to.not.be.ok;\n * expect(null).to.not.be.ok;\n *\n * @name ok\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('ok', function () {\n this.assert(\n flag(this, 'object')\n , 'expected #{this} to be truthy'\n , 'expected #{this} to be falsy');\n });\n\n /**\n * ### .true\n *\n * Asserts that the target is `true`.\n *\n * expect(true).to.be.true;\n * expect(1).to.not.be.true;\n *\n * @name true\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('true', function () {\n this.assert(\n true === flag(this, 'object')\n , 'expected #{this} to be true'\n , 'expected #{this} to be false'\n , this.negate ? false : true\n );\n });\n\n /**\n * ### .false\n *\n * Asserts that the target is `false`.\n *\n * expect(false).to.be.false;\n * expect(0).to.not.be.false;\n *\n * @name false\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('false', function () {\n this.assert(\n false === flag(this, 'object')\n , 'expected #{this} to be false'\n , 'expected #{this} to be true'\n , this.negate ? true : false\n );\n });\n\n /**\n * ### .null\n *\n * Asserts that the target is `null`.\n *\n * expect(null).to.be.null;\n * expect(undefined).to.not.be.null;\n *\n * @name null\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('null', function () {\n this.assert(\n null === flag(this, 'object')\n , 'expected #{this} to be null'\n , 'expected #{this} not to be null'\n );\n });\n\n /**\n * ### .undefined\n *\n * Asserts that the target is `undefined`.\n *\n * expect(undefined).to.be.undefined;\n * expect(null).to.not.be.undefined;\n *\n * @name undefined\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('undefined', function () {\n this.assert(\n undefined === flag(this, 'object')\n , 'expected #{this} to be undefined'\n , 'expected #{this} not to be undefined'\n );\n });\n\n /**\n * ### .NaN\n * Asserts that the target is `NaN`.\n *\n * expect('foo').to.be.NaN;\n * expect(4).not.to.be.NaN;\n *\n * @name NaN\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('NaN', function () {\n this.assert(\n isNaN(flag(this, 'object'))\n , 'expected #{this} to be NaN'\n , 'expected #{this} not to be NaN'\n );\n });\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi'\n * , bar = null\n * , baz;\n *\n * expect(foo).to.exist;\n * expect(bar).to.not.exist;\n * expect(baz).to.not.exist;\n *\n * @name exist\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('exist', function () {\n this.assert(\n null != flag(this, 'object')\n , 'expected #{this} to exist'\n , 'expected #{this} to not exist'\n );\n });\n\n\n /**\n * ### .empty\n *\n * Asserts that the target's length is `0`. For arrays and strings, it checks\n * the `length` property. For objects, it gets the count of\n * enumerable keys.\n *\n * expect([]).to.be.empty;\n * expect('').to.be.empty;\n * expect({}).to.be.empty;\n *\n * @name empty\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('empty', function () {\n var obj = flag(this, 'object')\n , expected = obj;\n\n if (Array.isArray(obj) || 'string' === typeof object) {\n expected = obj.length;\n } else if (typeof obj === 'object') {\n expected = Object.keys(obj).length;\n }\n\n this.assert(\n !expected\n , 'expected #{this} to be empty'\n , 'expected #{this} not to be empty'\n );\n });\n\n /**\n * ### .arguments\n *\n * Asserts that the target is an arguments object.\n *\n * function test () {\n * expect(arguments).to.be.arguments;\n * }\n *\n * @name arguments\n * @alias Arguments\n * @namespace BDD\n * @api public\n */\n\n function checkArguments () {\n var obj = flag(this, 'object')\n , type = Object.prototype.toString.call(obj);\n this.assert(\n '[object Arguments]' === type\n , 'expected #{this} to be arguments but got ' + type\n , 'expected #{this} to not be arguments'\n );\n }\n\n Assertion.addProperty('arguments', checkArguments);\n Assertion.addProperty('Arguments', checkArguments);\n\n /**\n * ### .equal(value)\n *\n * Asserts that the target is strictly equal (`===`) to `value`.\n * Alternately, if the `deep` flag is set, asserts that\n * the target is deeply equal to `value`.\n *\n * expect('hello').to.equal('hello');\n * expect(42).to.equal(42);\n * expect(1).to.not.equal(true);\n * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });\n * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });\n *\n * @name equal\n * @alias equals\n * @alias eq\n * @alias deep.equal\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEqual (val, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'deep')) {\n return this.eql(val);\n } else {\n this.assert(\n val === obj\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{exp}'\n , val\n , this._obj\n , true\n );\n }\n }\n\n Assertion.addMethod('equal', assertEqual);\n Assertion.addMethod('equals', assertEqual);\n Assertion.addMethod('eq', assertEqual);\n\n /**\n * ### .eql(value)\n *\n * Asserts that the target is deeply equal to `value`.\n *\n * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });\n * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);\n *\n * @name eql\n * @alias eqls\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEql(obj, msg) {\n if (msg) flag(this, 'message', msg);\n this.assert(\n _.eql(obj, flag(this, 'object'))\n , 'expected #{this} to deeply equal #{exp}'\n , 'expected #{this} to not deeply equal #{exp}'\n , obj\n , this._obj\n , true\n );\n }\n\n Assertion.addMethod('eql', assertEql);\n Assertion.addMethod('eqls', assertEql);\n\n /**\n * ### .above(value)\n *\n * Asserts that the target is greater than `value`.\n *\n * expect(10).to.be.above(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n *\n * @name above\n * @alias gt\n * @alias greaterThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertAbove (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len > n\n , 'expected #{this} to have a length above #{exp} but got #{act}'\n , 'expected #{this} to not have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj > n\n , 'expected #{this} to be above ' + n\n , 'expected #{this} to be at most ' + n\n );\n }\n }\n\n Assertion.addMethod('above', assertAbove);\n Assertion.addMethod('gt', assertAbove);\n Assertion.addMethod('greaterThan', assertAbove);\n\n /**\n * ### .least(value)\n *\n * Asserts that the target is greater than or equal to `value`.\n *\n * expect(10).to.be.at.least(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.least(2);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);\n *\n * @name least\n * @alias gte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLeast (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= n\n , 'expected #{this} to have a length at least #{exp} but got #{act}'\n , 'expected #{this} to have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj >= n\n , 'expected #{this} to be at least ' + n\n , 'expected #{this} to be below ' + n\n );\n }\n }\n\n Assertion.addMethod('least', assertLeast);\n Assertion.addMethod('gte', assertLeast);\n\n /**\n * ### .below(value)\n *\n * Asserts that the target is less than `value`.\n *\n * expect(5).to.be.below(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n *\n * @name below\n * @alias lt\n * @alias lessThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertBelow (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len < n\n , 'expected #{this} to have a length below #{exp} but got #{act}'\n , 'expected #{this} to not have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj < n\n , 'expected #{this} to be below ' + n\n , 'expected #{this} to be at least ' + n\n );\n }\n }\n\n Assertion.addMethod('below', assertBelow);\n Assertion.addMethod('lt', assertBelow);\n Assertion.addMethod('lessThan', assertBelow);\n\n /**\n * ### .most(value)\n *\n * Asserts that the target is less than or equal to `value`.\n *\n * expect(5).to.be.at.most(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.most(4);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);\n *\n * @name most\n * @alias lte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertMost (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len <= n\n , 'expected #{this} to have a length at most #{exp} but got #{act}'\n , 'expected #{this} to have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj <= n\n , 'expected #{this} to be at most ' + n\n , 'expected #{this} to be above ' + n\n );\n }\n }\n\n Assertion.addMethod('most', assertMost);\n Assertion.addMethod('lte', assertMost);\n\n /**\n * ### .within(start, finish)\n *\n * Asserts that the target is within a range.\n *\n * expect(7).to.be.within(5,10);\n *\n * Can also be used in conjunction with `length` to\n * assert a length range. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * @name within\n * @param {Number} start lowerbound inclusive\n * @param {Number} finish upperbound inclusive\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('within', function (start, finish, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , range = start + '..' + finish;\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= start && len <= finish\n , 'expected #{this} to have a length within ' + range\n , 'expected #{this} to not have a length within ' + range\n );\n } else {\n this.assert(\n obj >= start && obj <= finish\n , 'expected #{this} to be within ' + range\n , 'expected #{this} to not be within ' + range\n );\n }\n });\n\n /**\n * ### .instanceof(constructor)\n *\n * Asserts that the target is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , Chai = new Tea('chai');\n *\n * expect(Chai).to.be.an.instanceof(Tea);\n * expect([ 1, 2, 3 ]).to.be.instanceof(Array);\n *\n * @name instanceof\n * @param {Constructor} constructor\n * @param {String} message _optional_\n * @alias instanceOf\n * @namespace BDD\n * @api public\n */\n\n function assertInstanceOf (constructor, msg) {\n if (msg) flag(this, 'message', msg);\n var name = _.getName(constructor);\n this.assert(\n flag(this, 'object') instanceof constructor\n , 'expected #{this} to be an instance of ' + name\n , 'expected #{this} to not be an instance of ' + name\n );\n };\n\n Assertion.addMethod('instanceof', assertInstanceOf);\n Assertion.addMethod('instanceOf', assertInstanceOf);\n\n /**\n * ### .property(name, [value])\n *\n * Asserts that the target has a property `name`, optionally asserting that\n * the value of that property is strictly equal to `value`.\n * If the `deep` flag is set, you can use dot- and bracket-notation for deep\n * references into objects and arrays.\n *\n * // simple referencing\n * var obj = { foo: 'bar' };\n * expect(obj).to.have.property('foo');\n * expect(obj).to.have.property('foo', 'bar');\n *\n * // deep referencing\n * var deepObj = {\n * green: { tea: 'matcha' }\n * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]\n * };\n *\n * expect(deepObj).to.have.deep.property('green.tea', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');\n *\n * You can also use an array as the starting point of a `deep.property`\n * assertion, or traverse nested arrays.\n *\n * var arr = [\n * [ 'chai', 'matcha', 'konacha' ]\n * , [ { tea: 'chai' }\n * , { tea: 'matcha' }\n * , { tea: 'konacha' } ]\n * ];\n *\n * expect(arr).to.have.deep.property('[0][1]', 'matcha');\n * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');\n *\n * Furthermore, `property` changes the subject of the assertion\n * to be the value of that property from the original object. This\n * permits for further chainable assertions on that property.\n *\n * expect(obj).to.have.property('foo')\n * .that.is.a('string');\n * expect(deepObj).to.have.property('green')\n * .that.is.an('object')\n * .that.deep.equals({ tea: 'matcha' });\n * expect(deepObj).to.have.property('teas')\n * .that.is.an('array')\n * .with.deep.property('[2]')\n * .that.deep.equals({ tea: 'konacha' });\n *\n * Note that dots and bracket in `name` must be backslash-escaped when\n * the `deep` flag is set, while they must NOT be escaped when the `deep`\n * flag is not set.\n *\n * // simple referencing\n * var css = { '.link[target]': 42 };\n * expect(css).to.have.property('.link[target]', 42);\n *\n * // deep referencing\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name property\n * @alias deep.property\n * @param {String} name\n * @param {Mixed} value (optional)\n * @param {String} message _optional_\n * @returns value of property for chaining\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('property', function (name, val, msg) {\n if (msg) flag(this, 'message', msg);\n\n var isDeep = !!flag(this, 'deep')\n , descriptor = isDeep ? 'deep property ' : 'property '\n , negate = flag(this, 'negate')\n , obj = flag(this, 'object')\n , pathInfo = isDeep ? _.getPathInfo(name, obj) : null\n , hasProperty = isDeep\n ? pathInfo.exists\n : _.hasProperty(name, obj)\n , value = isDeep\n ? pathInfo.value\n : obj[name];\n\n if (negate && arguments.length > 1) {\n if (undefined === value) {\n msg = (msg != null) ? msg + ': ' : '';\n throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));\n }\n } else {\n this.assert(\n hasProperty\n , 'expected #{this} to have a ' + descriptor + _.inspect(name)\n , 'expected #{this} to not have ' + descriptor + _.inspect(name));\n }\n\n if (arguments.length > 1) {\n this.assert(\n val === value\n , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'\n , val\n , value\n );\n }\n\n flag(this, 'object', value);\n });\n\n\n /**\n * ### .ownProperty(name)\n *\n * Asserts that the target has an own property `name`.\n *\n * expect('test').to.have.ownProperty('length');\n *\n * @name ownProperty\n * @alias haveOwnProperty\n * @param {String} name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnProperty (name, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n obj.hasOwnProperty(name)\n , 'expected #{this} to have own property ' + _.inspect(name)\n , 'expected #{this} to not have own property ' + _.inspect(name)\n );\n }\n\n Assertion.addMethod('ownProperty', assertOwnProperty);\n Assertion.addMethod('haveOwnProperty', assertOwnProperty);\n\n /**\n * ### .ownPropertyDescriptor(name[, descriptor[, message]])\n *\n * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.\n *\n * expect('test').to.have.ownPropertyDescriptor('length');\n * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });\n * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });\n * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);\n * expect('test').ownPropertyDescriptor('length').to.have.keys('value');\n *\n * @name ownPropertyDescriptor\n * @alias haveOwnPropertyDescriptor\n * @param {String} name\n * @param {Object} descriptor _optional_\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnPropertyDescriptor (name, descriptor, msg) {\n if (typeof descriptor === 'string') {\n msg = descriptor;\n descriptor = null;\n }\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);\n if (actualDescriptor && descriptor) {\n this.assert(\n _.eql(descriptor, actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)\n , descriptor\n , actualDescriptor\n , true\n );\n } else {\n this.assert(\n actualDescriptor\n , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)\n , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)\n );\n }\n flag(this, 'object', actualDescriptor);\n }\n\n Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);\n Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);\n\n /**\n * ### .length\n *\n * Sets the `doLength` flag later used as a chain precursor to a value\n * comparison for the `length` property.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * *Deprecation notice:* Using `length` as an assertion will be deprecated\n * in version 2.4.0 and removed in 3.0.0. Code using the old style of\n * asserting for `length` property value using `length(value)` should be\n * switched to use `lengthOf(value)` instead.\n *\n * @name length\n * @namespace BDD\n * @api public\n */\n\n /**\n * ### .lengthOf(value[, message])\n *\n * Asserts that the target's `length` property has\n * the expected value.\n *\n * expect([ 1, 2, 3]).to.have.lengthOf(3);\n * expect('foobar').to.have.lengthOf(6);\n *\n * @name lengthOf\n * @param {Number} length\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLengthChain () {\n flag(this, 'doLength', true);\n }\n\n function assertLength (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n\n this.assert(\n len == n\n , 'expected #{this} to have a length of #{exp} but got #{act}'\n , 'expected #{this} to not have a length of #{act}'\n , n\n , len\n );\n }\n\n Assertion.addChainableMethod('length', assertLength, assertLengthChain);\n Assertion.addMethod('lengthOf', assertLength);\n\n /**\n * ### .match(regexp)\n *\n * Asserts that the target matches a regular expression.\n *\n * expect('foobar').to.match(/^foo/);\n *\n * @name match\n * @alias matches\n * @param {RegExp} RegularExpression\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n function assertMatch(re, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n re.exec(obj)\n , 'expected #{this} to match ' + re\n , 'expected #{this} not to match ' + re\n );\n }\n\n Assertion.addMethod('match', assertMatch);\n Assertion.addMethod('matches', assertMatch);\n\n /**\n * ### .string(string)\n *\n * Asserts that the string target contains another string.\n *\n * expect('foobar').to.have.string('bar');\n *\n * @name string\n * @param {String} string\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('string', function (str, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('string');\n\n this.assert(\n ~obj.indexOf(str)\n , 'expected #{this} to contain ' + _.inspect(str)\n , 'expected #{this} to not contain ' + _.inspect(str)\n );\n });\n\n\n /**\n * ### .keys(key1, [key2], [...])\n *\n * Asserts that the target contains any or all of the passed-in keys.\n * Use in combination with `any`, `all`, `contains`, or `have` will affect\n * what will pass.\n *\n * When used in conjunction with `any`, at least one key that is passed\n * in must exist in the target object. This is regardless whether or not\n * the `have` or `contain` qualifiers are used. Note, either `any` or `all`\n * should be used in the assertion. If neither are used, the assertion is\n * defaulted to `all`.\n *\n * When both `all` and `contain` are used, the target object must have at\n * least all of the passed-in keys but may have more keys not listed.\n *\n * When both `all` and `have` are used, the target object must both contain\n * all of the passed-in keys AND the number of keys in the target object must\n * match the number of keys passed in (in other words, a target object must\n * have all and only all of the passed-in keys).\n *\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});\n * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});\n *\n *\n * @name keys\n * @alias key\n * @param {...String|Array|Object} keys\n * @namespace BDD\n * @api public\n */\n\n function assertKeys (keys) {\n var obj = flag(this, 'object')\n , str\n , ok = true\n , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';\n\n switch (_.type(keys)) {\n case \"array\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n break;\n case \"object\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n keys = Object.keys(keys);\n break;\n default:\n keys = Array.prototype.slice.call(arguments);\n }\n\n if (!keys.length) throw new Error('keys required');\n\n var actual = Object.keys(obj)\n , expected = keys\n , len = keys.length\n , any = flag(this, 'any')\n , all = flag(this, 'all');\n\n if (!any && !all) {\n all = true;\n }\n\n // Has any\n if (any) {\n var intersection = expected.filter(function(key) {\n return ~actual.indexOf(key);\n });\n ok = intersection.length > 0;\n }\n\n // Has all\n if (all) {\n ok = keys.every(function(key){\n return ~actual.indexOf(key);\n });\n if (!flag(this, 'negate') && !flag(this, 'contains')) {\n ok = ok && keys.length == actual.length;\n }\n }\n\n // Key string\n if (len > 1) {\n keys = keys.map(function(key){\n return _.inspect(key);\n });\n var last = keys.pop();\n if (all) {\n str = keys.join(', ') + ', and ' + last;\n }\n if (any) {\n str = keys.join(', ') + ', or ' + last;\n }\n } else {\n str = _.inspect(keys[0]);\n }\n\n // Form\n str = (len > 1 ? 'keys ' : 'key ') + str;\n\n // Have / include\n str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;\n\n // Assertion\n this.assert(\n ok\n , 'expected #{this} to ' + str\n , 'expected #{this} to not ' + str\n , expected.slice(0).sort()\n , actual.sort()\n , true\n );\n }\n\n Assertion.addMethod('keys', assertKeys);\n Assertion.addMethod('key', assertKeys);\n\n /**\n * ### .throw(constructor)\n *\n * Asserts that the function target will throw a specific error, or specific type of error\n * (as determined using `instanceof`), optionally with a RegExp or string inclusion test\n * for the error's message.\n *\n * var err = new ReferenceError('This is a bad function.');\n * var fn = function () { throw err; }\n * expect(fn).to.throw(ReferenceError);\n * expect(fn).to.throw(Error);\n * expect(fn).to.throw(/bad function/);\n * expect(fn).to.not.throw('good function');\n * expect(fn).to.throw(ReferenceError, /bad function/);\n * expect(fn).to.throw(err);\n *\n * Please note that when a throw expectation is negated, it will check each\n * parameter independently, starting with error constructor type. The appropriate way\n * to check for the existence of a type of error but for a message that does not match\n * is to use `and`.\n *\n * expect(fn).to.throw(ReferenceError)\n * .and.not.throw(/good function/);\n *\n * @name throw\n * @alias throws\n * @alias Throw\n * @param {ErrorConstructor} constructor\n * @param {String|RegExp} expected error message\n * @param {String} message _optional_\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @returns error for chaining (null if no error)\n * @namespace BDD\n * @api public\n */\n\n function assertThrows (constructor, errMsg, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('function');\n\n var thrown = false\n , desiredError = null\n , name = null\n , thrownError = null;\n\n if (arguments.length === 0) {\n errMsg = null;\n constructor = null;\n } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {\n errMsg = constructor;\n constructor = null;\n } else if (constructor && constructor instanceof Error) {\n desiredError = constructor;\n constructor = null;\n errMsg = null;\n } else if (typeof constructor === 'function') {\n name = constructor.prototype.name;\n if (!name || (name === 'Error' && constructor !== Error)) {\n name = constructor.name || (new constructor()).name;\n }\n } else {\n constructor = null;\n }\n\n try {\n obj();\n } catch (err) {\n // first, check desired error\n if (desiredError) {\n this.assert(\n err === desiredError\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}'\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (err instanceof Error ? err.toString() : err)\n );\n\n flag(this, 'object', err);\n return this;\n }\n\n // next, check constructor\n if (constructor) {\n this.assert(\n err instanceof constructor\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp} but #{act} was thrown'\n , name\n , (err instanceof Error ? err.toString() : err)\n );\n\n if (!errMsg) {\n flag(this, 'object', err);\n return this;\n }\n }\n\n // next, check message\n var message = 'error' === _.type(err) && \"message\" in err\n ? err.message\n : '' + err;\n\n if ((message != null) && errMsg && errMsg instanceof RegExp) {\n this.assert(\n errMsg.exec(message)\n , 'expected #{this} to throw error matching #{exp} but got #{act}'\n , 'expected #{this} to throw error not matching #{exp}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else if ((message != null) && errMsg && 'string' === typeof errMsg) {\n this.assert(\n ~message.indexOf(errMsg)\n , 'expected #{this} to throw error including #{exp} but got #{act}'\n , 'expected #{this} to throw error not including #{act}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else {\n thrown = true;\n thrownError = err;\n }\n }\n\n var actuallyGot = ''\n , expectedThrown = name !== null\n ? name\n : desiredError\n ? '#{exp}' //_.inspect(desiredError)\n : 'an error';\n\n if (thrown) {\n actuallyGot = ' but #{act} was thrown'\n }\n\n this.assert(\n thrown === true\n , 'expected #{this} to throw ' + expectedThrown + actuallyGot\n , 'expected #{this} to not throw ' + expectedThrown + actuallyGot\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (thrownError instanceof Error ? thrownError.toString() : thrownError)\n );\n\n flag(this, 'object', thrownError);\n };\n\n Assertion.addMethod('throw', assertThrows);\n Assertion.addMethod('throws', assertThrows);\n Assertion.addMethod('Throw', assertThrows);\n\n /**\n * ### .respondTo(method)\n *\n * Asserts that the object or class target will respond to a method.\n *\n * Klass.prototype.bar = function(){};\n * expect(Klass).to.respondTo('bar');\n * expect(obj).to.respondTo('bar');\n *\n * To check if a constructor will respond to a static function,\n * set the `itself` flag.\n *\n * Klass.baz = function(){};\n * expect(Klass).itself.to.respondTo('baz');\n *\n * @name respondTo\n * @alias respondsTo\n * @param {String} method\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function respondTo (method, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , itself = flag(this, 'itself')\n , context = ('function' === _.type(obj) && !itself)\n ? obj.prototype[method]\n : obj[method];\n\n this.assert(\n 'function' === typeof context\n , 'expected #{this} to respond to ' + _.inspect(method)\n , 'expected #{this} to not respond to ' + _.inspect(method)\n );\n }\n\n Assertion.addMethod('respondTo', respondTo);\n Assertion.addMethod('respondsTo', respondTo);\n\n /**\n * ### .itself\n *\n * Sets the `itself` flag, later used by the `respondTo` assertion.\n *\n * function Foo() {}\n * Foo.bar = function() {}\n * Foo.prototype.baz = function() {}\n *\n * expect(Foo).itself.to.respondTo('bar');\n * expect(Foo).itself.not.to.respondTo('baz');\n *\n * @name itself\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('itself', function () {\n flag(this, 'itself', true);\n });\n\n /**\n * ### .satisfy(method)\n *\n * Asserts that the target passes a given truth test.\n *\n * expect(1).to.satisfy(function(num) { return num > 0; });\n *\n * @name satisfy\n * @alias satisfies\n * @param {Function} matcher\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function satisfy (matcher, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var result = matcher(obj);\n this.assert(\n result\n , 'expected #{this} to satisfy ' + _.objDisplay(matcher)\n , 'expected #{this} to not satisfy' + _.objDisplay(matcher)\n , this.negate ? false : true\n , result\n );\n }\n\n Assertion.addMethod('satisfy', satisfy);\n Assertion.addMethod('satisfies', satisfy);\n\n /**\n * ### .closeTo(expected, delta)\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * expect(1.5).to.be.closeTo(1, 0.5);\n *\n * @name closeTo\n * @alias approximately\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function closeTo(expected, delta, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj, msg).is.a('number');\n if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {\n throw new Error('the arguments to closeTo or approximately must be numbers');\n }\n\n this.assert(\n Math.abs(obj - expected) <= delta\n , 'expected #{this} to be close to ' + expected + ' +/- ' + delta\n , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta\n );\n }\n\n Assertion.addMethod('closeTo', closeTo);\n Assertion.addMethod('approximately', closeTo);\n\n function isSubsetOf(subset, superset, cmp) {\n return subset.every(function(elem) {\n if (!cmp) return superset.indexOf(elem) !== -1;\n\n return superset.some(function(elem2) {\n return cmp(elem, elem2);\n });\n })\n }\n\n /**\n * ### .members(set)\n *\n * Asserts that the target is a superset of `set`,\n * or that the target and `set` have the same strictly-equal (===) members.\n * Alternately, if the `deep` flag is set, set members are compared for deep\n * equality.\n *\n * expect([1, 2, 3]).to.include.members([3, 2]);\n * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);\n *\n * expect([4, 2]).to.have.members([2, 4]);\n * expect([5, 2]).to.not.have.members([5, 2, 1]);\n *\n * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);\n *\n * @name members\n * @param {Array} set\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('members', function (subset, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj).to.be.an('array');\n new Assertion(subset).to.be.an('array');\n\n var cmp = flag(this, 'deep') ? _.eql : undefined;\n\n if (flag(this, 'contains')) {\n return this.assert(\n isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to be a superset of #{act}'\n , 'expected #{this} to not be a superset of #{act}'\n , obj\n , subset\n );\n }\n\n this.assert(\n isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to have the same members as #{act}'\n , 'expected #{this} to not have the same members as #{act}'\n , obj\n , subset\n );\n });\n\n /**\n * ### .oneOf(list)\n *\n * Assert that a value appears somewhere in the top level of array `list`.\n *\n * expect('a').to.be.oneOf(['a', 'b', 'c']);\n * expect(9).to.not.be.oneOf(['z']);\n * expect([3]).to.not.be.oneOf([1, 2, [3]]);\n *\n * var three = [3];\n * // for object-types, contents are not compared\n * expect(three).to.not.be.oneOf([1, 2, [3]]);\n * // comparing references works\n * expect(three).to.be.oneOf([1, 2, three]);\n *\n * @name oneOf\n * @param {Array<*>} list\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function oneOf (list, msg) {\n if (msg) flag(this, 'message', msg);\n var expected = flag(this, 'object');\n new Assertion(list).to.be.an('array');\n\n this.assert(\n list.indexOf(expected) > -1\n , 'expected #{this} to be one of #{exp}'\n , 'expected #{this} to not be one of #{exp}'\n , list\n , expected\n );\n }\n\n Assertion.addMethod('oneOf', oneOf);\n\n\n /**\n * ### .change(function)\n *\n * Asserts that a function changes an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 3 };\n * var noChangeFn = function() { return 'foo' + 'bar'; }\n * expect(fn).to.change(obj, 'val');\n * expect(noChangeFn).to.not.change(obj, 'val')\n *\n * @name change\n * @alias changes\n * @alias Change\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertChanges (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n initial !== object[prop]\n , 'expected .' + prop + ' to change'\n , 'expected .' + prop + ' to not change'\n );\n }\n\n Assertion.addChainableMethod('change', assertChanges);\n Assertion.addChainableMethod('changes', assertChanges);\n\n /**\n * ### .increase(function)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * expect(fn).to.increase(obj, 'val');\n *\n * @name increase\n * @alias increases\n * @alias Increase\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertIncreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial > 0\n , 'expected .' + prop + ' to increase'\n , 'expected .' + prop + ' to not increase'\n );\n }\n\n Assertion.addChainableMethod('increase', assertIncreases);\n Assertion.addChainableMethod('increases', assertIncreases);\n\n /**\n * ### .decrease(function)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * expect(fn).to.decrease(obj, 'val');\n *\n * @name decrease\n * @alias decreases\n * @alias Decrease\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertDecreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial < 0\n , 'expected .' + prop + ' to decrease'\n , 'expected .' + prop + ' to not decrease'\n );\n }\n\n Assertion.addChainableMethod('decrease', assertDecreases);\n Assertion.addChainableMethod('decreases', assertDecreases);\n\n /**\n * ### .extensible\n *\n * Asserts that the target is extensible (can have new properties added to\n * it).\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect({}).to.be.extensible;\n * expect(nonExtensibleObject).to.not.be.extensible;\n * expect(sealedObject).to.not.be.extensible;\n * expect(frozenObject).to.not.be.extensible;\n *\n * @name extensible\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('extensible', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isExtensible;\n\n try {\n isExtensible = Object.isExtensible(obj);\n } catch (err) {\n if (err instanceof TypeError) isExtensible = false;\n else throw err;\n }\n\n this.assert(\n isExtensible\n , 'expected #{this} to be extensible'\n , 'expected #{this} to not be extensible'\n );\n });\n\n /**\n * ### .sealed\n *\n * Asserts that the target is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect(sealedObject).to.be.sealed;\n * expect(frozenObject).to.be.sealed;\n * expect({}).to.not.be.sealed;\n *\n * @name sealed\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('sealed', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isSealed;\n\n try {\n isSealed = Object.isSealed(obj);\n } catch (err) {\n if (err instanceof TypeError) isSealed = true;\n else throw err;\n }\n\n this.assert(\n isSealed\n , 'expected #{this} to be sealed'\n , 'expected #{this} to not be sealed'\n );\n });\n\n /**\n * ### .frozen\n *\n * Asserts that the target is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n *\n * expect(frozenObject).to.be.frozen;\n * expect({}).to.not.be.frozen;\n *\n * @name frozen\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('frozen', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isFrozen;\n\n try {\n isFrozen = Object.isFrozen(obj);\n } catch (err) {\n if (err instanceof TypeError) isFrozen = true;\n else throw err;\n }\n\n this.assert(\n isFrozen\n , 'expected #{this} to be frozen'\n , 'expected #{this} to not be frozen'\n );\n });\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\n\nmodule.exports = function (chai, util) {\n\n /*!\n * Chai dependencies.\n */\n\n var Assertion = chai.Assertion\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n /**\n * ### assert(expression, message)\n *\n * Write your own test expressions.\n *\n * assert('foo' !== 'bar', 'foo is not bar');\n * assert(Array.isArray([]), 'empty arrays are arrays');\n *\n * @param {Mixed} expression to test for truthiness\n * @param {String} message to display on error\n * @name assert\n * @namespace Assert\n * @api public\n */\n\n var assert = chai.assert = function (express, errmsg) {\n var test = new Assertion(null, null, chai.assert);\n test.assert(\n express\n , errmsg\n , '[ negation message unavailable ]'\n );\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure. Node.js `assert` module-compatible.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Assert\n * @api public\n */\n\n assert.fail = function (actual, expected, message, operator) {\n message = message || 'assert.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, assert.fail);\n };\n\n /**\n * ### .isOk(object, [message])\n *\n * Asserts that `object` is truthy.\n *\n * assert.isOk('everything', 'everything is ok');\n * assert.isOk(false, 'this will fail');\n *\n * @name isOk\n * @alias ok\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isOk = function (val, msg) {\n new Assertion(val, msg).is.ok;\n };\n\n /**\n * ### .isNotOk(object, [message])\n *\n * Asserts that `object` is falsy.\n *\n * assert.isNotOk('everything', 'this will fail');\n * assert.isNotOk(false, 'this will pass');\n *\n * @name isNotOk\n * @alias notOk\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotOk = function (val, msg) {\n new Assertion(val, msg).is.not.ok;\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * assert.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.equal = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.equal);\n\n test.assert(\n exp == flag(test, 'object')\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .notEqual(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * assert.notEqual(3, 4, 'these numbers are not equal');\n *\n * @name notEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notEqual = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.notEqual);\n\n test.assert(\n exp != flag(test, 'object')\n , 'expected #{this} to not equal #{exp}'\n , 'expected #{this} to equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .strictEqual(actual, expected, [message])\n *\n * Asserts strict equality (`===`) of `actual` and `expected`.\n *\n * assert.strictEqual(true, true, 'these booleans are strictly equal');\n *\n * @name strictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.strictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.equal(exp);\n };\n\n /**\n * ### .notStrictEqual(actual, expected, [message])\n *\n * Asserts strict inequality (`!==`) of `actual` and `expected`.\n *\n * assert.notStrictEqual(3, '3', 'no coercion for strict equality');\n *\n * @name notStrictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notStrictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.equal(exp);\n };\n\n /**\n * ### .deepEqual(actual, expected, [message])\n *\n * Asserts that `actual` is deeply equal to `expected`.\n *\n * assert.deepEqual({ tea: 'green' }, { tea: 'green' });\n *\n * @name deepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.eql(exp);\n };\n\n /**\n * ### .notDeepEqual(actual, expected, [message])\n *\n * Assert that `actual` is not deeply equal to `expected`.\n *\n * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });\n *\n * @name notDeepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.eql(exp);\n };\n\n /**\n * ### .isAbove(valueToCheck, valueToBeAbove, [message])\n *\n * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`\n *\n * assert.isAbove(5, 2, '5 is strictly greater than 2');\n *\n * @name isAbove\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAbove\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAbove = function (val, abv, msg) {\n new Assertion(val, msg).to.be.above(abv);\n };\n\n /**\n * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])\n *\n * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`\n *\n * assert.isAtLeast(5, 2, '5 is greater or equal to 2');\n * assert.isAtLeast(3, 3, '3 is greater or equal to 3');\n *\n * @name isAtLeast\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtLeast\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtLeast = function (val, atlst, msg) {\n new Assertion(val, msg).to.be.least(atlst);\n };\n\n /**\n * ### .isBelow(valueToCheck, valueToBeBelow, [message])\n *\n * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`\n *\n * assert.isBelow(3, 6, '3 is strictly less than 6');\n *\n * @name isBelow\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeBelow\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBelow = function (val, blw, msg) {\n new Assertion(val, msg).to.be.below(blw);\n };\n\n /**\n * ### .isAtMost(valueToCheck, valueToBeAtMost, [message])\n *\n * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`\n *\n * assert.isAtMost(3, 6, '3 is less than or equal to 6');\n * assert.isAtMost(4, 4, '4 is less than or equal to 4');\n *\n * @name isAtMost\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtMost\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtMost = function (val, atmst, msg) {\n new Assertion(val, msg).to.be.most(atmst);\n };\n\n /**\n * ### .isTrue(value, [message])\n *\n * Asserts that `value` is true.\n *\n * var teaServed = true;\n * assert.isTrue(teaServed, 'the tea has been served');\n *\n * @name isTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isTrue = function (val, msg) {\n new Assertion(val, msg).is['true'];\n };\n\n /**\n * ### .isNotTrue(value, [message])\n *\n * Asserts that `value` is not true.\n *\n * var tea = 'tasty chai';\n * assert.isNotTrue(tea, 'great, time for tea!');\n *\n * @name isNotTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotTrue = function (val, msg) {\n new Assertion(val, msg).to.not.equal(true);\n };\n\n /**\n * ### .isFalse(value, [message])\n *\n * Asserts that `value` is false.\n *\n * var teaServed = false;\n * assert.isFalse(teaServed, 'no tea yet? hmm...');\n *\n * @name isFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFalse = function (val, msg) {\n new Assertion(val, msg).is['false'];\n };\n\n /**\n * ### .isNotFalse(value, [message])\n *\n * Asserts that `value` is not false.\n *\n * var tea = 'tasty chai';\n * assert.isNotFalse(tea, 'great, time for tea!');\n *\n * @name isNotFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFalse = function (val, msg) {\n new Assertion(val, msg).to.not.equal(false);\n };\n\n /**\n * ### .isNull(value, [message])\n *\n * Asserts that `value` is null.\n *\n * assert.isNull(err, 'there was no error');\n *\n * @name isNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNull = function (val, msg) {\n new Assertion(val, msg).to.equal(null);\n };\n\n /**\n * ### .isNotNull(value, [message])\n *\n * Asserts that `value` is not null.\n *\n * var tea = 'tasty chai';\n * assert.isNotNull(tea, 'great, time for tea!');\n *\n * @name isNotNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNull = function (val, msg) {\n new Assertion(val, msg).to.not.equal(null);\n };\n\n /**\n * ### .isNaN\n * Asserts that value is NaN\n *\n * assert.isNaN('foo', 'foo is NaN');\n *\n * @name isNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNaN = function (val, msg) {\n new Assertion(val, msg).to.be.NaN;\n };\n\n /**\n * ### .isNotNaN\n * Asserts that value is not NaN\n *\n * assert.isNotNaN(4, '4 is not NaN');\n *\n * @name isNotNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n assert.isNotNaN = function (val, msg) {\n new Assertion(val, msg).not.to.be.NaN;\n };\n\n /**\n * ### .isUndefined(value, [message])\n *\n * Asserts that `value` is `undefined`.\n *\n * var tea;\n * assert.isUndefined(tea, 'no tea defined');\n *\n * @name isUndefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isUndefined = function (val, msg) {\n new Assertion(val, msg).to.equal(undefined);\n };\n\n /**\n * ### .isDefined(value, [message])\n *\n * Asserts that `value` is not `undefined`.\n *\n * var tea = 'cup of chai';\n * assert.isDefined(tea, 'tea has been defined');\n *\n * @name isDefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isDefined = function (val, msg) {\n new Assertion(val, msg).to.not.equal(undefined);\n };\n\n /**\n * ### .isFunction(value, [message])\n *\n * Asserts that `value` is a function.\n *\n * function serveTea() { return 'cup of tea'; };\n * assert.isFunction(serveTea, 'great, we can have tea now');\n *\n * @name isFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFunction = function (val, msg) {\n new Assertion(val, msg).to.be.a('function');\n };\n\n /**\n * ### .isNotFunction(value, [message])\n *\n * Asserts that `value` is _not_ a function.\n *\n * var serveTea = [ 'heat', 'pour', 'sip' ];\n * assert.isNotFunction(serveTea, 'great, we have listed the steps');\n *\n * @name isNotFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFunction = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('function');\n };\n\n /**\n * ### .isObject(value, [message])\n *\n * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).\n * _The assertion does not match subclassed objects._\n *\n * var selection = { name: 'Chai', serve: 'with spices' };\n * assert.isObject(selection, 'tea selection is an object');\n *\n * @name isObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isObject = function (val, msg) {\n new Assertion(val, msg).to.be.a('object');\n };\n\n /**\n * ### .isNotObject(value, [message])\n *\n * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).\n *\n * var selection = 'chai'\n * assert.isNotObject(selection, 'tea selection is not an object');\n * assert.isNotObject(null, 'null is not an object');\n *\n * @name isNotObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotObject = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('object');\n };\n\n /**\n * ### .isArray(value, [message])\n *\n * Asserts that `value` is an array.\n *\n * var menu = [ 'green', 'chai', 'oolong' ];\n * assert.isArray(menu, 'what kind of tea do we want?');\n *\n * @name isArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isArray = function (val, msg) {\n new Assertion(val, msg).to.be.an('array');\n };\n\n /**\n * ### .isNotArray(value, [message])\n *\n * Asserts that `value` is _not_ an array.\n *\n * var menu = 'green|chai|oolong';\n * assert.isNotArray(menu, 'what kind of tea do we want?');\n *\n * @name isNotArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotArray = function (val, msg) {\n new Assertion(val, msg).to.not.be.an('array');\n };\n\n /**\n * ### .isString(value, [message])\n *\n * Asserts that `value` is a string.\n *\n * var teaOrder = 'chai';\n * assert.isString(teaOrder, 'order placed');\n *\n * @name isString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isString = function (val, msg) {\n new Assertion(val, msg).to.be.a('string');\n };\n\n /**\n * ### .isNotString(value, [message])\n *\n * Asserts that `value` is _not_ a string.\n *\n * var teaOrder = 4;\n * assert.isNotString(teaOrder, 'order placed');\n *\n * @name isNotString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotString = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('string');\n };\n\n /**\n * ### .isNumber(value, [message])\n *\n * Asserts that `value` is a number.\n *\n * var cups = 2;\n * assert.isNumber(cups, 'how many cups');\n *\n * @name isNumber\n * @param {Number} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNumber = function (val, msg) {\n new Assertion(val, msg).to.be.a('number');\n };\n\n /**\n * ### .isNotNumber(value, [message])\n *\n * Asserts that `value` is _not_ a number.\n *\n * var cups = '2 cups please';\n * assert.isNotNumber(cups, 'how many cups');\n *\n * @name isNotNumber\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNumber = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('number');\n };\n\n /**\n * ### .isBoolean(value, [message])\n *\n * Asserts that `value` is a boolean.\n *\n * var teaReady = true\n * , teaServed = false;\n *\n * assert.isBoolean(teaReady, 'is the tea ready');\n * assert.isBoolean(teaServed, 'has tea been served');\n *\n * @name isBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBoolean = function (val, msg) {\n new Assertion(val, msg).to.be.a('boolean');\n };\n\n /**\n * ### .isNotBoolean(value, [message])\n *\n * Asserts that `value` is _not_ a boolean.\n *\n * var teaReady = 'yep'\n * , teaServed = 'nope';\n *\n * assert.isNotBoolean(teaReady, 'is the tea ready');\n * assert.isNotBoolean(teaServed, 'has tea been served');\n *\n * @name isNotBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotBoolean = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('boolean');\n };\n\n /**\n * ### .typeOf(value, name, [message])\n *\n * Asserts that `value`'s type is `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');\n * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');\n * assert.typeOf('tea', 'string', 'we have a string');\n * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');\n * assert.typeOf(null, 'null', 'we have a null');\n * assert.typeOf(undefined, 'undefined', 'we have an undefined');\n *\n * @name typeOf\n * @param {Mixed} value\n * @param {String} name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.typeOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.a(type);\n };\n\n /**\n * ### .notTypeOf(value, name, [message])\n *\n * Asserts that `value`'s type is _not_ `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.notTypeOf('tea', 'number', 'strings are not numbers');\n *\n * @name notTypeOf\n * @param {Mixed} value\n * @param {String} typeof name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notTypeOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.a(type);\n };\n\n /**\n * ### .instanceOf(object, constructor, [message])\n *\n * Asserts that `value` is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new Tea('chai');\n *\n * assert.instanceOf(chai, Tea, 'chai is an instance of tea');\n *\n * @name instanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.instanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.instanceOf(type);\n };\n\n /**\n * ### .notInstanceOf(object, constructor, [message])\n *\n * Asserts `value` is not an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new String('chai');\n *\n * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');\n *\n * @name notInstanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInstanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.instanceOf(type);\n };\n\n /**\n * ### .include(haystack, needle, [message])\n *\n * Asserts that `haystack` includes `needle`. Works\n * for strings and arrays.\n *\n * assert.include('foobar', 'bar', 'foobar contains string \"bar\"');\n * assert.include([ 1, 2, 3 ], 3, 'array contains value');\n *\n * @name include\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.include = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.include).include(inc);\n };\n\n /**\n * ### .notInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` does not include `needle`. Works\n * for strings and arrays.\n *\n * assert.notInclude('foobar', 'baz', 'string not include substring');\n * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');\n *\n * @name notInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notInclude).not.include(inc);\n };\n\n /**\n * ### .match(value, regexp, [message])\n *\n * Asserts that `value` matches the regular expression `regexp`.\n *\n * assert.match('foobar', /^foo/, 'regexp matches');\n *\n * @name match\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.match = function (exp, re, msg) {\n new Assertion(exp, msg).to.match(re);\n };\n\n /**\n * ### .notMatch(value, regexp, [message])\n *\n * Asserts that `value` does not match the regular expression `regexp`.\n *\n * assert.notMatch('foobar', /^foo/, 'regexp does not match');\n *\n * @name notMatch\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notMatch = function (exp, re, msg) {\n new Assertion(exp, msg).to.not.match(re);\n };\n\n /**\n * ### .property(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`.\n *\n * assert.property({ tea: { green: 'matcha' }}, 'tea');\n *\n * @name property\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.property = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.property(prop);\n };\n\n /**\n * ### .notProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`.\n *\n * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');\n *\n * @name notProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.property(prop);\n };\n\n /**\n * ### .deepProperty(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`, which can be a\n * string using dot- and bracket-notation for deep reference.\n *\n * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');\n *\n * @name deepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop);\n };\n\n /**\n * ### .notDeepProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`, which\n * can be a string using dot- and bracket-notation for deep reference.\n *\n * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');\n *\n * @name notDeepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop);\n };\n\n /**\n * ### .propertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`.\n *\n * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');\n *\n * @name propertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.property(prop, val);\n };\n\n /**\n * ### .propertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`.\n *\n * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');\n *\n * @name propertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.property(prop, val);\n };\n\n /**\n * ### .deepPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`. `property` can use dot- and bracket-notation for deep\n * reference.\n *\n * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');\n *\n * @name deepPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop, val);\n };\n\n /**\n * ### .deepPropertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`. `property` can use dot- and\n * bracket-notation for deep reference.\n *\n * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');\n *\n * @name deepPropertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop, val);\n };\n\n /**\n * ### .lengthOf(object, length, [message])\n *\n * Asserts that `object` has a `length` property with the expected value.\n *\n * assert.lengthOf([1,2,3], 3, 'array has length of 3');\n * assert.lengthOf('foobar', 6, 'string has length of 6');\n *\n * @name lengthOf\n * @param {Mixed} object\n * @param {Number} length\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.lengthOf = function (exp, len, msg) {\n new Assertion(exp, msg).to.have.length(len);\n };\n\n /**\n * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * assert.throws(fn, 'function throws a reference error');\n * assert.throws(fn, /function throws a reference error/);\n * assert.throws(fn, ReferenceError);\n * assert.throws(fn, ReferenceError, 'function throws a reference error');\n * assert.throws(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throws\n * @alias throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.throws = function (fn, errt, errs, msg) {\n if ('string' === typeof errt || errt instanceof RegExp) {\n errs = errt;\n errt = null;\n }\n\n var assertErr = new Assertion(fn, msg).to.throw(errt, errs);\n return flag(assertErr, 'object');\n };\n\n /**\n * ### .doesNotThrow(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * assert.doesNotThrow(fn, Error, 'function does not throw');\n *\n * @name doesNotThrow\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotThrow = function (fn, type, msg) {\n if ('string' === typeof type) {\n msg = type;\n type = null;\n }\n\n new Assertion(fn, msg).to.not.Throw(type);\n };\n\n /**\n * ### .operator(val1, operator, val2, [message])\n *\n * Compares two values using `operator`.\n *\n * assert.operator(1, '<', 2, 'everything is ok');\n * assert.operator(1, '>', 2, 'this will fail');\n *\n * @name operator\n * @param {Mixed} val1\n * @param {String} operator\n * @param {Mixed} val2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.operator = function (val, operator, val2, msg) {\n var ok;\n switch(operator) {\n case '==':\n ok = val == val2;\n break;\n case '===':\n ok = val === val2;\n break;\n case '>':\n ok = val > val2;\n break;\n case '>=':\n ok = val >= val2;\n break;\n case '<':\n ok = val < val2;\n break;\n case '<=':\n ok = val <= val2;\n break;\n case '!=':\n ok = val != val2;\n break;\n case '!==':\n ok = val !== val2;\n break;\n default:\n throw new Error('Invalid operator \"' + operator + '\"');\n }\n var test = new Assertion(ok, msg);\n test.assert(\n true === flag(test, 'object')\n , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)\n , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );\n };\n\n /**\n * ### .closeTo(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.closeTo(1.5, 1, 0.5, 'numbers are close');\n *\n * @name closeTo\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.closeTo = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.closeTo(exp, delta);\n };\n\n /**\n * ### .approximately(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.approximately(1.5, 1, 0.5, 'numbers are close');\n *\n * @name approximately\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.approximately = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.approximately(exp, delta);\n };\n\n /**\n * ### .sameMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members.\n * Order is not taken into account.\n *\n * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');\n *\n * @name sameMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.members(set2);\n }\n\n /**\n * ### .sameDeepMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members - using a deep equality checking.\n * Order is not taken into account.\n *\n * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members');\n *\n * @name sameDeepMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameDeepMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.deep.members(set2);\n }\n\n /**\n * ### .includeMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset`.\n * Order is not taken into account.\n *\n * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');\n *\n * @name includeMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.members(subset);\n }\n\n /**\n * ### .includeDeepMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` - using deep equality checking.\n * Order is not taken into account.\n * Duplicates are ignored.\n *\n * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');\n *\n * @name includeDeepMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeDeepMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.deep.members(subset);\n }\n\n /**\n * ### .oneOf(inList, list, [message])\n *\n * Asserts that non-object, non-array value `inList` appears in the flat array `list`.\n *\n * assert.oneOf(1, [ 2, 1 ], 'Not found in list');\n *\n * @name oneOf\n * @param {*} inList\n * @param {Array<*>} list\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.oneOf = function (inList, list, msg) {\n new Assertion(inList, msg).to.be.oneOf(list);\n }\n\n /**\n * ### .changes(function, object, property)\n *\n * Asserts that a function changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 22 };\n * assert.changes(fn, obj, 'val');\n *\n * @name changes\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changes = function (fn, obj, prop) {\n new Assertion(fn).to.change(obj, prop);\n }\n\n /**\n * ### .doesNotChange(function, object, property)\n *\n * Asserts that a function does not changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { console.log('foo'); };\n * assert.doesNotChange(fn, obj, 'val');\n *\n * @name doesNotChange\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotChange = function (fn, obj, prop) {\n new Assertion(fn).to.not.change(obj, prop);\n }\n\n /**\n * ### .increases(function, object, property)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 13 };\n * assert.increases(fn, obj, 'val');\n *\n * @name increases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increases = function (fn, obj, prop) {\n new Assertion(fn).to.increase(obj, prop);\n }\n\n /**\n * ### .doesNotIncrease(function, object, property)\n *\n * Asserts that a function does not increase object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 8 };\n * assert.doesNotIncrease(fn, obj, 'val');\n *\n * @name doesNotIncrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotIncrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.increase(obj, prop);\n }\n\n /**\n * ### .decreases(function, object, property)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.decreases(fn, obj, 'val');\n *\n * @name decreases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreases = function (fn, obj, prop) {\n new Assertion(fn).to.decrease(obj, prop);\n }\n\n /**\n * ### .doesNotDecrease(function, object, property)\n *\n * Asserts that a function does not decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * assert.doesNotDecrease(fn, obj, 'val');\n *\n * @name doesNotDecrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotDecrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.decrease(obj, prop);\n }\n\n /*!\n * ### .ifError(object)\n *\n * Asserts if value is not a false value, and throws if it is a true value.\n * This is added to allow for chai to be a drop-in replacement for Node's\n * assert class.\n *\n * var err = new Error('I am a custom error');\n * assert.ifError(err); // Rethrows err!\n *\n * @name ifError\n * @param {Object} object\n * @namespace Assert\n * @api public\n */\n\n assert.ifError = function (val) {\n if (val) {\n throw(val);\n }\n };\n\n /**\n * ### .isExtensible(object)\n *\n * Asserts that `object` is extensible (can have new properties added to it).\n *\n * assert.isExtensible({});\n *\n * @name isExtensible\n * @alias extensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.be.extensible;\n };\n\n /**\n * ### .isNotExtensible(object)\n *\n * Asserts that `object` is _not_ extensible.\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freese({});\n *\n * assert.isNotExtensible(nonExtensibleObject);\n * assert.isNotExtensible(sealedObject);\n * assert.isNotExtensible(frozenObject);\n *\n * @name isNotExtensible\n * @alias notExtensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.extensible;\n };\n\n /**\n * ### .isSealed(object)\n *\n * Asserts that `object` is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.seal({});\n *\n * assert.isSealed(sealedObject);\n * assert.isSealed(frozenObject);\n *\n * @name isSealed\n * @alias sealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isSealed = function (obj, msg) {\n new Assertion(obj, msg).to.be.sealed;\n };\n\n /**\n * ### .isNotSealed(object)\n *\n * Asserts that `object` is _not_ sealed.\n *\n * assert.isNotSealed({});\n *\n * @name isNotSealed\n * @alias notSealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotSealed = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.sealed;\n };\n\n /**\n * ### .isFrozen(object)\n *\n * Asserts that `object` is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n * assert.frozen(frozenObject);\n *\n * @name isFrozen\n * @alias frozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.be.frozen;\n };\n\n /**\n * ### .isNotFrozen(object)\n *\n * Asserts that `object` is _not_ frozen.\n *\n * assert.isNotFrozen({});\n *\n * @name isNotFrozen\n * @alias notFrozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.frozen;\n };\n\n /*!\n * Aliases.\n */\n\n (function alias(name, as){\n assert[as] = assert[name];\n return alias;\n })\n ('isOk', 'ok')\n ('isNotOk', 'notOk')\n ('throws', 'throw')\n ('throws', 'Throw')\n ('isExtensible', 'extensible')\n ('isNotExtensible', 'notExtensible')\n ('isSealed', 'sealed')\n ('isNotSealed', 'notSealed')\n ('isFrozen', 'frozen')\n ('isNotFrozen', 'notFrozen');\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n chai.expect = function (val, message) {\n return new chai.Assertion(val, message);\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Expect\n * @api public\n */\n\n chai.expect.fail = function (actual, expected, message, operator) {\n message = message || 'expect.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, chai.expect.fail);\n };\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n var Assertion = chai.Assertion;\n\n function loadShould () {\n // explicitly define this method as function as to have it's name to include as `ssfi`\n function shouldGetter() {\n if (this instanceof String || this instanceof Number || this instanceof Boolean ) {\n return new Assertion(this.valueOf(), null, shouldGetter);\n }\n return new Assertion(this, null, shouldGetter);\n }\n function shouldSetter(value) {\n // See https://github.com/chaijs/chai/issues/86: this makes\n // `whatever.should = someValue` actually set `someValue`, which is\n // especially useful for `global.should = require('chai').should()`.\n //\n // Note that we have to use [[DefineProperty]] instead of [[Put]]\n // since otherwise we would trigger this very setter!\n Object.defineProperty(this, 'should', {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n // modify Object.prototype to have `should`\n Object.defineProperty(Object.prototype, 'should', {\n set: shouldSetter\n , get: shouldGetter\n , configurable: true\n });\n\n var should = {};\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Should\n * @api public\n */\n\n should.fail = function (actual, expected, message, operator) {\n message = message || 'should.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, should.fail);\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * should.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * should.throw(fn, 'function throws a reference error');\n * should.throw(fn, /function throws a reference error/);\n * should.throw(fn, ReferenceError);\n * should.throw(fn, ReferenceError, 'function throws a reference error');\n * should.throw(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.Throw(errt, errs);\n };\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi';\n *\n * should.exist(foo, 'foo exists');\n *\n * @name exist\n * @namespace Should\n * @api public\n */\n\n should.exist = function (val, msg) {\n new Assertion(val, msg).to.exist;\n }\n\n // negation\n should.not = {}\n\n /**\n * ### .not.equal(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * should.not.equal(3, 4, 'these numbers are not equal');\n *\n * @name not.equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.not.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.not.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * should.not.throw(fn, Error, 'function does not throw');\n *\n * @name not.throw\n * @alias not.Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.not.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.not.Throw(errt, errs);\n };\n\n /**\n * ### .not.exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var bar = null;\n *\n * should.not.exist(bar, 'bar does not exist');\n *\n * @name not.exist\n * @namespace Should\n * @api public\n */\n\n should.not.exist = function (val, msg) {\n new Assertion(val, msg).to.not.exist;\n }\n\n should['throw'] = should['Throw'];\n should.not['throw'] = should.not['Throw'];\n\n return should;\n };\n\n chai.should = loadShould;\n chai.Should = loadShould;\n};\n","/*!\n * Chai - addChainingMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar transferFlags = require('./transferFlags');\nvar flag = require('./flag');\nvar config = require('../config');\n\n/*!\n * Module variables\n */\n\n// Check whether `__proto__` is supported\nvar hasProtoSupport = '__proto__' in Object;\n\n// Without `__proto__` support, this module will need to add properties to a function.\n// However, some Function.prototype methods cannot be overwritten,\n// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).\nvar excludeNames = /^(?:length|name|arguments|caller)$/;\n\n// Cache `Function` properties\nvar call = Function.prototype.call,\n apply = Function.prototype.apply;\n\n/**\n * ### addChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Adds a method to an object, such that the method can also be chained.\n *\n * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);\n *\n * The result can then be used as both a method assertion, executing both `method` and\n * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.\n *\n * expect(fooStr).to.be.foo('bar');\n * expect(fooStr).to.be.foo.equal('foo');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for `name`, when called\n * @param {Function} chainingBehavior function to be called every time the property is accessed\n * @namespace Utils\n * @name addChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n if (typeof chainingBehavior !== 'function') {\n chainingBehavior = function () { };\n }\n\n var chainableBehavior = {\n method: method\n , chainingBehavior: chainingBehavior\n };\n\n // save the methods so we can overwrite them later, if we need to.\n if (!ctx.__methods) {\n ctx.__methods = {};\n }\n ctx.__methods[name] = chainableBehavior;\n\n Object.defineProperty(ctx, name,\n { get: function () {\n chainableBehavior.chainingBehavior.call(this);\n\n var assert = function assert() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', assert);\n var result = chainableBehavior.method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n\n // Use `__proto__` if available\n if (hasProtoSupport) {\n // Inherit all properties from the object by replacing the `Function` prototype\n var prototype = assert.__proto__ = Object.create(this);\n // Restore the `call` and `apply` methods from `Function`\n prototype.call = call;\n prototype.apply = apply;\n }\n // Otherwise, redefine all properties (slow!)\n else {\n var asserterNames = Object.getOwnPropertyNames(ctx);\n asserterNames.forEach(function (asserterName) {\n if (!excludeNames.test(asserterName)) {\n var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);\n Object.defineProperty(assert, asserterName, pd);\n }\n });\n }\n\n transferFlags(this, assert);\n return assert;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - addMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\n\n/**\n * ### .addMethod (ctx, name, method)\n *\n * Adds a method to the prototype of an object.\n *\n * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(fooStr).to.be.foo('bar');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for name\n * @namespace Utils\n * @name addMethod\n * @api public\n */\nvar flag = require('./flag');\n\nmodule.exports = function (ctx, name, method) {\n ctx[name] = function () {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', ctx[name]);\n var result = method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - addProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\nvar flag = require('./flag');\n\n/**\n * ### addProperty (ctx, name, getter)\n *\n * Adds a property to the prototype of an object.\n *\n * utils.addProperty(chai.Assertion.prototype, 'foo', function () {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.instanceof(Foo);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.foo;\n *\n * @param {Object} ctx object to which the property is added\n * @param {String} name of property to add\n * @param {Function} getter function to be used for name\n * @namespace Utils\n * @name addProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n Object.defineProperty(ctx, name,\n { get: function addProperty() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', addProperty);\n\n var result = getter.call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - expectTypes utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### expectTypes(obj, types)\n *\n * Ensures that the object being tested against is of a valid type.\n *\n * utils.expectTypes(this, ['array', 'object', 'string']);\n *\n * @param {Mixed} obj constructed Assertion\n * @param {Array} type A list of allowed types for this assertion\n * @namespace Utils\n * @name expectTypes\n * @api public\n */\n\nvar AssertionError = require('assertion-error');\nvar flag = require('./flag');\nvar type = require('type-detect');\n\nmodule.exports = function (obj, types) {\n var obj = flag(obj, 'object');\n types = types.map(function (t) { return t.toLowerCase(); });\n types.sort();\n\n // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum'\n var str = types.map(function (t, index) {\n var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';\n var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';\n return or + art + ' ' + t;\n }).join(', ');\n\n if (!types.some(function (expected) { return type(obj) === expected; })) {\n throw new AssertionError(\n 'object tested must be ' + str + ', but ' + type(obj) + ' given'\n );\n }\n};\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### flag(object, key, [value])\n *\n * Get or set a flag value on an object. If a\n * value is provided it will be set, else it will\n * return the currently set value or `undefined` if\n * the value is not set.\n *\n * utils.flag(this, 'foo', 'bar'); // setter\n * utils.flag(this, 'foo'); // getter, returns `bar`\n *\n * @param {Object} object constructed Assertion\n * @param {String} key\n * @param {Mixed} value (optional)\n * @namespace Utils\n * @name flag\n * @api private\n */\n\nmodule.exports = function (obj, key, value) {\n var flags = obj.__flags || (obj.__flags = Object.create(null));\n if (arguments.length === 3) {\n flags[key] = value;\n } else {\n return flags[key];\n }\n};\n","/*!\n * Chai - getActual utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getActual(object, [actual])\n *\n * Returns the `actual` value for an Assertion\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getActual\n */\n\nmodule.exports = function (obj, args) {\n return args.length > 4 ? args[4] : obj._obj;\n};\n","/*!\n * Chai - getEnumerableProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getEnumerableProperties(object)\n *\n * This allows the retrieval of enumerable property names of an object,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getEnumerableProperties\n * @api public\n */\n\nmodule.exports = function getEnumerableProperties(object) {\n var result = [];\n for (var name in object) {\n result.push(name);\n }\n return result;\n};\n","/*!\n * Chai - message composition utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag')\n , getActual = require('./getActual')\n , inspect = require('./inspect')\n , objDisplay = require('./objDisplay');\n\n/**\n * ### .getMessage(object, message, negateMessage)\n *\n * Construct the error message based on flags\n * and template tags. Template tags will return\n * a stringified inspection of the object referenced.\n *\n * Message template tags:\n * - `#{this}` current asserted object\n * - `#{act}` actual value\n * - `#{exp}` expected value\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getMessage\n * @api public\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , val = flag(obj, 'object')\n , expected = args[3]\n , actual = getActual(obj, args)\n , msg = negate ? args[2] : args[1]\n , flagMsg = flag(obj, 'message');\n\n if(typeof msg === \"function\") msg = msg();\n msg = msg || '';\n msg = msg\n .replace(/#\\{this\\}/g, function () { return objDisplay(val); })\n .replace(/#\\{act\\}/g, function () { return objDisplay(actual); })\n .replace(/#\\{exp\\}/g, function () { return objDisplay(expected); });\n\n return flagMsg ? flagMsg + ': ' + msg : msg;\n};\n","/*!\n * Chai - getName utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getName(func)\n *\n * Gets the name of a function, in a cross-browser way.\n *\n * @param {Function} a function (usually a constructor)\n * @namespace Utils\n * @name getName\n */\n\nmodule.exports = function (func) {\n if (func.name) return func.name;\n\n var match = /^\\s?function ([^(]*)\\(/.exec(func);\n return match && match[1] ? match[1] : \"\";\n};\n","/*!\n * Chai - getPathInfo utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar hasProperty = require('./hasProperty');\n\n/**\n * ### .getPathInfo(path, object)\n *\n * This allows the retrieval of property info in an\n * object given a string path.\n *\n * The path info consists of an object with the\n * following properties:\n *\n * * parent - The parent object of the property referenced by `path`\n * * name - The name of the final property, a number if it was an array indexer\n * * value - The value of the property, if it exists, otherwise `undefined`\n * * exists - Whether the property exists or not\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} info\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nmodule.exports = function getPathInfo(path, obj) {\n var parsed = parsePath(path),\n last = parsed[parsed.length - 1];\n\n var info = {\n parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj,\n name: last.p || last.i,\n value: _getPathValue(parsed, obj)\n };\n info.exists = hasProperty(info.name, info.parent);\n\n return info;\n};\n\n\n/*!\n * ## parsePath(path)\n *\n * Helper function used to parse string object\n * paths. Use in conjunction with `_getPathValue`.\n *\n * var parsed = parsePath('myobject.property.subprop');\n *\n * ### Paths:\n *\n * * Can be as near infinitely deep and nested\n * * Arrays are also valid using the formal `myobject.document[3].property`.\n * * Literal dots and brackets (not delimiter) must be backslash-escaped.\n *\n * @param {String} path\n * @returns {Object} parsed\n * @api private\n */\n\nfunction parsePath (path) {\n var str = path.replace(/([^\\\\])\\[/g, '$1.[')\n , parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n return parts.map(function (value) {\n var re = /^\\[(\\d+)\\]$/\n , mArr = re.exec(value);\n if (mArr) return { i: parseFloat(mArr[1]) };\n else return { p: value.replace(/\\\\([.\\[\\]])/g, '$1') };\n });\n}\n\n\n/*!\n * ## _getPathValue(parsed, obj)\n *\n * Helper companion function for `.parsePath` that returns\n * the value located at the parsed address.\n *\n * var value = getPathValue(parsed, obj);\n *\n * @param {Object} parsed definition from `parsePath`.\n * @param {Object} object to search against\n * @param {Number} object to search against\n * @returns {Object|Undefined} value\n * @api private\n */\n\nfunction _getPathValue (parsed, obj, index) {\n var tmp = obj\n , res;\n\n index = (index === undefined ? parsed.length : index);\n\n for (var i = 0, l = index; i < l; i++) {\n var part = parsed[i];\n if (tmp) {\n if ('undefined' !== typeof part.p)\n tmp = tmp[part.p];\n else if ('undefined' !== typeof part.i)\n tmp = tmp[part.i];\n if (i == (l - 1)) res = tmp;\n } else {\n res = undefined;\n }\n }\n return res;\n}\n","/*!\n * Chai - getPathValue utility\n * Copyright(c) 2012-2014 Jake Luer \n * @see https://github.com/logicalparadox/filtr\n * MIT Licensed\n */\n\nvar getPathInfo = require('./getPathInfo');\n\n/**\n * ### .getPathValue(path, object)\n *\n * This allows the retrieval of values in an\n * object given a string path.\n *\n * var obj = {\n * prop1: {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n * , prop2: {\n * arr: [ { nested: 'Universe' } ]\n * , str: 'Hello again!'\n * }\n * }\n *\n * The following would be the results.\n *\n * getPathValue('prop1.str', obj); // Hello\n * getPathValue('prop1.att[2]', obj); // b\n * getPathValue('prop2.arr[0].nested', obj); // Universe\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} value or `undefined`\n * @namespace Utils\n * @name getPathValue\n * @api public\n */\nmodule.exports = function(path, obj) {\n var info = getPathInfo(path, obj);\n return info.value;\n};\n","/*!\n * Chai - getProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getProperties(object)\n *\n * This allows the retrieval of property names of an object, enumerable or not,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getProperties\n * @api public\n */\n\nmodule.exports = function getProperties(object) {\n var result = Object.getOwnPropertyNames(object);\n\n function addProperty(property) {\n if (result.indexOf(property) === -1) {\n result.push(property);\n }\n }\n\n var proto = Object.getPrototypeOf(object);\n while (proto !== null) {\n Object.getOwnPropertyNames(proto).forEach(addProperty);\n proto = Object.getPrototypeOf(proto);\n }\n\n return result;\n};\n","/*!\n * Chai - hasProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar type = require('type-detect');\n\n/**\n * ### .hasProperty(object, name)\n *\n * This allows checking whether an object has\n * named property or numeric array index.\n *\n * Basically does the same thing as the `in`\n * operator but works properly with natives\n * and null/undefined values.\n *\n * var obj = {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n *\n * The following would be the results.\n *\n * hasProperty('str', obj); // true\n * hasProperty('constructor', obj); // true\n * hasProperty('bar', obj); // false\n *\n * hasProperty('length', obj.str); // true\n * hasProperty(1, obj.str); // true\n * hasProperty(5, obj.str); // false\n *\n * hasProperty('length', obj.arr); // true\n * hasProperty(2, obj.arr); // true\n * hasProperty(3, obj.arr); // false\n *\n * @param {Objuect} object\n * @param {String|Number} name\n * @returns {Boolean} whether it exists\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nvar literals = {\n 'number': Number\n , 'string': String\n};\n\nmodule.exports = function hasProperty(name, obj) {\n var ot = type(obj);\n\n // Bad Object, obviously no props at all\n if(ot === 'null' || ot === 'undefined')\n return false;\n\n // The `in` operator does not work with certain literals\n // box these before the check\n if(literals[ot] && typeof obj !== 'object')\n obj = new literals[ot](obj);\n\n return name in obj;\n};\n","/*!\n * chai\n * Copyright(c) 2011 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Main exports\n */\n\nvar exports = module.exports = {};\n\n/*!\n * test utility\n */\n\nexports.test = require('./test');\n\n/*!\n * type utility\n */\n\nexports.type = require('type-detect');\n\n/*!\n * expectTypes utility\n */\nexports.expectTypes = require('./expectTypes');\n\n/*!\n * message utility\n */\n\nexports.getMessage = require('./getMessage');\n\n/*!\n * actual utility\n */\n\nexports.getActual = require('./getActual');\n\n/*!\n * Inspect util\n */\n\nexports.inspect = require('./inspect');\n\n/*!\n * Object Display util\n */\n\nexports.objDisplay = require('./objDisplay');\n\n/*!\n * Flag utility\n */\n\nexports.flag = require('./flag');\n\n/*!\n * Flag transferring utility\n */\n\nexports.transferFlags = require('./transferFlags');\n\n/*!\n * Deep equal utility\n */\n\nexports.eql = require('deep-eql');\n\n/*!\n * Deep path value\n */\n\nexports.getPathValue = require('./getPathValue');\n\n/*!\n * Deep path info\n */\n\nexports.getPathInfo = require('./getPathInfo');\n\n/*!\n * Check if a property exists\n */\n\nexports.hasProperty = require('./hasProperty');\n\n/*!\n * Function name\n */\n\nexports.getName = require('./getName');\n\n/*!\n * add Property\n */\n\nexports.addProperty = require('./addProperty');\n\n/*!\n * add Method\n */\n\nexports.addMethod = require('./addMethod');\n\n/*!\n * overwrite Property\n */\n\nexports.overwriteProperty = require('./overwriteProperty');\n\n/*!\n * overwrite Method\n */\n\nexports.overwriteMethod = require('./overwriteMethod');\n\n/*!\n * Add a chainable method\n */\n\nexports.addChainableMethod = require('./addChainableMethod');\n\n/*!\n * Overwrite chainable method\n */\n\nexports.overwriteChainableMethod = require('./overwriteChainableMethod');\n","// This is (almost) directly from Node.js utils\n// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js\n\nvar getName = require('./getName');\nvar getProperties = require('./getProperties');\nvar getEnumerableProperties = require('./getEnumerableProperties');\n\nmodule.exports = inspect;\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Boolean} showHidden Flag that shows hidden (not enumerable)\n * properties of objects.\n * @param {Number} depth Depth in which to descend in object. Default is 2.\n * @param {Boolean} colors Flag to turn on ANSI escape codes to color the\n * output. Default is false (no coloring).\n * @namespace Utils\n * @name inspect\n */\nfunction inspect(obj, showHidden, depth, colors) {\n var ctx = {\n showHidden: showHidden,\n seen: [],\n stylize: function (str) { return str; }\n };\n return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));\n}\n\n// Returns true if object is a DOM element.\nvar isDOMElement = function (object) {\n if (typeof HTMLElement === 'object') {\n return object instanceof HTMLElement;\n } else {\n return object &&\n typeof object === 'object' &&\n object.nodeType === 1 &&\n typeof object.nodeName === 'string';\n }\n};\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (value && typeof value.inspect === 'function' &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes);\n if (typeof ret !== 'string') {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // If this is a DOM element, try to get the outer HTML.\n if (isDOMElement(value)) {\n if ('outerHTML' in value) {\n return value.outerHTML;\n // This value does not have an outerHTML attribute,\n // it could still be an XML element\n } else {\n // Attempt to serialize it\n try {\n if (document.xmlVersion) {\n var xmlSerializer = new XMLSerializer();\n return xmlSerializer.serializeToString(value);\n } else {\n // Firefox 11- do not support outerHTML\n // It does, however, support innerHTML\n // Use the following to render the element\n var ns = \"http://www.w3.org/1999/xhtml\";\n var container = document.createElementNS(ns, '_');\n\n container.appendChild(value.cloneNode(false));\n html = container.innerHTML\n .replace('><', '>' + value.innerHTML + '<');\n container.innerHTML = '';\n return html;\n }\n } catch (err) {\n // This could be a non-native DOM implementation,\n // continue with the normal flow:\n // printing the element as if it is an object.\n }\n }\n }\n\n // Look up the keys of the object.\n var visibleKeys = getEnumerableProperties(value);\n var keys = ctx.showHidden ? getProperties(value) : visibleKeys;\n\n // Some type of object without properties can be shortcutted.\n // In IE, errors have a single `stack` property, or if they are vanilla `Error`,\n // a `stack` plus `description` property; ignore those for consistency.\n if (keys.length === 0 || (isError(value) && (\n (keys.length === 1 && keys[0] === 'stack') ||\n (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')\n ))) {\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n return ctx.stylize('[Function' + nameSuffix + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n base = ' [Function' + nameSuffix + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n return formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n switch (typeof value) {\n case 'undefined':\n return ctx.stylize('undefined', 'undefined');\n\n case 'string':\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n\n case 'number':\n if (value === 0 && (1/value) === -Infinity) {\n return ctx.stylize('-0', 'number');\n }\n return ctx.stylize('' + value, 'number');\n\n case 'boolean':\n return ctx.stylize('' + value, 'boolean');\n }\n // For some reason typeof null is \"object\", so special case here.\n if (value === null) {\n return ctx.stylize('null', 'null');\n }\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (Object.prototype.hasOwnProperty.call(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str;\n if (value.__lookupGetter__) {\n if (value.__lookupGetter__(key)) {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n }\n if (visibleKeys.indexOf(key) < 0) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(value[key]) < 0) {\n if (recurseTimes === null) {\n str = formatValue(ctx, value[key], null);\n } else {\n str = formatValue(ctx, value[key], recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (typeof name === 'undefined') {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\nfunction isArray(ar) {\n return Array.isArray(ar) ||\n (typeof ar === 'object' && objectToString(ar) === '[object Array]');\n}\n\nfunction isRegExp(re) {\n return typeof re === 'object' && objectToString(re) === '[object RegExp]';\n}\n\nfunction isDate(d) {\n return typeof d === 'object' && objectToString(d) === '[object Date]';\n}\n\nfunction isError(e) {\n return typeof e === 'object' && objectToString(e) === '[object Error]';\n}\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar inspect = require('./inspect');\nvar config = require('../config');\n\n/**\n * ### .objDisplay (object)\n *\n * Determines if an object or an array matches\n * criteria to be inspected in-line for error\n * messages or should be truncated.\n *\n * @param {Mixed} javascript object to inspect\n * @name objDisplay\n * @namespace Utils\n * @api public\n */\n\nmodule.exports = function (obj) {\n var str = inspect(obj)\n , type = Object.prototype.toString.call(obj);\n\n if (config.truncateThreshold && str.length >= config.truncateThreshold) {\n if (type === '[object Function]') {\n return !obj.name || obj.name === ''\n ? '[Function]'\n : '[Function: ' + obj.name + ']';\n } else if (type === '[object Array]') {\n return '[ Array(' + obj.length + ') ]';\n } else if (type === '[object Object]') {\n var keys = Object.keys(obj)\n , kstr = keys.length > 2\n ? keys.splice(0, 2).join(', ') + ', ...'\n : keys.join(', ');\n return '{ Object (' + kstr + ') }';\n } else {\n return str;\n }\n } else {\n return str;\n }\n};\n","/*!\n * Chai - overwriteChainableMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Overwites an already existing chainable method\n * and provides access to the previous function or\n * property. Must return functions to be used for\n * name.\n *\n * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',\n * function (_super) {\n * }\n * , function (_super) {\n * }\n * );\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteChainableMethod('foo', fn, fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.have.length(3);\n * expect(myFoo).to.have.length.above(3);\n *\n * @param {Object} ctx object whose method / property is to be overwritten\n * @param {String} name of method / property to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @param {Function} chainingBehavior function that returns a function to be used for property\n * @namespace Utils\n * @name overwriteChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n var chainableBehavior = ctx.__methods[name];\n\n var _chainingBehavior = chainableBehavior.chainingBehavior;\n chainableBehavior.chainingBehavior = function () {\n var result = chainingBehavior(_chainingBehavior).call(this);\n return result === undefined ? this : result;\n };\n\n var _method = chainableBehavior.method;\n chainableBehavior.method = function () {\n var result = method(_method).apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - overwriteMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteMethod (ctx, name, fn)\n *\n * Overwites an already existing method and provides\n * access to previous function. Must return function\n * to be used for name.\n *\n * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {\n * return function (str) {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.value).to.equal(str);\n * } else {\n * _super.apply(this, arguments);\n * }\n * }\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.equal('bar');\n *\n * @param {Object} ctx object whose method is to be overwritten\n * @param {String} name of method to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @namespace Utils\n * @name overwriteMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method) {\n var _method = ctx[name]\n , _super = function () { return this; };\n\n if (_method && 'function' === typeof _method)\n _super = _method;\n\n ctx[name] = function () {\n var result = method(_super).apply(this, arguments);\n return result === undefined ? this : result;\n }\n};\n","/*!\n * Chai - overwriteProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteProperty (ctx, name, fn)\n *\n * Overwites an already existing property getter and provides\n * access to previous value. Must return function to use as getter.\n *\n * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {\n * return function () {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.name).to.equal('bar');\n * } else {\n * _super.call(this);\n * }\n * }\n * });\n *\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.ok;\n *\n * @param {Object} ctx object whose property is to be overwritten\n * @param {String} name of property to overwrite\n * @param {Function} getter function that returns a getter function to be used for name\n * @namespace Utils\n * @name overwriteProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n var _get = Object.getOwnPropertyDescriptor(ctx, name)\n , _super = function () {};\n\n if (_get && 'function' === typeof _get.get)\n _super = _get.get\n\n Object.defineProperty(ctx, name,\n { get: function () {\n var result = getter(_super).call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - test utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag');\n\n/**\n * # test(object, expression)\n *\n * Test and object for expression.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name test\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , expr = args[0];\n return negate ? !expr : expr;\n};\n","/*!\n * Chai - transferFlags utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### transferFlags(assertion, object, includeAll = true)\n *\n * Transfer all the flags for `assertion` to `object`. If\n * `includeAll` is set to `false`, then the base Chai\n * assertion flags (namely `object`, `ssfi`, and `message`)\n * will not be transferred.\n *\n *\n * var newAssertion = new Assertion();\n * utils.transferFlags(assertion, newAssertion);\n *\n * var anotherAsseriton = new Assertion(myObj);\n * utils.transferFlags(assertion, anotherAssertion, false);\n *\n * @param {Assertion} assertion the assertion to transfer the flags from\n * @param {Object} object the object to transfer the flags to; usually a new assertion\n * @param {Boolean} includeAll\n * @namespace Utils\n * @name transferFlags\n * @api private\n */\n\nmodule.exports = function (assertion, object, includeAll) {\n var flags = assertion.__flags || (assertion.__flags = Object.create(null));\n\n if (!object.__flags) {\n object.__flags = Object.create(null);\n }\n\n includeAll = arguments.length === 3 ? includeAll : true;\n\n for (var flag in flags) {\n if (includeAll ||\n (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {\n object.__flags[flag] = flags[flag];\n }\n }\n};\n","module.exports = require('./lib/eql');\n","/*!\n * deep-eql\n * Copyright(c) 2013 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar type = require('type-detect');\n\n/*!\n * Buffer.isBuffer browser shim\n */\n\nvar Buffer;\ntry { Buffer = require('buffer').Buffer; }\ncatch(ex) {\n Buffer = {};\n Buffer.isBuffer = function() { return false; }\n}\n\n/*!\n * Primary Export\n */\n\nmodule.exports = deepEqual;\n\n/**\n * Assert super-strict (egal) equality between\n * two objects of any type.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @param {Array} memoised (optional)\n * @return {Boolean} equal match\n */\n\nfunction deepEqual(a, b, m) {\n if (sameValue(a, b)) {\n return true;\n } else if ('date' === type(a)) {\n return dateEqual(a, b);\n } else if ('regexp' === type(a)) {\n return regexpEqual(a, b);\n } else if (Buffer.isBuffer(a)) {\n return bufferEqual(a, b);\n } else if ('arguments' === type(a)) {\n return argumentsEqual(a, b, m);\n } else if (!typeEqual(a, b)) {\n return false;\n } else if (('object' !== type(a) && 'object' !== type(b))\n && ('array' !== type(a) && 'array' !== type(b))) {\n return sameValue(a, b);\n } else {\n return objectEqual(a, b, m);\n }\n}\n\n/*!\n * Strict (egal) equality test. Ensures that NaN always\n * equals NaN and `-0` does not equal `+0`.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} equal match\n */\n\nfunction sameValue(a, b) {\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n return a !== a && b !== b;\n}\n\n/*!\n * Compare the types of two given objects and\n * return if they are equal. Note that an Array\n * has a type of `array` (not `object`) and arguments\n * have a type of `arguments` (not `array`/`object`).\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction typeEqual(a, b) {\n return type(a) === type(b);\n}\n\n/*!\n * Compare two Date objects by asserting that\n * the time values are equal using `saveValue`.\n *\n * @param {Date} a\n * @param {Date} b\n * @return {Boolean} result\n */\n\nfunction dateEqual(a, b) {\n if ('date' !== type(b)) return false;\n return sameValue(a.getTime(), b.getTime());\n}\n\n/*!\n * Compare two regular expressions by converting them\n * to string and checking for `sameValue`.\n *\n * @param {RegExp} a\n * @param {RegExp} b\n * @return {Boolean} result\n */\n\nfunction regexpEqual(a, b) {\n if ('regexp' !== type(b)) return false;\n return sameValue(a.toString(), b.toString());\n}\n\n/*!\n * Assert deep equality of two `arguments` objects.\n * Unfortunately, these must be sliced to arrays\n * prior to test to ensure no bad behavior.\n *\n * @param {Arguments} a\n * @param {Arguments} b\n * @param {Array} memoize (optional)\n * @return {Boolean} result\n */\n\nfunction argumentsEqual(a, b, m) {\n if ('arguments' !== type(b)) return false;\n a = [].slice.call(a);\n b = [].slice.call(b);\n return deepEqual(a, b, m);\n}\n\n/*!\n * Get enumerable properties of a given object.\n *\n * @param {Object} a\n * @return {Array} property names\n */\n\nfunction enumerable(a) {\n var res = [];\n for (var key in a) res.push(key);\n return res;\n}\n\n/*!\n * Simple equality for flat iterable objects\n * such as Arrays or Node.js buffers.\n *\n * @param {Iterable} a\n * @param {Iterable} b\n * @return {Boolean} result\n */\n\nfunction iterableEqual(a, b) {\n if (a.length !== b.length) return false;\n\n var i = 0;\n var match = true;\n\n for (; i < a.length; i++) {\n if (a[i] !== b[i]) {\n match = false;\n break;\n }\n }\n\n return match;\n}\n\n/*!\n * Extension to `iterableEqual` specifically\n * for Node.js Buffers.\n *\n * @param {Buffer} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction bufferEqual(a, b) {\n if (!Buffer.isBuffer(b)) return false;\n return iterableEqual(a, b);\n}\n\n/*!\n * Block for `objectEqual` ensuring non-existing\n * values don't get in.\n *\n * @param {Mixed} object\n * @return {Boolean} result\n */\n\nfunction isValue(a) {\n return a !== null && a !== undefined;\n}\n\n/*!\n * Recursively check the equality of two objects.\n * Once basic sameness has been established it will\n * defer to `deepEqual` for each enumerable key\n * in the object.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction objectEqual(a, b, m) {\n if (!isValue(a) || !isValue(b)) {\n return false;\n }\n\n if (a.prototype !== b.prototype) {\n return false;\n }\n\n var i;\n if (m) {\n for (i = 0; i < m.length; i++) {\n if ((m[i][0] === a && m[i][1] === b)\n || (m[i][0] === b && m[i][1] === a)) {\n return true;\n }\n }\n } else {\n m = [];\n }\n\n try {\n var ka = enumerable(a);\n var kb = enumerable(b);\n } catch (ex) {\n return false;\n }\n\n ka.sort();\n kb.sort();\n\n if (!iterableEqual(ka, kb)) {\n return false;\n }\n\n m.push([ a, b ]);\n\n var key;\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], m)) {\n return false;\n }\n }\n\n return true;\n}\n","/*!\n localForage -- Offline Storage, Improved\n Version 1.5.0\n https://localforage.github.io/localForage\n (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && typeof obj === 'object' && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nexports.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nexports.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nexports.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nexports.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {}\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support (#5572)\n // since Safari 10.1 shipped with fetch, we can use that to detect it\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage && localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs;\nvar dbContexts;\nvar toString = Object.prototype.toString;\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, 'readwrite');\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve) {\n deferredOperation.resolve = resolve;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n resolve(openreq.result);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + ' can\\'t be downgraded from version ' + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Initialize a singleton container for all running localForages.\n if (!dbContexts) {\n dbContexts = {};\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n var req = store.put(value, key);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');\n var store = transaction.objectStore(dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var advanced = false;\n var req = store.openCursor();\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var store = dbInfo.db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName);\n\n var req = store.openCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys\n};\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' (id INTEGER PRIMARY KEY, key unique, value)', [], function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n t.executeSql('INSERT OR REPLACE INTO ' + dbInfo.storeName + ' (key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n t.executeSql('SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n\n resolve(result);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n t.executeSql('SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1\n};\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = dbInfo.name + '/';\n\n if (dbInfo.storeName !== self._defaultConfig.storeName) {\n dbInfo.keyPrefix += dbInfo.storeName + '/';\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n if (localStorage.key(i).indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(localStorage.key(i).substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n // Default API, from Gaia/localStorage.\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2\n};\n\n// Custom drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar CustomDrivers = {};\n\nvar DriverType = {\n INDEXEDDB: 'asyncStorage',\n LOCALSTORAGE: 'localStorageWrapper',\n WEBSQL: 'webSQLStorage'\n};\n\nvar DefaultDriverOrder = [DriverType.INDEXEDDB, DriverType.WEBSQL, DriverType.LOCALSTORAGE];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'];\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nvar driverSupport = {};\n// Check to see if IndexedDB is available and if it is the latest\n// implementation; it's our preferred backend library. We use \"_spec_test\"\n// as the name of the database because it's not the one we'll operate on,\n// but it's useful to make sure its using the right spec.\n// See: https://github.com/mozilla/localForage/issues/128\ndriverSupport[DriverType.INDEXEDDB] = isIndexedDBValid();\n\ndriverSupport[DriverType.WEBSQL] = isWebSQLValid();\n\ndriverSupport[DriverType.LOCALSTORAGE] = isLocalStorageValid();\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var key in arg) {\n if (arg.hasOwnProperty(key)) {\n if (isArray(arg[key])) {\n arguments[0][key] = arg[key].slice();\n } else {\n arguments[0][key] = arg[key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nfunction isLibraryDriver(driverName) {\n for (var driver in DriverType) {\n if (DriverType.hasOwnProperty(driver) && DriverType[driver] === driverName) {\n return true;\n }\n }\n\n return false;\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n this.INDEXEDDB = DriverType.INDEXEDDB;\n this.LOCALSTORAGE = DriverType.LOCALSTORAGE;\n this.WEBSQL = DriverType.WEBSQL;\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n var namingError = new Error('Custom driver name already in use: ' + driverObject._driver);\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n if (isLibraryDriver(driverObject._driver)) {\n reject(namingError);\n return;\n }\n\n var customDriverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0; i < customDriverMethods.length; i++) {\n var customDriverMethod = customDriverMethods[i];\n if (!customDriverMethod || !driverObject[customDriverMethod] || typeof driverObject[customDriverMethod] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var supportPromise = Promise$1.resolve(true);\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n supportPromise = driverObject._support();\n } else {\n supportPromise = Promise$1.resolve(!!driverObject._support);\n }\n }\n\n supportPromise.then(function (supportResult) {\n driverSupport[driverName] = supportResult;\n CustomDrivers[driverName] = driverObject;\n resolve();\n }, reject);\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var self = this;\n var getDriverPromise = Promise$1.resolve().then(function () {\n if (isLibraryDriver(driverName)) {\n switch (driverName) {\n case self.INDEXEDDB:\n return asyncStorage;\n case self.LOCALSTORAGE:\n return localStorageWrapper;\n case self.WEBSQL:\n return webSQLStorage;\n }\n } else if (CustomDrivers[driverName]) {\n return CustomDrivers[driverName];\n } else {\n throw new Error('Driver not found.');\n }\n });\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!driverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0; i < LibraryMethods.length; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});","module.exports = require('./lib/type');\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/*!\n * Detectable javascript natives\n */\n\nvar natives = {\n '[object Array]': 'array'\n , '[object RegExp]': 'regexp'\n , '[object Function]': 'function'\n , '[object Arguments]': 'arguments'\n , '[object Date]': 'date'\n};\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\n\nfunction getType (obj) {\n var str = Object.prototype.toString.call(obj);\n if (natives[str]) return natives[str];\n if (obj === null) return 'null';\n if (obj === undefined) return 'undefined';\n if (obj === Object(obj)) return 'object';\n return typeof obj;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library () {\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function (type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function (obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nvar objectTypeRegexp = /^\\[object (.*)\\]$/;\n\nfunction getType(obj) {\n var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase();\n // Let \"new String('')\" return 'object'\n if (typeof Promise === 'function' && obj instanceof Promise) return 'promise';\n // PhantomJS has type \"DOMWindow\" for null\n if (obj === null) return 'null';\n // PhantomJS has type \"DOMWindow\" for undefined\n if (obj === undefined) return 'undefined';\n return type;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library() {\n if (!(this instanceof Library)) return new Library();\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function(type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function(obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","(function (document, window) {\n // DEPENDENCIES\n // ============================================================\n const localforage = require('localforage');\n\n // PROBLEMS\n // ============================================================\n const problems = require('../problems/arrays.js');\n\n // CONFIG\n // ============================================================\n\n // Hoist current problem\n let currentProblem;\n\n // Keys to ignore while user is navigating around the textarea but not changing any code\n const ignoreKeyCodes = [\n 9, // Tab\n 37, // Left arrow\n 39, // Right arrow\n 38, // Up arrow\n 40 // Down arrow\n ];\n\n let config = {\n shuffle: true,\n timer: false,\n currentIndex: 0\n };\n\n // Pull config from localforage\n localforage\n .getItem('js_practice_config')\n .then(val => {\n console.log('localforage val:', val);\n if (val) {\n config = val;\n }\n loadApp(config);\n })\n .catch(err => {\n console.log('localforage err:', err);\n loadApp(config);\n });\n\n function updateLocalstore(config) {\n return localforage\n .setItem('js_practice_config', config)\n .then(val => {\n console.log('Settings updated:', val);\n })\n .catch(err => {\n console.log('Settings update error:', err);\n });\n }\n\n // HELPERS\n // ============================================================\n\n function debounce(func, wait, immediate) {\n let timeout;\n return function () {\n const context = this;\n const args = arguments;\n const later = function () {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n }\n\n // UI\n // ============================================================\n\n // elements\n const problemEl = document.getElementById('problem');\n const codeEl = document.getElementById('code');\n const testSuiteEl = document.getElementById('test-suite');\n const testTotalEl = document.getElementById('test-total');\n const evalConsoleEl = document.getElementById('eval-output');\n const assertConsoleEl = document.getElementById('assert-output');\n const shuffleProblemsButtonEl = document.getElementById('shuffle-problems');\n const previousProblemButtonEl = document.getElementById('prev-problem');\n const nextProblemButtonEl = document.getElementById('next-problem');\n\n // Get indexes\n function getRandomIndex(problemsArr) {\n const ind = Math.floor(Math.random() * problemsArr.length);\n config.currentIndex = ind;\n updateLocalstore(config);\n return ind;\n }\n\n function getPreviousIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at beginning, go to end\n if (currentIndex === 0) {\n probInd = problemsArr.length - 1;\n } else {\n probInd = currentIndex - 1;\n }\n return probInd;\n }\n\n function getNextIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at end or invalid, restart series\n if (currentIndex >= problemsArr.length - 1 || currentIndex < 0) {\n probInd = 0;\n } else {\n probInd = currentIndex + 1;\n }\n return probInd;\n }\n\n // Get problems\n function getCurrentProblem(problemsArr) {\n return problemsArr[config.currentIndex];\n }\n\n function previousProblem() {\n console.log('previousProblem!');\n // Activate back button, for visual queue of nav feedback\n previousProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getPreviousIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function nextProblem() {\n console.log('nextProblem!');\n // Activate next button, for visual queue of nav feedback\n nextProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getNextIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function toggleShuffle() {\n console.log('toggle shuffle!');\n config.shuffle = !config.shuffle; // Flip it\n shuffleProblemsButtonEl.classList.toggle('active');\n previousProblemButtonEl.parentNode.classList.toggle('hidden');\n updateLocalstore(config);\n }\n\n function loadProblem(problemObj) {\n currentProblem = problemObj;\n // Prob question\n problemEl.innerText = problemObj.prompt;\n // Prob given code\n if (problemObj.given) {\n codeEl.value = problemObj.given;\n }\n // Seed the tests, pass (init = true) as second param\n testSuite(null, true);\n }\n\n // TODO: Build the assert errors into the test dom on each update.\n function updateTests(testStatus, init) {\n if (init === true) {\n buildTests(currentProblem.tests);\n }\n updateTestStatus(testStatus);\n }\n\n function buildTests(tests) {\n if (tests) {\n const testsDom = tests\n .map(test => {\n return `
\n
[✘]
\n
${test.name}
\n
`;\n })\n .join('');\n testSuiteEl.innerHTML = testsDom;\n }\n }\n\n function updateTestStatus(testStatuses) {\n if (!testStatuses) {\n throw new Error('No testStatuses provided.');\n }\n // Find out if all tests have passed or not\n let allPassed = true;\n testStatuses.forEach(testPassed => {\n if (testPassed !== true) {\n allPassed = false;\n }\n });\n const testEls = [].slice.call(testSuiteEl.querySelectorAll('.test-state'));\n testEls.forEach((testStatusEl, iter) => {\n if (testStatuses[iter] === true) {\n testStatusEl.innerHTML = '[✓]';\n testStatusEl.classList.remove('fail');\n testStatusEl.classList.add('pass');\n } else {\n testStatusEl.innerHTML = '[✘]';\n testStatusEl.classList.remove('pass');\n testStatusEl.classList.add('fail');\n }\n });\n\n if (allPassed === true) {\n testTotalEl.innerText = 'PASS';\n testTotalEl.classList.remove('fail');\n testTotalEl.classList.add('pass');\n } else {\n testTotalEl.innerText = 'FAIL';\n testTotalEl.classList.remove('pass');\n testTotalEl.classList.add('fail');\n }\n }\n\n function printAssertError(errObj) {\n // Make element string\n let inner = '';\n if (errObj !== null) {\n inner = `\n
\n Expected: ${JSON.stringify(errObj.expected)}\n Actual: ${JSON.stringify(errObj.actual)}\n
`;\n }\n\n // Prepend element\n assertConsoleEl.innerHTML = inner;\n }\n\n function printEvalOutput(errObj, output) {\n // Make element string\n let inner = '';\n if (errObj && errObj.message !== undefined) {\n inner = `\n
\n Syntax Error: ${JSON.stringify(errObj.message)}\n
`;\n } else if (output) {\n inner = `\n
\n Output: ${JSON.stringify(output)}\n
`;\n }\n // Prepend element\n evalConsoleEl.innerHTML = inner;\n }\n\n // VERIFICATION LOGIC\n // ============================================================\n\n function testSuite(init) {\n // Show 'working' indicator\n testTotalEl.classList.toggle('working');\n // Run stuff\n const output = getOutput(codeEl.value);\n // Run tests on code, return object/array of test results\n const tested = runTests(output);\n // Hide 'working' indicator\n testTotalEl.classList.toggle('working');\n // Update UI with results\n updateTests(tested, init);\n }\n\n function getOutput(code) {\n let evald = false;\n try {\n evald = eval(`(function(){${code}})()`); // eslint-disable-line no-eval\n printEvalOutput(null, evald); // Print current output\n } catch (err) {\n printEvalOutput(err);\n }\n return evald;\n }\n\n function runTests(output) {\n let tested = false;\n tested = currentProblem.tests.map(test => {\n let testOutcome = false;\n try {\n if (output) {\n testOutcome = test.test(output);\n }\n printAssertError(null);\n } catch (err) {\n printAssertError(err);\n }\n return testOutcome;\n });\n return tested;\n }\n\n // Wrapped to prevent race with local config retrieval\n function loadApp(config) {\n console.log('loading app!');\n\n // Show current toggle state\n if (config.shuffle === true) {\n shuffleProblemsButtonEl.classList.add('active');\n previousProblemButtonEl.parentNode.classList.add('hidden');\n }\n\n // Keybinding stuff\n // ============================================================\n\n // Debounced code validation\n const debouncedInputValidation = debounce(e => {\n // If not arrow keys or other non-character keys\n if (ignoreKeyCodes.indexOf(e.keyCode) === -1) {\n // Run test suite\n testSuite();\n }\n }, 200);\n\n function problemNav(e) {\n // Go to previous problem keybinding\n // If CMD/CTRL + SHIFT + RETURN/ENTER\n if (config.shuffle === false && e.keyCode === 13 && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem\n previousProblem();\n } else if (e.keyCode === 13 && !e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem keybinding\n // If CMD/CTRL + RETURN/ENTER\n // Go to next problem\n nextProblem();\n }\n }\n\n // Event Bindings\n // ============================================================\n\n // Bind it up\n codeEl.addEventListener('keydown', debouncedInputValidation);\n document.addEventListener('keydown', problemNav);\n shuffleProblemsButtonEl.addEventListener('click', toggleShuffle);\n previousProblemButtonEl.addEventListener('click', previousProblem);\n nextProblemButtonEl.addEventListener('click', nextProblem);\n\n // Start it up!\n // Load current problem\n const currProb = getCurrentProblem(problems);\n loadProblem(currProb);\n // Initalized test suite with starting failures\n testSuite(true);\n }\n})(document, window);\n","const assert = require('chai').assert;\n\nmodule.exports = [\n {\n name: 'Create Array',\n time: 10,\n prompt: 'Create and return an array that contains \\'apple\\' and \\'banana\\'',\n given: `const fruits = [];\\rreturn fruits;`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['apple', 'banana']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[0];`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'apple') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'orange') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[1];`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'banana') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.forEach()',\n time: 20,\n prompt: 'Loop over the array, add an \\'x\\' to the end of each name, push each fruit into a new array, then return the new array.',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['applex', 'bananax']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.push()',\n time: 10,\n prompt: `Add 'orange' to the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 3 items',\n test(output) {\n return assert.lengthOf(output, 3) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.pop()',\n time: 10,\n prompt: `Remove 'orange' from the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['apple', 'banana']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.shift()',\n time: 10,\n prompt: `Remove 'apple' from the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test(output) {\n return assert.deepEqual(output, ['banana', 'orange']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.unshift()',\n time: 10,\n prompt: `Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined\n );\n }\n },\n {\n name: 'Must return an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.indexOf()',\n time: 10,\n prompt: `Return the index of 'banana' in the Array.`,\n given: `const fruits = ['strawberry', 'banana', 'mango'];\\r`,\n answer: `const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 1) === undefined;\n }\n },\n {\n name: 'Returns a Number',\n test(output) {\n return assert.isNumber(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.concat()',\n time: 10,\n prompt: `Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,\n given: `const fruits = ['strawberry', 'banana'];\\rconst otherFruits = ['pear','peach'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\\r`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.join()',\n time: 10,\n prompt: `Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.`,\n given: `const fruits = ['strawberry', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\\r`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 'strawberry-banana') === undefined;\n }\n },\n {\n name: 'Returns a String',\n test(output) {\n return assert.isString(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.slice()',\n time: 20,\n prompt: `Return just the citrus fruits from the 'fruits' array using 'Array.slice()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, ['orange', 'lemon']) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 2 items',\n test(output) {\n return assert.lengthOf(output, 2) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.reverse()',\n time: 10,\n prompt: `Reverse the order of the 'fruit' array using 'Array.reverse()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined\n );\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n },\n {\n name: `First item is 'banana'`,\n test(output) {\n return assert.deepEqual(output[0], 'banana') === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.sort()',\n time: 10,\n prompt: `Sort the order of the 'fruit' array using 'Array.sort()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return (\n assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined\n );\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 4 items',\n test(output) {\n return assert.lengthOf(output, 4) === undefined;\n }\n },\n {\n name: `First item is 'banana'`,\n test(output) {\n return assert.deepEqual(output[0], 'banana') === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: `Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'`,\n given: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\\r`,\n answer: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, 3) === undefined;\n }\n },\n {\n name: 'Returns a Number',\n test(output) {\n return assert.isNumber(output) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.filter()',\n time: 10,\n prompt: `Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'`,\n given: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\\r`,\n answer: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, [8, 13, 21]) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 3 items',\n test(output) {\n return assert.lengthOf(output, 3) === undefined;\n }\n },\n {\n name: `First item is 8`,\n test(output) {\n return assert.deepEqual(output[0], 8) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.map()',\n time: 10,\n prompt: `Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'`,\n given: `const numbers = [25, 121, 169];\\r`,\n answer: `const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, [5, 11, 13]) === undefined;\n }\n },\n {\n name: 'Returns an Array',\n test(output) {\n return assert.isArray(output) === undefined;\n }\n },\n {\n name: 'Array has 3 items',\n test(output) {\n return assert.lengthOf(output, 3) === undefined;\n }\n },\n {\n name: `First item is 5`,\n test(output) {\n return assert.deepEqual(output[0], 5) === undefined;\n }\n },\n {\n name: `Last item is 13`,\n test(output) {\n return assert.deepEqual(output[output.length - 1], 13) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.every()',\n time: 10,\n prompt: `Return object that returns whether each array contains all even numbers using Array.every().`,\n given: `\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};`,\n answer: `\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 5, 6, 8];\nfunction isEven(element) {\n return element % 2 === 0\n}\nreturn {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n};`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;\n }\n },\n {\n name: 'Returns an Object',\n test(output) {\n return assert.isObject(output) === undefined;\n }\n },\n {\n name: 'Object has 2 items',\n test(output) {\n return assert.lengthOf(Object.keys(output), 2) === undefined;\n }\n },\n {\n name: `First value is true`,\n test(output) {\n return assert.isTrue(output.evenNumbers) === undefined;\n }\n },\n {\n name: `Second value is false`,\n test(output) {\n return assert.isFalse(output.someOddNumbers) === undefined;\n }\n }\n ]\n },\n {\n name: 'Array.some()',\n time: 10,\n prompt: `Return object that returns whether each array contains some odd numbers using Array.some().`,\n given: `\nconst evenNumbers = [2, 4, 6, 8];\nconst someOddNumbers = [2, 4, 7, 8];\nfunction isOdd(element) {\n\n}\nreturn {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n};`,\n answer: `\nconst evenNumbers = [1, 3, 5, 7];\nconst someOddNumbers = [1, 3, 6, 7];\nfunction isOdd(element) {\n return element % 2 !== 0;\n}\nreturn {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n};`,\n tests: [\n {\n name: 'Correct output',\n test(output) {\n return assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;\n }\n },\n {\n name: 'Returns an Object',\n test(output) {\n return assert.isObject(output) === undefined;\n }\n },\n {\n name: 'Object has 2 items',\n test(output) {\n return assert.lengthOf(Object.keys(output), 2) === undefined;\n }\n },\n {\n name: `First value is false`,\n test(output) {\n return assert.isFalse(output.evenNumbers) === undefined;\n }\n },\n {\n name: `Second value is true`,\n test(output) {\n return assert.isTrue(output.someOddNumbers) === undefined;\n }\n }\n ]\n }\n // Next problems to create:\n // forEach? fix one above that tried, but can't verify forEach was used\n // some\n // reduce\n // reduceRight\n // Array.from and other ways to turn array-like into array\n];\n"]} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 8d926f7..6cb8a35 100644 --- a/public/index.html +++ b/public/index.html @@ -1,100 +1 @@ - - - - Practice JavaScript - - - - - - -
- - -

Practice JavaScript!

-
- -
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-

TEST ERRORS

-
-
-
-
- -
-

CODE OUTPUT

-
-
-
-
-
-
- - -
- -
- - - - - - - - - - - +Practice JavaScript

Practice JavaScript!

TEST ERRORS

CODE OUTPUT

\ No newline at end of file diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml new file mode 100644 index 0000000..6c34065 --- /dev/null +++ b/shrinkwrap.yaml @@ -0,0 +1,4207 @@ +dependencies: + autoprefixer@^6.7.7: 6.7.7 + ava@^0.18.2: 0.18.2 + babel-core@^6.24.0: 6.24.1 + babel-preset-env@^1.4.0: 1.4.0 + babel-preset-es2015@^6.24.1: 6.24.1 + babel-preset-es2017@^6.24.1: 6.24.1 + babel-preset-latest@^6.24.1: 6.24.1 + babelify@^7.3.0: 7.3.0 + browserify@^14.1.0: 14.3.0 + chai@^3.5.0: 3.5.0 + cssnano@^3.10.0: 3.10.0 + gulp-buffer@^0.0.2: 0.0.2 + gulp-htmlmin@^3.0.0: 3.0.0 + gulp-livereload@^3.8.1: 3.8.1 + gulp-postcss@^6.4.0: 6.4.0 + gulp-rev@^7.1.2: 7.1.2 + gulp-sass@^3.1.0: 3.1.0 + gulp-sourcemaps@^2.5.1: 2.6.0 + gulp-svgo@^1.0.3: 1.0.3 + gulp-uglify@^2.1.2: 2.1.2 + gulp-util@^3.0.8: 3.0.8 + gulp@^3.9.1: 3.9.1 + husky@^0.13.3: 0.13.3 + lint-staged@^3.4.0: 3.4.1 + localforage@^1.5.0: 1.5.0 + rollup-stream@^1.19.0: 1.19.0 + static-eval@^1.1.1: 1.1.1 + uglifyify@^3.0.4: 3.0.4 + vinyl-buffer@^1.0.0: 1.0.0 + vinyl-source-stream@^1.1.0: 1.1.0 + watchify@^3.9.0: 3.9.0 + xo@^0.18.1: 0.18.2 +packages: + /@ava/babel-preset-stage-4/1.0.0: + dependencies: + babel-plugin-check-es2015-constants: 6.22.0 + babel-plugin-syntax-trailing-function-commas: 6.22.0 + babel-plugin-transform-async-to-generator: 6.24.1 + babel-plugin-transform-es2015-destructuring: 6.23.0 + babel-plugin-transform-es2015-function-name: 6.24.1 + babel-plugin-transform-es2015-modules-commonjs: 6.24.1 + babel-plugin-transform-es2015-parameters: 6.24.1 + babel-plugin-transform-es2015-spread: 6.22.0 + babel-plugin-transform-es2015-sticky-regex: 6.24.1 + babel-plugin-transform-es2015-unicode-regex: 6.24.1 + babel-plugin-transform-exponentiation-operator: 6.24.1 + package-hash: 1.2.0 + resolution: a613b5e152f529305422546b072d47facfb26291 + /@ava/babel-preset-transform-test-files/2.0.1: + dependencies: + babel-plugin-ava-throws-helper: 1.0.0 + babel-plugin-espower: 2.3.2 + package-hash: 1.2.0 + resolution: d75232cc6d71dc9c7eae4b76a9004fd81501d0c1 + /@ava/pretty-format/1.1.0: + dependencies: + ansi-styles: 2.2.1 + esutils: 2.0.2 + resolution: d0a57d25eb9aeab9643bdd1a030642b91c123e28 + /@gulp-sourcemaps/identity-map/1.0.1: + dependencies: + acorn: 5.0.3 + css: 2.2.1 + normalize-path: 2.1.1 + source-map: 0.5.6 + through2: 2.0.3 + resolution: cfa23bc5840f9104ce32a65e74db7e7a974bbee1 + /@gulp-sourcemaps/map-sources/1.0.0: + dependencies: + normalize-path: 2.1.1 + through2: 2.0.3 + resolution: 890ae7c5d8c877f6d384860215ace9d7ec945bda + /JSONStream/1.3.1: + dependencies: + jsonparse: 1.3.0 + through: 2.3.8 + resolution: 707f761e01dae9e16f1bcf93703b78c70966579a + /abbrev/1.1.0: d0554c2256636e2f56e7c2e5ad183f859428d81f + /acorn-jsx/3.0.1: + dependencies: + acorn: 3.3.0 + resolution: afdf9488fb1ecefc8348f6fb22f464e32a58b36b + /acorn/1.2.2: c8ce27de0acc76d896d2b1fad3df588d9e82f014 + /acorn/3.3.0: 45e37fb39e8da3f25baee3ff5369e2bb5f22017a + /acorn/4.0.11: edcda3bd937e7556410d42ed5860f67399c794c0 + /acorn/5.0.3: c460df08491463f028ccb82eab3730bf01087b3d + /ajv-keywords/1.5.1: 314dd0a4b3368fad3dfcdc54ede6171b886daf3c + /ajv/4.11.8: + dependencies: + co: 4.6.0 + json-stable-stringify: 1.0.1 + resolution: 82ffb02b29e662ae53bdc20af15947706739c536 + /align-text/0.1.4: + dependencies: + kind-of: 3.2.0 + longest: 1.0.1 + repeat-string: 1.6.1 + resolution: 0cd90a561093f35d0a99256c22b7069433fad117 + /alphanum-sort/1.0.2: 97a1119649b211ad33691d9f9f486a8ec9fbe0a3 + /amdefine/1.0.1: 4a5282ac164729e93619bcfd3ad151f817ce91f5 + /ansi-align/1.1.0: + dependencies: + string-width: 1.0.2 + resolution: 2f0c1658829739add5ebb15e6b0c6e3423f016ba + /ansi-align/2.0.0: + dependencies: + string-width: 2.0.0 + resolution: c36aeccba563b89ceb556f3690f0b1d9e3547f7f + /ansi-escapes/1.4.0: d3a8a83b319aa67793662b13e761c7911422306e + /ansi-regex/0.2.1: 0d8e946967a3d8143f93e24e298525fc1b2235f9 + /ansi-regex/2.1.1: c3b33ab5ee360d86e0e628f0468ae7ef27d654df + /ansi-styles/1.0.0: cb102df1c56f5123eab8b67cd7b98027a0279178 + /ansi-styles/1.1.0: eaecbf66cd706882760b2f4691582b8f55d7a7de + /ansi-styles/2.2.1: b432dd3358b634cf75e1e4664368240533c1ddbe + /anymatch/1.3.0: + dependencies: + arrify: 1.0.1 + micromatch: 2.3.11 + resolution: a3e52fa39168c825ff57b0248126ce5a8ff95507 + /app-root-path/2.0.1: cd62dcf8e4fd5a417efc664d2e5b10653c651b46 + /aproba/1.1.1: 95d3600f07710aa0e9298c726ad5ecf2eacbabab + /archy/1.0.0: f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40 + /are-we-there-yet/1.1.4: + dependencies: + delegates: 1.0.0 + readable-stream: 2.2.9 + resolution: bb5dca382bb94f05e15194373d16fd3ba1ca110d + /argparse/1.0.9: + dependencies: + sprintf-js: 1.0.3 + resolution: 73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86 + /arr-diff/2.0.0: + dependencies: + arr-flatten: 1.0.3 + resolution: 8f3b827f955a8bd669697e4a4256ac3ceae356cf + /arr-exclude/1.0.0: dfc7c2e552a270723ccda04cf3128c8cbfe5c631 + /arr-flatten/1.0.3: a274ed85ac08849b6bd7847c4580745dc51adfb1 + /array-differ/1.0.0: eff52e3758249d33be402b8bb8e564bb2b5d4031 + /array-filter/0.0.1: 7da8cf2e26628ed732803581fd21f67cacd2eeec + /array-find-index/1.0.2: df010aa1287e164bbda6f9723b0a96a1ec4187a1 + /array-map/0.0.0: 88a2bab73d1cf7bcd5c1b118a003f66f665fa662 + /array-reduce/0.0.0: 173899d3ffd1c7d9383e4479525dbe278cab5f2b + /array-union/1.0.2: + dependencies: + array-uniq: 1.0.3 + resolution: 9a34410e4f4e3da23dea375be5be70f24778ec39 + /array-uniq/1.0.3: af6ac877a25cc7f74e058894753858dfdb24fdb6 + /array-unique/0.2.1: a1d97ccafcbc2625cc70fadceb36a50c58b01a53 + /arrify/1.0.1: 898508da2226f380df904728456849c1501a4b0d + /asn1.js/4.9.1: + dependencies: + bn.js: 4.11.6 + inherits: 2.0.3 + minimalistic-assert: 1.0.0 + resolution: 48ba240b45a9280e94748990ba597d216617fd40 + /asn1/0.2.3: dac8787713c9966849fc8180777ebe9c1ddf3b86 + /assert-plus/0.2.0: d74e1b87e7affc0db8aadb7021f3fe48101ab234 + /assert-plus/1.0.0: f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525 + /assert/1.4.1: + dependencies: + util: 0.10.3 + resolution: 99912d591836b5a6f5b345c0f07eefc08fc65d91 + /assertion-error/1.0.2: 13ca515d86206da0bac66e834dd397d87581094c + /ast-types/0.8.15: 8eef0827f04dff0ec8857ba925abe3fea6194e52 + /astw/2.2.0: + dependencies: + acorn: 4.0.11 + resolution: 7bd41784d32493987aeb239b6b4e1c57a873b917 + /async-each/1.0.1: 19d386a1d9edc6e7c1c85d388aedbcc56d33602d + /async-foreach/0.1.3: 36121f845c0578172de419a97dbeb1d16ec34542 + /asynckit/0.4.0: c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79 + /atob/1.1.3: 95f13629b12c3a51a5d215abdce2aa9f32f80773 + /auto-bind/1.1.0: 93b864dc7ee01a326281775d5c75ca0a751e5961 + /autoprefixer/6.7.7: + dependencies: + browserslist: 1.7.7 + caniuse-db: 1.0.30000665 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: 1dbd1c835658e35ce3f9984099db00585c782014 + /ava-init/0.2.0: + dependencies: + arr-exclude: 1.0.0 + execa: 0.5.1 + has-yarn: 1.0.0 + read-pkg-up: 2.0.0 + write-pkg: 2.1.0 + resolution: 9304c8b4c357d66e3dfdae1fbff47b1199d5c55d + /ava/0.18.2: + dependencies: + '@ava/babel-preset-stage-4': 1.0.0 + '@ava/babel-preset-transform-test-files': 2.0.1 + '@ava/pretty-format': 1.1.0 + arr-flatten: 1.0.3 + array-union: 1.0.2 + array-uniq: 1.0.3 + arrify: 1.0.1 + auto-bind: 1.1.0 + ava-init: 0.2.0 + babel-code-frame: 6.22.0 + babel-core: 6.24.1 + bluebird: 3.5.0 + caching-transform: 1.0.1 + chalk: 1.1.3 + chokidar: 1.6.1 + clean-stack: 1.1.1 + clean-yaml-object: 0.1.0 + cli-cursor: 2.1.0 + cli-spinners: 1.0.0 + cli-truncate: 0.2.1 + co-with-promise: 4.6.0 + code-excerpt: 2.1.0 + common-path-prefix: 1.0.0 + convert-source-map: 1.5.0 + core-assert: 0.2.1 + currently-unhandled: 0.4.1 + debug: 2.6.6 + diff: 3.2.0 + dot-prop: 4.1.1 + empower-core: 0.6.1 + equal-length: 1.0.1 + figures: 2.0.0 + find-cache-dir: 0.1.1 + fn-name: 2.0.1 + get-port: 2.1.0 + globby: 6.1.0 + has-flag: 2.0.0 + ignore-by-default: 1.0.1 + indent-string: 3.1.0 + is-ci: 1.0.10 + is-generator-fn: 1.0.0 + is-obj: 1.0.1 + is-observable: 0.2.0 + is-promise: 2.1.0 + jest-snapshot: 18.1.0 + last-line-stream: 1.0.0 + lodash.debounce: 4.0.8 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isequal: 4.5.0 + loud-rejection: 1.6.0 + matcher: 0.1.2 + max-timeout: 1.0.0 + md5-hex: 2.0.0 + meow: 3.7.0 + ms: 0.7.3 + multimatch: 2.1.0 + observable-to-promise: 0.4.0 + option-chain: 0.1.1 + package-hash: 1.2.0 + pkg-conf: 2.0.0 + plur: 2.1.2 + pretty-ms: 2.1.0 + require-precompiled: 0.1.0 + resolve-cwd: 1.0.0 + slash: 1.0.0 + source-map-support: 0.4.15 + stack-utils: 1.0.1 + strip-ansi: 3.0.1 + strip-bom-buf: 1.0.0 + time-require: 0.1.2 + unique-temp-dir: 1.0.0 + update-notifier: 1.0.3 + resolution: 79253d1636077034a2780bb55b5c3e6c3d7f312f + /aws-sign2/0.6.0: 14342dd38dbcc94d0e5b87d763cd63612c0e794f + /aws4/1.6.0: 83ef5ca860b2b32e4a0deedee8c771b9db57471e + /babel-code-frame/6.22.0: + dependencies: + chalk: 1.1.3 + esutils: 2.0.2 + js-tokens: 3.0.1 + resolution: 027620bee567a88c32561574e7fd0801d33118e4 + /babel-core/6.24.1: + dependencies: + babel-code-frame: 6.22.0 + babel-generator: 6.24.1 + babel-helpers: 6.24.1 + babel-messages: 6.23.0 + babel-register: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + babylon: 6.17.0 + convert-source-map: 1.5.0 + debug: 2.6.6 + json5: 0.5.1 + lodash: 4.17.4 + minimatch: 3.0.3 + path-is-absolute: 1.0.1 + private: 0.1.7 + slash: 1.0.0 + source-map: 0.5.6 + resolution: 8c428564dce1e1f41fb337ec34f4c3b022b5ad83 + /babel-generator/6.24.1: + dependencies: + babel-messages: 6.23.0 + babel-runtime: 6.23.0 + babel-types: 6.24.1 + detect-indent: 4.0.0 + jsesc: 1.3.0 + lodash: 4.17.4 + source-map: 0.5.6 + trim-right: 1.0.1 + resolution: e715f486c58ded25649d888944d52aa07c5d9497 + /babel-helper-builder-binary-assignment-operator-visitor/6.24.1: + dependencies: + babel-helper-explode-assignable-expression: 6.24.1 + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: cce4517ada356f4220bcae8a02c2b346f9a56664 + /babel-helper-call-delegate/6.24.1: + dependencies: + babel-helper-hoist-variables: 6.24.1 + babel-runtime: 6.23.0 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: ece6aacddc76e41c3461f88bfc575bd0daa2df8d + /babel-helper-define-map/6.24.1: + dependencies: + babel-helper-function-name: 6.24.1 + babel-runtime: 6.23.0 + babel-types: 6.24.1 + lodash: 4.17.4 + resolution: 7a9747f258d8947d32d515f6aa1c7bd02204a080 + /babel-helper-explode-assignable-expression/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: f25b82cf7dc10433c55f70592d5746400ac22caa + /babel-helper-function-name/6.24.1: + dependencies: + babel-helper-get-function-arity: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: d3475b8c03ed98242a25b48351ab18399d3580a9 + /babel-helper-get-function-arity/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: 8f7782aa93407c41d3aa50908f89b031b1b6853d + /babel-helper-hoist-variables/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: 1ecb27689c9d25513eadbc9914a73f5408be7a76 + /babel-helper-optimise-call-expression/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: f7a13427ba9f73f8f4fa993c54a97882d1244257 + /babel-helper-regex/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + lodash: 4.17.4 + resolution: d36e22fab1008d79d88648e32116868128456ce8 + /babel-helper-remap-async-to-generator/6.24.1: + dependencies: + babel-helper-function-name: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: 5ec581827ad723fecdd381f1c928390676e4551b + /babel-helper-replace-supers/6.24.1: + dependencies: + babel-helper-optimise-call-expression: 6.24.1 + babel-messages: 6.23.0 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a + /babel-helpers/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-template: 6.24.1 + resolution: 3471de9caec388e5c850e597e58a26ddf37602b2 + /babel-messages/6.23.0: + dependencies: + babel-runtime: 6.23.0 + resolution: f3cdf4703858035b2a2951c6ec5edf6c62f2630e + /babel-plugin-ava-throws-helper/1.0.0: + dependencies: + babel-template: 6.24.1 + babel-types: 6.24.1 + resolution: 8fe6e79d2fd19838b5c3649f89cfb03fd563e241 + /babel-plugin-check-es2015-constants/6.22.0: + dependencies: + babel-runtime: 6.23.0 + resolution: 35157b101426fd2ffd3da3f75c7d1e91835bbf8a + /babel-plugin-espower/2.3.2: + dependencies: + babel-generator: 6.24.1 + babylon: 6.17.0 + call-matcher: 1.0.1 + core-js: 2.4.1 + espower-location-detector: 1.0.0 + espurify: 1.7.0 + estraverse: 4.2.0 + resolution: 5516b8fcdb26c9f0e1d8160749f6e4c65e71271e + /babel-plugin-syntax-async-functions/6.13.0: cad9cad1191b5ad634bf30ae0872391e0647be95 + /babel-plugin-syntax-exponentiation-operator/6.13.0: 9ee7e8337290da95288201a6a57f4170317830de + /babel-plugin-syntax-trailing-function-commas/6.22.0: ba0360937f8d06e40180a43fe0d5616fff532cf3 + /babel-plugin-transform-async-to-generator/6.24.1: + dependencies: + babel-helper-remap-async-to-generator: 6.24.1 + babel-plugin-syntax-async-functions: 6.13.0 + babel-runtime: 6.23.0 + resolution: 6536e378aff6cb1d5517ac0e40eb3e9fc8d08761 + /babel-plugin-transform-es2015-arrow-functions/6.22.0: + dependencies: + babel-runtime: 6.23.0 + resolution: 452692cb711d5f79dc7f85e440ce41b9f244d221 + /babel-plugin-transform-es2015-block-scoped-functions/6.22.0: + dependencies: + babel-runtime: 6.23.0 + resolution: bbc51b49f964d70cb8d8e0b94e820246ce3a6141 + /babel-plugin-transform-es2015-block-scoping/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + lodash: 4.17.4 + resolution: 76c295dc3a4741b1665adfd3167215dcff32a576 + /babel-plugin-transform-es2015-classes/6.24.1: + dependencies: + babel-helper-define-map: 6.24.1 + babel-helper-function-name: 6.24.1 + babel-helper-optimise-call-expression: 6.24.1 + babel-helper-replace-supers: 6.24.1 + babel-messages: 6.23.0 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: 5a4c58a50c9c9461e564b4b2a3bfabc97a2584db + /babel-plugin-transform-es2015-computed-properties/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-template: 6.24.1 + resolution: 6fe2a8d16895d5634f4cd999b6d3480a308159b3 + /babel-plugin-transform-es2015-destructuring/6.23.0: + dependencies: + babel-runtime: 6.23.0 + resolution: 997bb1f1ab967f682d2b0876fe358d60e765c56d + /babel-plugin-transform-es2015-duplicate-keys/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: 73eb3d310ca969e3ef9ec91c53741a6f1576423e + /babel-plugin-transform-es2015-for-of/6.23.0: + dependencies: + babel-runtime: 6.23.0 + resolution: f47c95b2b613df1d3ecc2fdb7573623c75248691 + /babel-plugin-transform-es2015-function-name/6.24.1: + dependencies: + babel-helper-function-name: 6.24.1 + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: 834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b + /babel-plugin-transform-es2015-literals/6.22.0: + dependencies: + babel-runtime: 6.23.0 + resolution: 4f54a02d6cd66cf915280019a31d31925377ca2e + /babel-plugin-transform-es2015-modules-amd/6.24.1: + dependencies: + babel-plugin-transform-es2015-modules-commonjs: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + resolution: 3b3e54017239842d6d19c3011c4bd2f00a00d154 + /babel-plugin-transform-es2015-modules-commonjs/6.24.1: + dependencies: + babel-plugin-transform-strict-mode: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-types: 6.24.1 + resolution: d3e310b40ef664a36622200097c6d440298f2bfe + /babel-plugin-transform-es2015-modules-systemjs/6.24.1: + dependencies: + babel-helper-hoist-variables: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + resolution: ff89a142b9119a906195f5f106ecf305d9407d23 + /babel-plugin-transform-es2015-modules-umd/6.24.1: + dependencies: + babel-plugin-transform-es2015-modules-amd: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + resolution: ac997e6285cd18ed6176adb607d602344ad38468 + /babel-plugin-transform-es2015-object-super/6.24.1: + dependencies: + babel-helper-replace-supers: 6.24.1 + babel-runtime: 6.23.0 + resolution: 24cef69ae21cb83a7f8603dad021f572eb278f8d + /babel-plugin-transform-es2015-parameters/6.24.1: + dependencies: + babel-helper-call-delegate: 6.24.1 + babel-helper-get-function-arity: 6.24.1 + babel-runtime: 6.23.0 + babel-template: 6.24.1 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + resolution: 57ac351ab49caf14a97cd13b09f66fdf0a625f2b + /babel-plugin-transform-es2015-shorthand-properties/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: 24f875d6721c87661bbd99a4622e51f14de38aa0 + /babel-plugin-transform-es2015-spread/6.22.0: + dependencies: + babel-runtime: 6.23.0 + resolution: d6d68a99f89aedc4536c81a542e8dd9f1746f8d1 + /babel-plugin-transform-es2015-sticky-regex/6.24.1: + dependencies: + babel-helper-regex: 6.24.1 + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: 00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc + /babel-plugin-transform-es2015-template-literals/6.22.0: + dependencies: + babel-runtime: 6.23.0 + resolution: a84b3450f7e9f8f1f6839d6d687da84bb1236d8d + /babel-plugin-transform-es2015-typeof-symbol/6.23.0: + dependencies: + babel-runtime: 6.23.0 + resolution: dec09f1cddff94b52ac73d505c84df59dcceb372 + /babel-plugin-transform-es2015-unicode-regex/6.24.1: + dependencies: + babel-helper-regex: 6.24.1 + babel-runtime: 6.23.0 + regexpu-core: 2.0.0 + resolution: d38b12f42ea7323f729387f18a7c5ae1faeb35e9 + /babel-plugin-transform-exponentiation-operator/6.24.1: + dependencies: + babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 + babel-plugin-syntax-exponentiation-operator: 6.13.0 + babel-runtime: 6.23.0 + resolution: 2ab0c9c7f3098fa48907772bb813fe41e8de3a0e + /babel-plugin-transform-regenerator/6.24.1: + dependencies: + regenerator-transform: 0.9.11 + resolution: b8da305ad43c3c99b4848e4fe4037b770d23c418 + /babel-plugin-transform-strict-mode/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + resolution: d5faf7aa578a65bbe591cf5edae04a0c67020758 + /babel-preset-env/1.4.0: + dependencies: + babel-plugin-check-es2015-constants: 6.22.0 + babel-plugin-syntax-trailing-function-commas: 6.22.0 + babel-plugin-transform-async-to-generator: 6.24.1 + babel-plugin-transform-es2015-arrow-functions: 6.22.0 + babel-plugin-transform-es2015-block-scoped-functions: 6.22.0 + babel-plugin-transform-es2015-block-scoping: 6.24.1 + babel-plugin-transform-es2015-classes: 6.24.1 + babel-plugin-transform-es2015-computed-properties: 6.24.1 + babel-plugin-transform-es2015-destructuring: 6.23.0 + babel-plugin-transform-es2015-duplicate-keys: 6.24.1 + babel-plugin-transform-es2015-for-of: 6.23.0 + babel-plugin-transform-es2015-function-name: 6.24.1 + babel-plugin-transform-es2015-literals: 6.22.0 + babel-plugin-transform-es2015-modules-amd: 6.24.1 + babel-plugin-transform-es2015-modules-commonjs: 6.24.1 + babel-plugin-transform-es2015-modules-systemjs: 6.24.1 + babel-plugin-transform-es2015-modules-umd: 6.24.1 + babel-plugin-transform-es2015-object-super: 6.24.1 + babel-plugin-transform-es2015-parameters: 6.24.1 + babel-plugin-transform-es2015-shorthand-properties: 6.24.1 + babel-plugin-transform-es2015-spread: 6.22.0 + babel-plugin-transform-es2015-sticky-regex: 6.24.1 + babel-plugin-transform-es2015-template-literals: 6.22.0 + babel-plugin-transform-es2015-typeof-symbol: 6.23.0 + babel-plugin-transform-es2015-unicode-regex: 6.24.1 + babel-plugin-transform-exponentiation-operator: 6.24.1 + babel-plugin-transform-regenerator: 6.24.1 + browserslist: 1.7.7 + invariant: 2.2.2 + resolution: c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a + /babel-preset-es2015/6.24.1: + dependencies: + babel-plugin-check-es2015-constants: 6.22.0 + babel-plugin-transform-es2015-arrow-functions: 6.22.0 + babel-plugin-transform-es2015-block-scoped-functions: 6.22.0 + babel-plugin-transform-es2015-block-scoping: 6.24.1 + babel-plugin-transform-es2015-classes: 6.24.1 + babel-plugin-transform-es2015-computed-properties: 6.24.1 + babel-plugin-transform-es2015-destructuring: 6.23.0 + babel-plugin-transform-es2015-duplicate-keys: 6.24.1 + babel-plugin-transform-es2015-for-of: 6.23.0 + babel-plugin-transform-es2015-function-name: 6.24.1 + babel-plugin-transform-es2015-literals: 6.22.0 + babel-plugin-transform-es2015-modules-amd: 6.24.1 + babel-plugin-transform-es2015-modules-commonjs: 6.24.1 + babel-plugin-transform-es2015-modules-systemjs: 6.24.1 + babel-plugin-transform-es2015-modules-umd: 6.24.1 + babel-plugin-transform-es2015-object-super: 6.24.1 + babel-plugin-transform-es2015-parameters: 6.24.1 + babel-plugin-transform-es2015-shorthand-properties: 6.24.1 + babel-plugin-transform-es2015-spread: 6.22.0 + babel-plugin-transform-es2015-sticky-regex: 6.24.1 + babel-plugin-transform-es2015-template-literals: 6.22.0 + babel-plugin-transform-es2015-typeof-symbol: 6.23.0 + babel-plugin-transform-es2015-unicode-regex: 6.24.1 + babel-plugin-transform-regenerator: 6.24.1 + resolution: d44050d6bc2c9feea702aaf38d727a0210538939 + /babel-preset-es2016/6.24.1: + dependencies: + babel-plugin-transform-exponentiation-operator: 6.24.1 + resolution: f900bf93e2ebc0d276df9b8ab59724ebfd959f8b + /babel-preset-es2017/6.24.1: + dependencies: + babel-plugin-syntax-trailing-function-commas: 6.22.0 + babel-plugin-transform-async-to-generator: 6.24.1 + resolution: 597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1 + /babel-preset-latest/6.24.1: + dependencies: + babel-preset-es2015: 6.24.1 + babel-preset-es2016: 6.24.1 + babel-preset-es2017: 6.24.1 + resolution: 677de069154a7485c2d25c577c02f624b85b85e8 + /babel-register/6.24.1: + dependencies: + babel-core: 6.24.1 + babel-runtime: 6.23.0 + core-js: 2.4.1 + home-or-tmp: 2.0.0 + lodash: 4.17.4 + mkdirp: 0.5.1 + source-map-support: 0.4.15 + resolution: 7e10e13a2f71065bdfad5a1787ba45bca6ded75f + /babel-runtime/6.23.0: + dependencies: + core-js: 2.4.1 + regenerator-runtime: 0.10.5 + resolution: 0a9489f144de70efb3ce4300accdb329e2fc543b + /babel-template/6.24.1: + dependencies: + babel-runtime: 6.23.0 + babel-traverse: 6.24.1 + babel-types: 6.24.1 + babylon: 6.17.0 + lodash: 4.17.4 + resolution: 04ae514f1f93b3a2537f2a0f60a5a45fb8308333 + /babel-traverse/6.24.1: + dependencies: + babel-code-frame: 6.22.0 + babel-messages: 6.23.0 + babel-runtime: 6.23.0 + babel-types: 6.24.1 + babylon: 6.17.0 + debug: 2.6.6 + globals: 9.17.0 + invariant: 2.2.2 + lodash: 4.17.4 + resolution: ab36673fd356f9a0948659e7b338d5feadb31695 + /babel-types/6.24.1: + dependencies: + babel-runtime: 6.23.0 + esutils: 2.0.2 + lodash: 4.17.4 + to-fast-properties: 1.0.3 + resolution: a136879dc15b3606bda0d90c1fc74304c2ff0975 + /babelify/7.3.0: + dependencies: + babel-core: 6.24.1 + object-assign: 4.1.1 + resolution: aa56aede7067fd7bd549666ee16dc285087e88e5 + /babylon/6.17.0: 37da948878488b9c4e3c4038893fa3314b3fc932 + /balanced-match/0.4.2: cb3f3e3c732dc0f01ee70b403f302e61d7709838 + /base62/0.1.1: 7b4174c2f94449753b11c2651c083da841a7b084 + /base64-js/1.2.0: a39992d723584811982be5e290bb6a53d86700f1 + /bcrypt-pbkdf/1.0.1: + dependencies: + tweetnacl: 0.14.5 + resolution: 63bc5dcb61331b92bc05fd528953c33462a06f8d + /beeper/1.1.1: e6d5ea8c5dad001304a70b22638447f69cb2f809 + /binary-extensions/1.8.0: 48ec8d16df4377eae5fa5884682480af4d95c774 + /bl/0.9.5: + dependencies: + readable-stream: 1.0.34 + resolution: c06b797af085ea00bc527afc8efcf11de2232054 + /block-stream/0.0.9: + dependencies: + inherits: 2.0.3 + resolution: 13ebfe778a03205cfe03751481ebb4b3300c126a + /bluebird/3.5.0: 791420d7f551eea2897453a8a77653f96606d67c + /bn.js/4.11.6: 53344adb14617a13f6e8dd2ce28905d1c0ba3215 + /body-parser/1.14.2: + dependencies: + bytes: 2.2.0 + content-type: 1.0.2 + debug: 2.2.0 + depd: 1.1.0 + http-errors: 1.3.1 + iconv-lite: 0.4.13 + on-finished: 2.3.0 + qs: 5.2.0 + raw-body: 2.1.7 + type-is: 1.6.15 + resolution: 1015cb1fe2c443858259581db53332f8d0cf50f9 + /boom/2.10.1: + dependencies: + hoek: 2.16.3 + resolution: 39c8918ceff5799f83f9492a848f625add0c766f + /boxen/0.6.0: + dependencies: + ansi-align: 1.1.0 + camelcase: 2.1.1 + chalk: 1.1.3 + cli-boxes: 1.0.0 + filled-array: 1.1.0 + object-assign: 4.1.1 + repeating: 2.0.1 + string-width: 1.0.2 + widest-line: 1.0.0 + resolution: 8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6 + /boxen/1.1.0: + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 1.1.3 + cli-boxes: 1.0.0 + string-width: 2.0.0 + term-size: 0.1.1 + widest-line: 1.0.0 + resolution: b1b69dd522305e807a99deee777dbd6e5167b102 + /brace-expansion/1.1.7: + dependencies: + balanced-match: 0.4.2 + concat-map: 0.0.1 + resolution: 3effc3c50e000531fb720eaff80f0ae8ef23cf59 + /braces/1.8.5: + dependencies: + expand-range: 1.8.2 + preserve: 0.2.0 + repeat-element: 1.1.2 + resolution: ba77962e12dff969d6b76711e914b737857bf6a7 + /brorand/1.1.0: 12c25efe40a45e3c323eb8675a0a0ce57b22371f + /browser-pack/6.0.2: + dependencies: + JSONStream: 1.3.1 + combine-source-map: 0.7.2 + defined: 1.0.0 + through2: 2.0.3 + umd: 3.0.1 + resolution: f86cd6cef4f5300c8e63e07a4d512f65fbff4531 + /browser-resolve/1.11.2: + dependencies: + resolve: 1.1.7 + resolution: 8ff09b0a2c421718a1051c260b32e48f442938ce + /browserify-aes/1.0.6: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.3 + create-hash: 1.1.2 + evp_bytestokey: 1.0.0 + inherits: 2.0.3 + resolution: 5e7725dbdef1fd5930d4ebab48567ce451c48a0a + /browserify-cipher/1.0.0: + dependencies: + browserify-aes: 1.0.6 + browserify-des: 1.0.0 + evp_bytestokey: 1.0.0 + resolution: 9988244874bf5ed4e28da95666dcd66ac8fc363a + /browserify-des/1.0.0: + dependencies: + cipher-base: 1.0.3 + des.js: 1.0.0 + inherits: 2.0.3 + resolution: daa277717470922ed2fe18594118a175439721dd + /browserify-rsa/4.0.1: + dependencies: + bn.js: 4.11.6 + randombytes: 2.0.3 + resolution: 21e0abfaf6f2029cf2fafb133567a701d4135524 + /browserify-sign/4.0.4: + dependencies: + bn.js: 4.11.6 + browserify-rsa: 4.0.1 + create-hash: 1.1.2 + create-hmac: 1.1.4 + elliptic: 6.4.0 + inherits: 2.0.3 + parse-asn1: 5.1.0 + resolution: aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298 + /browserify-zlib/0.1.4: + dependencies: + pako: 0.2.9 + resolution: bb35f8a519f600e0fa6b8485241c979d0141fb2d + /browserify/14.3.0: + dependencies: + JSONStream: 1.3.1 + assert: 1.4.1 + browser-pack: 6.0.2 + browser-resolve: 1.11.2 + browserify-zlib: 0.1.4 + buffer: 5.0.6 + cached-path-relative: 1.0.1 + concat-stream: 1.5.2 + console-browserify: 1.1.0 + constants-browserify: 1.0.0 + crypto-browserify: 3.11.0 + defined: 1.0.0 + deps-sort: 2.0.0 + domain-browser: 1.1.7 + duplexer2: 0.1.4 + events: 1.1.1 + glob: 7.1.1 + has: 1.0.1 + htmlescape: 1.1.1 + https-browserify: 1.0.0 + inherits: 2.0.3 + insert-module-globals: 7.0.1 + labeled-stream-splicer: 2.0.0 + module-deps: 4.1.1 + os-browserify: 0.1.2 + parents: 1.0.1 + path-browserify: 0.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + read-only-stream: 2.0.0 + readable-stream: 2.2.9 + resolve: 1.3.3 + shasum: 1.0.2 + shell-quote: 1.6.1 + stream-browserify: 2.0.1 + stream-http: 2.7.0 + string_decoder: 0.10.31 + subarg: 1.0.0 + syntax-error: 1.3.0 + through2: 2.0.3 + timers-browserify: 1.4.2 + tty-browserify: 0.0.0 + url: 0.11.0 + util: 0.10.3 + vm-browserify: 0.0.4 + xtend: 4.0.1 + resolution: fd003a2386ac1aec127f097885a3cc6373b745c4 + /browserslist/1.7.7: + dependencies: + caniuse-db: 1.0.30000665 + electron-to-chromium: 1.3.9 + resolution: 0bd76704258be829b2398bb50e4b62d1a166b0b9 + /buf-compare/1.0.1: fef28da8b8113a0a0db4430b0b6467b69730b34a + /buffer-shims/1.0.0: 9978ce317388c649ad8793028c3477ef044a8b51 + /buffer-xor/1.0.3: 26e61ed1422fb70dd42e6e36729ed51d855fe8d9 + /buffer/5.0.6: + dependencies: + base64-js: 1.2.0 + ieee754: 1.1.8 + resolution: 2ea669f7eec0b6eda05b08f8b5ff661b28573588 + /bufferstreams/1.1.1: + dependencies: + readable-stream: 2.2.9 + resolution: 0161373060ac5988eff99058731114f6e195d51e + /builtin-modules/1.1.1: 270f076c5a72c02f5b65a47df94c5fe3a278892f + /builtin-status-codes/3.0.0: 85982878e21b98e1c66425e03d0174788f569ee8 + /bytes/2.2.0: fd35464a403f6f9117c2de3609ecff9cae000588 + /bytes/2.4.0: 7d97196f9d5baf7f6935e25985549edd2a6c2339 + /cached-path-relative/1.0.1: d09c4b52800aa4c078e2dd81a869aac90d2e54e7 + /caching-transform/1.0.1: + dependencies: + md5-hex: 1.3.0 + mkdirp: 0.5.1 + write-file-atomic: 1.3.4 + resolution: 6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1 + /call-matcher/1.0.1: + dependencies: + core-js: 2.4.1 + deep-equal: 1.0.1 + espurify: 1.7.0 + estraverse: 4.2.0 + resolution: 5134d077984f712a54dad3cbf62de28dce416ca8 + /call-signature/0.0.2: a84abc825a55ef4cb2b028bd74e205a65b9a4996 + /caller-path/0.1.0: + dependencies: + callsites: 0.2.0 + resolution: 94085ef63581ecd3daa92444a8fe94e82577751f + /callsites/0.2.0: afab96262910a7f33c19a5775825c69f34e350ca + /camel-case/3.0.0: + dependencies: + no-case: 2.3.1 + upper-case: 1.1.3 + resolution: ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73 + /camelcase-keys/2.1.0: + dependencies: + camelcase: 2.1.1 + map-obj: 1.0.1 + resolution: 308beeaffdf28119051efa1d932213c91b8f92e7 + /camelcase/1.2.1: 9bb5304d2e0b56698b2c758b08a3eaa9daa58a39 + /camelcase/2.1.1: 7c1d16d679a1bbe59ca02cacecfb011e201f5a1f + /camelcase/3.0.0: 32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a + /camelcase/4.1.0: d545635be1e33c542649c69173e5de6acfae34dd + /caniuse-api/1.6.1: + dependencies: + browserslist: 1.7.7 + caniuse-db: 1.0.30000665 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + resolution: b534e7c734c4f81ec5fbe8aca2ad24354b962c6c + /caniuse-db/1.0.30000665: e84f4277935f295f546f8533cb0b410a8415b972 + /capture-stack-trace/1.0.0: 4a6fa07399c26bba47f0b2496b4d0fb408c5550d + /caseless/0.12.0: 1b681c21ff84033c826543090689420d187151dc + /center-align/0.1.3: + dependencies: + align-text: 0.1.4 + lazy-cache: 1.0.4 + resolution: aa0d32629b6ee972200411cbd4461c907bc2b7ad + /chai/3.5.0: + dependencies: + assertion-error: 1.0.2 + deep-eql: 0.1.3 + type-detect: 1.0.0 + resolution: 4d02637b067fe958bdbfdd3a40ec56fef7373247 + /chalk/0.4.0: + dependencies: + ansi-styles: 1.0.0 + has-color: 0.1.7 + strip-ansi: 0.1.1 + resolution: 5199a3ddcd0c1efe23bc08c1b027b06176e0c64f + /chalk/0.5.1: + dependencies: + ansi-styles: 1.1.0 + escape-string-regexp: 1.0.5 + has-ansi: 0.1.0 + strip-ansi: 0.3.0 + supports-color: 0.2.0 + resolution: 663b3a648b68b55d04690d49167aa837858f2174 + /chalk/1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + resolution: a8115c55e4a702fe4d150abd3872822a7e09fc98 + /chokidar/1.6.1: + dependencies: + anymatch: 1.3.0 + async-each: 1.0.1 + fsevents: 1.1.1 + glob-parent: 2.0.0 + inherits: 2.0.3 + is-binary-path: 1.0.1 + is-glob: 2.0.1 + path-is-absolute: 1.0.1 + readdirp: 2.1.0 + resolution: 2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2 + /ci-info/1.0.0: dc5285f2b4e251821683681c381c3388f46ec534 + /cipher-base/1.0.3: + dependencies: + inherits: 2.0.3 + resolution: eeabf194419ce900da3018c207d212f2a6df0a07 + /circular-json/0.3.1: be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d + /clap/1.1.3: + dependencies: + chalk: 1.1.3 + resolution: b3bd36e93dd4cbfb395a3c26896352445265c05b + /clean-css/4.0.12: + dependencies: + source-map: 0.5.6 + resolution: a02e61707f1840bd3338f54dbc9acbda4e772fa3 + /clean-stack/1.1.1: a1b3711122df162df7c7cb9b3c0470f28cb58adb + /clean-yaml-object/0.1.0: 63fb110dc2ce1a84dc21f6d9334876d010ae8b68 + /cli-boxes/1.0.0: 4fa917c3e59c94a004cd61f8ee509da651687143 + /cli-cursor/1.0.2: + dependencies: + restore-cursor: 1.0.1 + resolution: 64da3f7d56a54412e59794bd62dc35295e8f2987 + /cli-cursor/2.1.0: + dependencies: + restore-cursor: 2.0.0 + resolution: b35dac376479facc3e94747d41d0d0f5238ffcb5 + /cli-spinners/0.1.2: bb764d88e185fb9e1e6a2a1f19772318f605e31c + /cli-spinners/1.0.0: ef987ed3d48391ac3dab9180b406a742180d6e6a + /cli-truncate/0.2.1: + dependencies: + slice-ansi: 0.0.4 + string-width: 1.0.2 + resolution: 9f15cfbb0705005369216c626ac7d05ab90dd574 + /cli-width/2.1.0: b234ca209b29ef66fc518d9b98d5847b00edf00a + /cliui/2.1.0: + dependencies: + center-align: 0.1.3 + right-align: 0.1.3 + wordwrap: 0.0.2 + resolution: 4b475760ff80264c762c3a1719032e91c7fea0d1 + /cliui/3.2.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + resolution: 120601537a916d29940f934da3b48d585a39213d + /clone-stats/0.0.1: b88f94a82cf38b8791d58046ea4029ad88ca99d1 + /clone/0.2.0: c6126a90ad4f72dbf5acdb243cc37724fe93fc1f + /clone/1.0.2: 260b7a99ebb1edfe247538175f783243cb19d149 + /co-with-promise/4.6.0: + dependencies: + pinkie-promise: 1.0.0 + resolution: 413e7db6f5893a60b942cf492c4bec93db415ab7 + /co/4.6.0: 6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184 + /coa/1.0.1: + dependencies: + q: 1.5.0 + resolution: 7f959346cfc8719e3f7233cd6852854a7c67d8a3 + /code-excerpt/2.1.0: + dependencies: + convert-to-spaces: 1.0.2 + resolution: 5dcc081e88f4a7e3b554e9e35d7ef232d47f8147 + /code-point-at/1.1.0: 0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77 + /color-convert/1.9.0: + dependencies: + color-name: 1.1.2 + resolution: 1accf97dd739b983bf994d56fec8f95853641b7a + /color-name/1.1.2: 5c8ab72b64bd2215d617ae9559ebb148475cf98d + /color-string/0.3.0: + dependencies: + color-name: 1.1.2 + resolution: 27d46fb67025c5c2fa25993bfbf579e47841b991 + /color/0.11.4: + dependencies: + clone: 1.0.2 + color-convert: 1.9.0 + color-string: 0.3.0 + resolution: 6d7b5c74fb65e841cd48792ad1ed5e07b904d764 + /colormin/1.1.2: + dependencies: + color: 0.11.4 + css-color-names: 0.0.4 + has: 1.0.1 + resolution: ea2f7420a72b96881a38aae59ec124a6f7298133 + /colors/1.1.2: 168a4701756b6a7f51a12ce0c97bfa28c084ed63 + /combine-source-map/0.7.2: + dependencies: + convert-source-map: 1.1.3 + inline-source-map: 0.6.2 + lodash.memoize: 3.0.4 + source-map: 0.5.6 + resolution: 0870312856b307a87cc4ac486f3a9a62aeccc09e + /combined-stream/1.0.5: + dependencies: + delayed-stream: 1.0.0 + resolution: 938370a57b4a51dea2c77c15d5c5fdf895164009 + /commander/2.9.0: + dependencies: + graceful-readlink: 1.0.1 + resolution: 9c99094176e12240cb22d6c5146098400fe0f7d4 + /common-path-prefix/1.0.0: cd52f6f0712e0baab97d6f9732874f22f47752c0 + /commondir/1.0.1: ddd800da0c66127393cca5950ea968a3aaf1253b + /concat-map/0.0.1: d8a96bd77fd68df7793a73036a3ba0d5405d477b + /concat-stream/1.5.2: + dependencies: + inherits: 2.0.3 + readable-stream: 2.0.6 + typedarray: 0.0.6 + resolution: 708978624d856af41a5a741defdd261da752c266 + /concat-stream/1.6.0: + dependencies: + inherits: 2.0.3 + readable-stream: 2.2.9 + typedarray: 0.0.6 + resolution: 0aac662fd52be78964d5532f694784e70110acf7 + /configstore/2.1.0: + dependencies: + dot-prop: 3.0.0 + graceful-fs: 4.1.11 + mkdirp: 0.5.1 + object-assign: 4.1.1 + os-tmpdir: 1.0.2 + osenv: 0.1.4 + uuid: 2.0.3 + write-file-atomic: 1.3.4 + xdg-basedir: 2.0.0 + resolution: 737a3a7036e9886102aa6099e47bb33ab1aba1a1 + /configstore/3.0.0: + dependencies: + dot-prop: 4.1.1 + graceful-fs: 4.1.11 + mkdirp: 0.5.1 + unique-string: 1.0.0 + write-file-atomic: 1.3.4 + xdg-basedir: 3.0.0 + resolution: e1b8669c1803ccc50b545e92f8e6e79aa80e0196 + /console-browserify/1.1.0: + dependencies: + date-now: 0.1.4 + resolution: f0241c45730a9fc6323b206dbf38edc741d0bb10 + /console-control-strings/1.1.0: 3d7cf4464db6446ea644bf4b39507f9851008e8e + /constants-browserify/1.0.0: c20b96d8c617748aaf1c16021760cd27fcb8cb75 + /contains-path/0.1.0: fe8cf184ff6670b6baef01a9d4861a5cbec4120a + /content-type/1.0.2: b7d113aee7a8dd27bd21133c4dc2529df1721eed + /convert-source-map/1.1.3: 4829c877e9fe49b3161f3bf3673888e204699860 + /convert-source-map/1.5.0: 9acd70851c6d5dfdd93d9282e5edf94a03ff46b5 + /convert-to-spaces/1.0.2: 7e3e48bbe6d997b1417ddca2868204b4d3d85715 + /core-assert/0.2.1: + dependencies: + buf-compare: 1.0.1 + is-error: 2.2.1 + resolution: f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f + /core-js/2.4.1: 4de911e667b0eae9124e34254b53aea6fc618d3e + /core-util-is/1.0.2: b5fd54220aa2bc5ab57aab7140c940754503c1a7 + /cosmiconfig/1.1.0: + dependencies: + graceful-fs: 4.1.11 + js-yaml: 3.8.3 + minimist: 1.2.0 + object-assign: 4.1.1 + os-homedir: 1.0.2 + parse-json: 2.2.0 + pinkie-promise: 2.0.1 + require-from-string: 1.2.1 + resolution: 0dea0f9804efdfb929fbb1b188e25553ea053d37 + /cosmiconfig/2.1.3: + dependencies: + is-directory: 0.3.1 + js-yaml: 3.8.3 + minimist: 1.2.0 + object-assign: 4.1.1 + os-homedir: 1.0.2 + parse-json: 2.2.0 + require-from-string: 1.2.1 + resolution: 952771eb0dddc1cb3fa2f6fbe51a522e93b3ee0a + /create-ecdh/4.0.0: + dependencies: + bn.js: 4.11.6 + elliptic: 6.4.0 + resolution: 888c723596cdf7612f6498233eebd7a35301737d + /create-error-class/3.0.2: + dependencies: + capture-stack-trace: 1.0.0 + resolution: 06be7abef947a3f14a30fd610671d401bca8b7b6 + /create-hash/1.1.2: + dependencies: + cipher-base: 1.0.3 + inherits: 2.0.3 + ripemd160: 1.0.1 + sha.js: 2.4.8 + resolution: 51210062d7bb7479f6c65bb41a92208b1d61abad + /create-hmac/1.1.4: + dependencies: + create-hash: 1.1.2 + inherits: 2.0.3 + resolution: d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170 + /cross-spawn-async/2.2.5: + dependencies: + lru-cache: 4.0.2 + which: 1.2.14 + resolution: 845ff0c0834a3ded9d160daca6d390906bb288cc + /cross-spawn/3.0.1: + dependencies: + lru-cache: 4.0.2 + which: 1.2.14 + resolution: 1256037ecb9f0c5f79e3d6ef135e30770184b982 + /cross-spawn/4.0.2: + dependencies: + lru-cache: 4.0.2 + which: 1.2.14 + resolution: 7b9247621c23adfdd3856004a823cbe397424d41 + /cross-spawn/5.1.0: + dependencies: + lru-cache: 4.0.2 + shebang-command: 1.2.0 + which: 1.2.14 + resolution: e8bd0efee58fcff6f8f94510a0a554bbfa235449 + /cryptiles/2.0.5: + dependencies: + boom: 2.10.1 + resolution: 3bdfecdc608147c1c67202fa291e7dca59eaa3b8 + /crypto-browserify/3.11.0: + dependencies: + browserify-cipher: 1.0.0 + browserify-sign: 4.0.4 + create-ecdh: 4.0.0 + create-hash: 1.1.2 + create-hmac: 1.1.4 + diffie-hellman: 5.0.2 + inherits: 2.0.3 + pbkdf2: 3.0.9 + public-encrypt: 4.0.0 + randombytes: 2.0.3 + resolution: 3652a0906ab9b2a7e0c3ce66a408e957a2485522 + /crypto-random-string/1.0.0: a230f64f568310e1498009940790ec99545bca7e + /css-color-names/0.0.4: 808adc2e79cf84738069b646cb20ec27beb629e0 + /css/2.2.1: + dependencies: + inherits: 2.0.3 + source-map: 0.1.43 + source-map-resolve: 0.3.1 + urix: 0.1.0 + resolution: 73a4c81de85db664d4ee674f7d47085e3b2d55dc + /cssnano/3.10.0: + dependencies: + autoprefixer: 6.7.7 + decamelize: 1.2.0 + defined: 1.0.0 + has: 1.0.1 + object-assign: 4.1.1 + postcss: 5.2.17 + postcss-calc: 5.3.1 + postcss-colormin: 2.2.2 + postcss-convert-values: 2.6.1 + postcss-discard-comments: 2.0.4 + postcss-discard-duplicates: 2.1.0 + postcss-discard-empty: 2.1.0 + postcss-discard-overridden: 0.1.1 + postcss-discard-unused: 2.2.3 + postcss-filter-plugins: 2.0.2 + postcss-merge-idents: 2.1.7 + postcss-merge-longhand: 2.0.2 + postcss-merge-rules: 2.1.2 + postcss-minify-font-values: 1.0.5 + postcss-minify-gradients: 1.0.5 + postcss-minify-params: 1.2.2 + postcss-minify-selectors: 2.1.1 + postcss-normalize-charset: 1.1.1 + postcss-normalize-url: 3.0.8 + postcss-ordered-values: 2.2.3 + postcss-reduce-idents: 2.4.0 + postcss-reduce-initial: 1.0.1 + postcss-reduce-transforms: 1.0.4 + postcss-svgo: 2.1.6 + postcss-unique-selectors: 2.0.2 + postcss-value-parser: 3.3.0 + postcss-zindex: 2.2.0 + resolution: 4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38 + /csso/2.0.0: + dependencies: + clap: 1.1.3 + source-map: 0.5.6 + resolution: 178b43a44621221c27756086f531e02f42900ee8 + /csso/2.3.2: + dependencies: + clap: 1.1.3 + source-map: 0.5.6 + resolution: ddd52c587033f49e94b71fc55569f252e8ff5f85 + /currently-unhandled/0.4.1: + dependencies: + array-find-index: 1.0.2 + resolution: 988df33feab191ef799a61369dd76c17adf957ea + /d/1.0.0: + dependencies: + es5-ext: 0.10.15 + resolution: 754bb5bfe55451da69a58b94d45f4c5b0462d58f + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + resolution: 853cfa0f7cbe2fed5de20326b8dd581035f6e2f0 + /date-fns/1.28.4: 7938aec34ba31fc8bd134d2344bc2e0bbfd95165 + /date-now/0.1.4: eaf439fd4d4848ad74e5cc7dbef200672b9e345b + /date-time/0.1.1: ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07 + /dateformat/2.0.0: 2743e3abb5c3fc2462e527dca445e04e9f4dee17 + /debug-fabulous/0.1.0: + dependencies: + debug: 2.6.6 + object-assign: 4.1.0 + resolution: ad0ea07a5d519324fb55842a8f34ee59c7f8ff6c + /debug/2.2.0: + dependencies: + ms: 0.7.1 + resolution: f87057e995b1a1f6ae6a4960664137bc56f039da + /debug/2.6.6: + dependencies: + ms: 0.7.3 + resolution: a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a + /decamelize/1.2.0: f6534d15148269b20352e7bee26f501f9a191290 + /deep-assign/1.0.0: + dependencies: + is-obj: 1.0.1 + resolution: b092743be8427dc621ea0067cdec7e70dd19f37b + /deep-eql/0.1.3: + dependencies: + type-detect: 0.1.1 + resolution: ef558acab8de25206cd713906d74e56930eb69f2 + /deep-equal/1.0.1: f5d260292b660e084eff4cdbc9f08ad3247448b5 + /deep-extend/0.4.1: efe4113d08085f4e6f9687759810f807469e2253 + /deep-is/0.1.3: b369d6fb5dbc13eecf524f91b070feedc357cf34 + /deep-strict-equal/0.2.0: + dependencies: + core-assert: 0.2.1 + resolution: 4a078147a8ab57f6a0d4f5547243cd22f44eb4e4 + /defaults/1.0.3: + dependencies: + clone: 1.0.2 + resolution: c656051e9817d9ff08ed881477f3fe4019f3ef7d + /defined/1.0.0: c98d9bcef75674188e110969151199e39b1fa693 + /del/2.2.2: + dependencies: + globby: 5.0.0 + is-path-cwd: 1.0.0 + is-path-in-cwd: 1.0.0 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + rimraf: 2.6.1 + resolution: c12c981d067846c84bcaf862cff930d907ffd1a8 + /delayed-stream/1.0.0: df3ae199acadfb7d440aaae0b29e2272b24ec619 + /delegates/1.0.0: 84c6e159b81904fdca59a0ef44cd870d31250f9a + /depd/1.1.0: e1bd82c6aab6ced965b97b88b17ed3e528ca18c3 + /deprecated/0.0.1: f9c9af5464afa1e7a971458a8bdef2aa94d5bb19 + /deps-sort/2.0.0: + dependencies: + JSONStream: 1.3.1 + shasum: 1.0.2 + subarg: 1.0.0 + through2: 2.0.3 + resolution: 091724902e84658260eb910748cccd1af6e21fb5 + /des.js/1.0.0: + dependencies: + inherits: 2.0.3 + minimalistic-assert: 1.0.0 + resolution: c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc + /detect-file/0.1.0: + dependencies: + fs-exists-sync: 0.1.0 + resolution: 4935dedfd9488648e006b0129566e9386711ea63 + /detect-indent/4.0.0: + dependencies: + repeating: 2.0.1 + resolution: f76d064352cdf43a1cb6ce619c4ee3a9475de208 + /detect-newline/2.1.0: f41f1c10be4b00e87b5f13da680759f2c5bfd3e2 + /detective/4.5.0: + dependencies: + acorn: 4.0.11 + defined: 1.0.0 + resolution: 6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1 + /diff/3.2.0: c9ce393a4b7cbd0b058a725c93df299027868ff9 + /diffie-hellman/5.0.2: + dependencies: + bn.js: 4.11.6 + miller-rabin: 4.0.0 + randombytes: 2.0.3 + resolution: b5835739270cfe26acf632099fded2a07f209e5e + /doctrine/1.5.0: + dependencies: + esutils: 2.0.2 + isarray: 1.0.0 + resolution: 379dce730f6166f76cefa4e6707a159b02c5a6fa + /doctrine/2.0.0: + dependencies: + esutils: 2.0.2 + isarray: 1.0.0 + resolution: c73d8d2909d22291e1a007a395804da8b665fe63 + /domain-browser/1.1.7: 867aa4b093faa05f1de08c06f4d7b21fdf8698bc + /dot-prop/3.0.0: + dependencies: + is-obj: 1.0.1 + resolution: 1b708af094a49c9a0e7dbcad790aba539dac1177 + /dot-prop/4.1.1: + dependencies: + is-obj: 1.0.1 + resolution: a8493f0b7b5eeec82525b5c7587fa7de7ca859c1 + /duplexer/0.1.1: ace6ff808c1ce66b57d1ebf97977acb02334cfc1 + /duplexer2/0.0.2: + dependencies: + readable-stream: 1.1.14 + resolution: c614dcf67e2fb14995a91711e5a617e8a60a31db + /duplexer2/0.1.4: + dependencies: + readable-stream: 2.2.9 + resolution: 8b12dab878c0d69e3e7891051662a32fc6bddcc1 + /duplexer3/0.1.4: ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2 + /ecc-jsbn/0.1.1: + dependencies: + jsbn: 0.1.1 + resolution: 0fc73a9ed5f0d53c38193398523ef7e543777505 + /ee-first/1.1.1: 590c61156b0ae2f4f0255732a158b266bc56b21d + /electron-to-chromium/1.3.9: db1cba2a26aebcca2f7f5b8b034554468609157d + /elegant-spinner/1.0.1: db043521c95d7e303fd8f345bedc3349cfb0729e + /elliptic/6.4.0: + dependencies: + bn.js: 4.11.6 + brorand: 1.1.0 + hash.js: 1.0.3 + hmac-drbg: 1.0.1 + inherits: 2.0.3 + minimalistic-assert: 1.0.0 + minimalistic-crypto-utils: 1.0.1 + resolution: cac9af8762c85836187003c8dfe193e5e2eae5df + /empower-core/0.6.1: + dependencies: + call-signature: 0.0.2 + core-js: 2.4.1 + resolution: 6c187f502fcef7554d57933396aac655483772b1 + /end-of-stream/0.1.5: + dependencies: + once: 1.3.3 + resolution: 8e177206c3c80837d85632e8b9359dfe8b2f6eaf + /enhance-visitors/1.0.0: + dependencies: + lodash: 4.17.4 + resolution: aa945d05da465672a1ebd38fee2ed3da8518e95a + /equal-length/1.0.1: 21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c + /error-ex/1.3.1: + dependencies: + is-arrayish: 0.2.1 + resolution: f855a86ce61adc4e8621c3cda21e7a7612c3a8dc + /es3ify/0.1.4: + dependencies: + esprima-fb: 3001.1.0-dev-harmony-fb + jstransform: 3.0.0 + through: 2.3.8 + resolution: ad9fa5df1ae34f3f31e1211b5818b2d51078dfd1 + /es5-ext/0.10.15: + dependencies: + es6-iterator: 2.0.1 + es6-symbol: 3.1.1 + resolution: c330a5934c1ee21284a7c081a86e5fd937c91ea6 + /es6-iterator/2.0.1: + dependencies: + d: 1.0.0 + es5-ext: 0.10.15 + es6-symbol: 3.1.1 + resolution: 8e319c9f0453bf575d374940a655920e59ca5512 + /es6-map/0.1.5: + dependencies: + d: 1.0.0 + es5-ext: 0.10.15 + es6-iterator: 2.0.1 + es6-set: 0.1.5 + es6-symbol: 3.1.1 + event-emitter: 0.3.5 + resolution: 9136e0503dcc06a301690f0bb14ff4e364e949f0 + /es6-set/0.1.5: + dependencies: + d: 1.0.0 + es5-ext: 0.10.15 + es6-iterator: 2.0.1 + es6-symbol: 3.1.1 + event-emitter: 0.3.5 + resolution: d2b3ec5d4d800ced818db538d28974db0a73ccb1 + /es6-symbol/3.1.1: + dependencies: + d: 1.0.0 + es5-ext: 0.10.15 + resolution: bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77 + /es6-weak-map/2.0.2: + dependencies: + d: 1.0.0 + es5-ext: 0.10.15 + es6-iterator: 2.0.1 + es6-symbol: 3.1.1 + resolution: 5e3ab32251ffd1538a1f8e5ffa1357772f92d96f + /escape-string-regexp/1.0.5: 1b61c0562190a8dff6ae3bb2cf0200ca130b86d4 + /escodegen/1.8.1: + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.2 + optionator: 0.8.2 + source-map: 0.2.0 + resolution: 5a5b53af4693110bebb0867aa3430dd3b70a1018 + /escope/3.6.0: + dependencies: + es6-map: 0.1.5 + es6-weak-map: 2.0.2 + esrecurse: 4.1.0 + estraverse: 4.2.0 + resolution: e01975e812781a163a6dadfdd80398dc64c889c3 + /eslint-config-xo/0.18.1: f3bc873b33b2c82513d881eacb2ee3428407ad33 + /eslint-formatter-pretty/1.1.0: + dependencies: + ansi-escapes: 1.4.0 + chalk: 1.1.3 + log-symbols: 1.0.2 + plur: 2.1.2 + string-width: 2.0.0 + resolution: ab4d06da02fed8c13ae9f0dc540a433ef7ed6f5e + /eslint-import-resolver-node/0.2.3: + dependencies: + debug: 2.6.6 + object-assign: 4.1.1 + resolve: 1.3.3 + resolution: 5add8106e8c928db2cba232bcd9efa846e3da16c + /eslint-module-utils/2.0.0: + dependencies: + debug: 2.2.0 + pkg-dir: 1.0.0 + resolution: a6f8c21d901358759cdc35dbac1982ae1ee58bce + /eslint-plugin-ava/4.2.0: + dependencies: + arrify: 1.0.1 + deep-strict-equal: 0.2.0 + enhance-visitors: 1.0.0 + espree: 3.4.3 + espurify: 1.7.0 + multimatch: 2.1.0 + pkg-up: 1.0.0 + req-all: 1.0.0 + resolution: 12e4664659c1fae7895fa3f346c313ceb8907c77 + /eslint-plugin-import/2.2.0: + dependencies: + builtin-modules: 1.1.1 + contains-path: 0.1.0 + debug: 2.6.6 + doctrine: 1.5.0 + eslint-import-resolver-node: 0.2.3 + eslint-module-utils: 2.0.0 + has: 1.0.1 + lodash.cond: 4.5.2 + minimatch: 3.0.3 + pkg-up: 1.0.0 + resolution: 72ba306fad305d67c4816348a4699a4229ac8b4e + /eslint-plugin-no-use-extend-native/0.3.12: + dependencies: + is-get-set-prop: 1.0.0 + is-js-type: 2.0.0 + is-obj-prop: 1.0.0 + is-proto-prop: 1.0.0 + resolution: 3ad9a00c2df23b5d7f7f6be91550985a4ab701ea + /eslint-plugin-promise/3.5.0: 78fbb6ffe047201627569e85a6c5373af2a68fca + /eslint-plugin-unicorn/2.1.1: + dependencies: + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.upperfirst: 4.3.1 + req-all: 1.0.0 + resolution: 3e9294366799b715e16a6df89159495b68930cb3 + /eslint/3.19.0: + dependencies: + babel-code-frame: 6.22.0 + chalk: 1.1.3 + concat-stream: 1.6.0 + debug: 2.6.6 + doctrine: 2.0.0 + escope: 3.6.0 + espree: 3.4.3 + esquery: 1.0.0 + estraverse: 4.2.0 + esutils: 2.0.2 + file-entry-cache: 2.0.0 + glob: 7.1.1 + globals: 9.17.0 + ignore: 3.3.0 + imurmurhash: 0.1.4 + inquirer: 0.12.0 + is-my-json-valid: 2.16.0 + is-resolvable: 1.0.0 + js-yaml: 3.8.3 + json-stable-stringify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.4 + mkdirp: 0.5.1 + natural-compare: 1.4.0 + optionator: 0.8.2 + path-is-inside: 1.0.2 + pluralize: 1.2.1 + progress: 1.1.8 + require-uncached: 1.0.3 + shelljs: 0.7.7 + strip-bom: 3.0.0 + strip-json-comments: 2.0.1 + table: 3.8.3 + text-table: 0.2.0 + user-home: 2.0.0 + resolution: c8fc6201c7f40dd08941b87c085767386a679acc + /esmangle-evaluator/1.0.1: 620d866ef4861b3311f75766d52a8572bb3c6336 + /espower-location-detector/1.0.0: + dependencies: + is-url: 1.2.2 + path-is-absolute: 1.0.1 + source-map: 0.5.6 + xtend: 4.0.1 + resolution: a17b7ecc59d30e179e2bef73fb4137704cb331b5 + /espree/3.4.3: + dependencies: + acorn: 5.0.3 + acorn-jsx: 3.0.1 + resolution: 2910b5ccd49ce893c2ffffaab4fd8b3a31b82374 + /esprima-fb/15001.1001.0-dev-harmony-fb: 43beb57ec26e8cf237d3dd8b33e42533577f2659 + /esprima-fb/3001.1.0-dev-harmony-fb: b77d37abcd38ea0b77426bb8bc2922ce6b426411 + /esprima/2.7.3: 96e3b70d5779f6ad49cd032673d1c312767ba581 + /esprima/3.1.3: fdca51cee6133895e3c88d535ce49dbff62a4633 + /espurify/1.7.0: + dependencies: + core-js: 2.4.1 + resolution: 1c5cf6cbccc32e6f639380bd4f991fab9ba9d226 + /esquery/1.0.0: + dependencies: + estraverse: 4.2.0 + resolution: cfba8b57d7fba93f17298a8a006a04cda13d80fa + /esrecurse/4.1.0: + dependencies: + estraverse: 4.1.1 + object-assign: 4.1.1 + resolution: 4713b6536adf7f2ac4f327d559e7756bff648220 + /estraverse/1.9.3: af67f2dc922582415950926091a4005d29c9bb44 + /estraverse/4.1.1: f6caca728933a850ef90661d0e17982ba47111a2 + /estraverse/4.2.0: 0dee3fed31fcd469618ce7342099fc1afa0bdb13 + /esutils/2.0.2: 0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b + /event-emitter/0.3.5: + dependencies: + d: 1.0.0 + es5-ext: 0.10.15 + resolution: df8c69eef1647923c7157b9ce83840610b02cc39 + /event-stream/3.3.4: + dependencies: + duplexer: 0.1.1 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + resolution: 4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571 + /events/1.1.1: 9ebdb7635ad099c70dcc4c2a1f5004288e8bd924 + /evp_bytestokey/1.0.0: + dependencies: + create-hash: 1.1.2 + resolution: 497b66ad9fef65cd7c08a6180824ba1476b66e53 + /execa/0.4.0: + dependencies: + cross-spawn-async: 2.2.5 + is-stream: 1.1.0 + npm-run-path: 1.0.0 + object-assign: 4.1.1 + path-key: 1.0.0 + strip-eof: 1.0.0 + resolution: 4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3 + /execa/0.5.1: + dependencies: + cross-spawn: 4.0.2 + get-stream: 2.3.1 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.2 + strip-eof: 1.0.0 + resolution: de3fb85cb8d6e91c85bcbceb164581785cb57b36 + /execa/0.6.3: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.2 + strip-eof: 1.0.0 + resolution: 57b69a594f081759c69e5370f0d17b9cb11658fe + /exit-hook/1.1.1: f05ca233b48c05d54fff07765df8507e95c02ff8 + /expand-brackets/0.1.5: + dependencies: + is-posix-bracket: 0.1.1 + resolution: df07284e342a807cd733ac5af72411e581d1177b + /expand-range/1.8.2: + dependencies: + fill-range: 2.2.3 + resolution: a299effd335fe2721ebae8e257ec79644fc85337 + /expand-tilde/1.2.2: + dependencies: + os-homedir: 1.0.2 + resolution: 0b81eba897e5a3d31d1c3d102f8f01441e559449 + /extend/1.3.0: d1516fb0ff5624d2ebf9123ea1dac5a1994004f8 + /extend/3.0.1: a755ea7bc1adfcc5a31ce7e762dbaadc5e636444 + /extglob/0.3.2: + dependencies: + is-extglob: 1.0.0 + resolution: 2e18ff3d2f49ab2765cec9023f011daa8d8349a1 + /extsprintf/1.0.2: e1080e0658e300b06294990cc70e1502235fd550 + /falafel/1.2.0: + dependencies: + acorn: 1.2.2 + foreach: 2.0.5 + isarray: 0.0.1 + object-keys: 1.0.11 + resolution: c18d24ef5091174a497f318cd24b026a25cddab4 + /fancy-log/1.3.0: + dependencies: + chalk: 1.1.3 + time-stamp: 1.0.1 + resolution: 45be17d02bb9917d60ccffd4995c999e6c8c9948 + /fast-levenshtein/2.0.6: 3d8a5c66883a16a30ca8643e851f19baa7797917 + /faye-websocket/0.7.3: + dependencies: + websocket-driver: 0.6.5 + resolution: cc4074c7f4a4dfd03af54dd65c354b135132ce11 + /figures/1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + resolution: cbe1e3affcf1cd44b80cadfed28dc793a9701d2e + /figures/2.0.0: + dependencies: + escape-string-regexp: 1.0.5 + resolution: 3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962 + /file-entry-cache/2.0.0: + dependencies: + flat-cache: 1.2.2 + object-assign: 4.1.1 + resolution: c392990c3e684783d838b8c84a45d8a048458361 + /filename-regex/2.0.1: c1c4b9bee3e09725ddb106b75c1e301fe2f18b26 + /fill-range/2.2.3: + dependencies: + is-number: 2.1.0 + isobject: 2.1.0 + randomatic: 1.1.6 + repeat-element: 1.1.2 + repeat-string: 1.6.1 + resolution: 50b77dfd7e469bc7492470963699fe7a8485a723 + /filled-array/1.1.0: c3c4f6c663b923459a9aa29912d2d031f1507f84 + /find-cache-dir/0.1.1: + dependencies: + commondir: 1.0.1 + mkdirp: 0.5.1 + pkg-dir: 1.0.0 + resolution: c8defae57c8a52a8a784f9e31c57c742e993a0b9 + /find-index/0.1.1: 675d358b2ca3892d795a1ab47232f8b6e2e0dde4 + /find-parent-dir/0.3.0: 33c44b429ab2b2f0646299c5f9f718f376ff8d54 + /find-up/1.1.2: + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + resolution: 6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f + /find-up/2.1.0: + dependencies: + locate-path: 2.0.0 + resolution: 45d1b7e506c717ddd482775a2b77920a3c0c57a7 + /findup-sync/0.4.3: + dependencies: + detect-file: 0.1.0 + is-glob: 2.0.1 + micromatch: 2.3.11 + resolve-dir: 0.1.1 + resolution: 40043929e7bc60adf0b7f4827c4c6e75a0deca12 + /fined/1.0.2: + dependencies: + expand-tilde: 1.2.2 + lodash.assignwith: 4.2.0 + lodash.isempty: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.pick: 4.4.0 + parse-filepath: 1.0.1 + resolution: 5b28424b760d7598960b7ef8480dff8ad3660e97 + /first-chunk-stream/1.0.0: 59bfb50cd905f60d7c394cd3d9acaab4e6ad934e + /flagged-respawn/0.3.2: ff191eddcd7088a675b2610fffc976be9b8074b5 + /flat-cache/1.2.2: + dependencies: + circular-json: 0.3.1 + del: 2.2.2 + graceful-fs: 4.1.11 + write: 0.2.1 + resolution: fa86714e72c21db88601761ecf2f555d1abc6b96 + /flatten/1.0.2: dae46a9d78fbe25292258cc1e780a41d95c03782 + /fn-name/2.0.1: 5214d7537a4d06a4a301c0cc262feb84188002e7 + /for-in/1.0.2: 81068d295a8142ec0ac726c6e2200c30fb6d5e80 + /for-own/0.1.5: + dependencies: + for-in: 1.0.2 + resolution: 5265c681a4f294dabbf17c9509b6763aa84510ce + /foreach/2.0.5: 0bee005018aeb260d0a3af3ae658dd0136ec1b99 + /forever-agent/0.6.1: fbc71f0c41adeb37f96c577ad1ed42d8fdacca91 + /form-data/2.1.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.5 + mime-types: 2.1.15 + resolution: 33c183acf193276ecaa98143a69e94bfee1750d1 + /from/0.1.7: 83c60afc58b9c56997007ed1a768b3ab303a44fe + /fs-exists-sync/0.1.0: 982d6893af918e72d08dec9e8673ff2b5a8d6add + /fs.realpath/1.0.0: 1504ad2523158caa40db4a2787cb01411994ea4f + /fsevents/1.1.1: + dependencies: + nan: 2.6.2 + resolution: f19fd28f43eeaf761680e519a203c4d0b3d31aff + /fstream/1.0.11: + dependencies: + graceful-fs: 4.1.11 + inherits: 2.0.3 + mkdirp: 0.5.1 + rimraf: 2.6.1 + resolution: 5c1fb1f117477114f0632a0eb4b71b3cb0fd3171 + /function-bind/1.1.0: 16176714c801798e4e8f2cf7f7529467bb4a5771 + /gauge/2.7.4: + dependencies: + aproba: 1.1.1 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.2 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.0 + resolution: 2c03405c7538c39d7eb37b317022e325fb018bf7 + /gaze/0.5.2: + dependencies: + globule: 0.1.0 + resolution: 40b709537d24d1d45767db5a908689dfe69ac44f + /gaze/1.1.2: + dependencies: + globule: 1.1.0 + resolution: 847224677adb8870d679257ed3388fdb61e40105 + /generate-function/2.0.0: 6858fe7c0969b7d4e9093337647ac79f60dfbe74 + /generate-object-property/1.2.0: + dependencies: + is-property: 1.0.2 + resolution: 9c0e1c40308ce804f4783618b937fa88f99d50d0 + /get-caller-file/1.0.2: f702e63127e7e231c160a80c1554acb70d5047e5 + /get-port/2.1.0: + dependencies: + pinkie-promise: 2.0.1 + resolution: 8783f9dcebd1eea495a334e1a6a251e78887ab1a + /get-set-props/0.1.0: 998475c178445686d0b32246da5df8dbcfbe8ea3 + /get-stdin/4.0.1: b968c6b0a04384324902e8bf1a5df32579a450fe + /get-stdin/5.0.1: 122e161591e21ff4c52530305693f20e6393a398 + /get-stream/2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + resolution: 5f38f93f346009666ee0150a054167f91bdd95de + /get-stream/3.0.0: 8e943d1358dc37555054ecbe2edb05aa174ede14 + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + resolution: 5eff8e3e684d569ae4cb2b1282604e8ba62149fa + /glob-base/0.3.0: + dependencies: + glob-parent: 2.0.0 + is-glob: 2.0.1 + resolution: dbb164f6221b1c0b1ccf82aea328b497df0ea3c4 + /glob-parent/2.0.0: + dependencies: + is-glob: 2.0.1 + resolution: 81383d72db054fcccf5336daa902f182f6edbb28 + /glob-stream/3.1.18: + dependencies: + glob: 4.5.3 + glob2base: 0.0.12 + minimatch: 2.0.10 + ordered-read-streams: 0.1.0 + through2: 0.6.5 + unique-stream: 1.0.0 + resolution: 9170a5f12b790306fdfe598f313f8f7954fd143b + /glob-watcher/0.0.6: + dependencies: + gaze: 0.5.2 + resolution: b95b4a8df74b39c83298b0c05c978b4d9a3b710b + /glob/3.1.21: + dependencies: + graceful-fs: 1.2.3 + inherits: 1.0.2 + minimatch: 0.2.14 + resolution: d29e0a055dea5138f4d07ed40e8982e83c2066cd + /glob/4.5.3: + dependencies: + inflight: 1.0.6 + inherits: 2.0.3 + minimatch: 2.0.10 + once: 1.4.0 + resolution: c6cb73d3226c1efef04de3c56d012f03377ee15f + /glob/7.1.1: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.3 + minimatch: 3.0.3 + once: 1.4.0 + path-is-absolute: 1.0.1 + resolution: 805211df04faaf1c63a3600306cdf5ade50b2ec8 + /glob2base/0.0.12: + dependencies: + find-index: 0.1.1 + resolution: 9d419b3e28f12e83a362164a277055922c9c0d56 + /global-modules/0.2.3: + dependencies: + global-prefix: 0.1.5 + is-windows: 0.2.0 + resolution: ea5a3bed42c6d6ce995a4f8a1269b5dae223828d + /global-prefix/0.1.5: + dependencies: + homedir-polyfill: 1.0.1 + ini: 1.3.4 + is-windows: 0.2.0 + which: 1.2.14 + resolution: 8d3bc6b8da3ca8112a160d8d496ff0462bfef78f + /globals/9.17.0: 0c0ca696d9b9bb694d2e5470bd37777caad50286 + /globby/5.0.0: + dependencies: + array-union: 1.0.2 + arrify: 1.0.1 + glob: 7.1.1 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + resolution: ebd84667ca0dbb330b99bcfc68eac2bc54370e0d + /globby/6.1.0: + dependencies: + array-union: 1.0.2 + glob: 7.1.1 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + resolution: f5a6d70e8395e21c858fb0489d64df02424d506c + /globule/0.1.0: + dependencies: + glob: 3.1.21 + lodash: 1.0.2 + minimatch: 0.2.14 + resolution: d9c8edde1da79d125a151b79533b978676346ae5 + /globule/1.1.0: + dependencies: + glob: 7.1.1 + lodash: 4.16.6 + minimatch: 3.0.3 + resolution: c49352e4dc183d85893ee825385eb994bb6df45f + /glogg/1.0.0: + dependencies: + sparkles: 1.0.0 + resolution: 7fe0f199f57ac906cf512feead8f90ee4a284fc5 + /got/5.7.1: + dependencies: + create-error-class: 3.0.2 + duplexer2: 0.1.4 + is-redirect: 1.0.0 + is-retry-allowed: 1.1.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.0 + node-status-codes: 1.0.0 + object-assign: 4.1.1 + parse-json: 2.2.0 + pinkie-promise: 2.0.1 + read-all-stream: 3.1.0 + readable-stream: 2.2.9 + timed-out: 3.1.3 + unzip-response: 1.0.2 + url-parse-lax: 1.0.0 + resolution: 5f81635a61e4a6589f180569ea4e381680a51f35 + /got/6.7.1: + dependencies: + create-error-class: 3.0.2 + duplexer3: 0.1.4 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.1.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.0 + safe-buffer: 5.0.1 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + resolution: 240cd05785a9a18e561dc1b44b41c763ef1e8db0 + /graceful-fs/1.2.3: 15a4806a57547cb2d2dbf27f42e89a8c3451b364 + /graceful-fs/3.0.11: + dependencies: + natives: 1.1.0 + resolution: 7613c778a1afea62f25c630a086d7f3acbbdd818 + /graceful-fs/4.1.11: 0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658 + /graceful-readlink/1.0.1: 4cafad76bc62f02fa039b2f94e9a3dd3a391a725 + /gulp-buffer/0.0.2: + dependencies: + through2: 0.4.2 + resolution: af81b4346101736b49942ec6c9fa867ffe737036 + /gulp-htmlmin/3.0.0: + dependencies: + bufferstreams: 1.1.1 + gulp-util: 3.0.8 + html-minifier: 3.4.3 + object-assign: 4.1.1 + readable-stream: 2.2.9 + tryit: 1.0.3 + resolution: 19ea8002d1231d6b1f18a12d20f2a66a77770fb3 + /gulp-livereload/3.8.1: + dependencies: + chalk: 0.5.1 + debug: 2.6.6 + event-stream: 3.3.4 + gulp-util: 3.0.8 + lodash.assign: 3.2.0 + mini-lr: 0.1.9 + resolution: 00f744b2d749d3e9e3746589c8a44acac779b50f + /gulp-postcss/6.4.0: + dependencies: + gulp-util: 3.0.8 + postcss: 5.2.17 + postcss-load-config: 1.2.0 + vinyl-sourcemaps-apply: 0.2.1 + resolution: 78a32e3c87aa6cdcec5ae1c905e196d478e8c5d5 + /gulp-rev/7.1.2: + dependencies: + gulp-util: 3.0.8 + modify-filename: 1.1.0 + object-assign: 4.1.1 + rev-hash: 1.0.0 + rev-path: 1.0.0 + sort-keys: 1.1.2 + through2: 2.0.3 + vinyl-file: 1.3.0 + resolution: 5e17cc229f6b45c74256f88ad3f2d3e9a3305829 + /gulp-sass/3.1.0: + dependencies: + gulp-util: 3.0.8 + lodash.clonedeep: 4.5.0 + node-sass: 4.5.2 + through2: 2.0.3 + vinyl-sourcemaps-apply: 0.2.1 + resolution: 53dc4b68a1f5ddfe4424ab4c247655269a8b74b7 + /gulp-sourcemaps/2.6.0: + dependencies: + '@gulp-sourcemaps/identity-map': 1.0.1 + '@gulp-sourcemaps/map-sources': 1.0.0 + acorn: 4.0.11 + convert-source-map: 1.5.0 + css: 2.2.1 + debug-fabulous: 0.1.0 + detect-newline: 2.1.0 + graceful-fs: 4.1.11 + source-map: 0.5.6 + strip-bom-string: 1.0.0 + through2: 2.0.3 + vinyl: 1.2.0 + resolution: 7ccce899a8a3bfca1593a3348d0fbf41dd3f51e5 + /gulp-svgo/1.0.3: + dependencies: + svgo: 0.6.6 + resolution: f6ad219f281cdc9ac3e0e6c173d5c77bba8cd692 + /gulp-uglify/2.1.2: + dependencies: + gulplog: 1.0.0 + has-gulplog: 0.1.0 + lodash: 4.17.4 + make-error-cause: 1.2.2 + through2: 2.0.3 + uglify-js: 2.8.22 + uglify-save-license: 0.4.1 + vinyl-sourcemaps-apply: 0.2.1 + resolution: 6db85b1d0ee63d18058592b658649d65c2ec4541 + /gulp-util/3.0.8: + dependencies: + array-differ: 1.0.0 + array-uniq: 1.0.3 + beeper: 1.1.1 + chalk: 1.1.3 + dateformat: 2.0.0 + fancy-log: 1.3.0 + gulplog: 1.0.0 + has-gulplog: 0.1.0 + lodash._reescape: 3.0.0 + lodash._reevaluate: 3.0.0 + lodash._reinterpolate: 3.0.0 + lodash.template: 3.6.2 + minimist: 1.2.0 + multipipe: 0.1.2 + object-assign: 3.0.0 + replace-ext: 0.0.1 + through2: 2.0.3 + vinyl: 0.5.3 + resolution: 0054e1e744502e27c04c187c3ecc505dd54bbb4f + /gulp/3.9.1: + dependencies: + archy: 1.0.0 + chalk: 1.1.3 + deprecated: 0.0.1 + gulp-util: 3.0.8 + interpret: 1.0.3 + liftoff: 2.3.0 + minimist: 1.2.0 + orchestrator: 0.3.8 + pretty-hrtime: 1.0.3 + semver: 4.3.6 + tildify: 1.2.0 + v8flags: 2.1.1 + vinyl-fs: 0.3.14 + resolution: 571ce45928dd40af6514fc4011866016c13845b4 + /gulplog/1.0.0: + dependencies: + glogg: 1.0.0 + resolution: e28c4d45d05ecbbed818363ce8f9c5926229ffe5 + /har-schema/1.0.5: d263135f43307c02c602afc8fe95970c0151369e + /har-validator/4.2.1: + dependencies: + ajv: 4.11.8 + har-schema: 1.0.5 + resolution: 33481d0f1bbff600dd203d75812a6a5fba002e2a + /has-ansi/0.1.0: + dependencies: + ansi-regex: 0.2.1 + resolution: 84f265aae8c0e6a88a12d7022894b7568894c62e + /has-ansi/2.0.0: + dependencies: + ansi-regex: 2.1.1 + resolution: 34f5049ce1ecdf2b0649af3ef24e45ed35416d91 + /has-color/0.1.7: 67144a5260c34fc3cca677d041daf52fe7b78b2f + /has-flag/1.0.0: 9d9e793165ce017a00f00418c43f942a7b1d11fa + /has-flag/2.0.0: e8207af1cc7b30d446cc70b734b5e8be18f88d51 + /has-gulplog/0.1.0: + dependencies: + sparkles: 1.0.0 + resolution: 6414c82913697da51590397dafb12f22967811ce + /has-unicode/2.0.1: e0e6fe6a28cf51138855e086d1691e771de2a8b9 + /has-yarn/1.0.0: 89e25db604b725c8f5976fff0addc921b828a5a7 + /has/1.0.1: + dependencies: + function-bind: 1.1.0 + resolution: 8461733f538b0837c9361e39a9ab9e9704dc2f28 + /hash.js/1.0.3: + dependencies: + inherits: 2.0.3 + resolution: 1332ff00156c0a0ffdd8236013d07b77a0451573 + /hawk/3.1.3: + dependencies: + boom: 2.10.1 + cryptiles: 2.0.5 + hoek: 2.16.3 + sntp: 1.0.9 + resolution: 078444bd7c1640b0fe540d2c9b73d59678e8e1c4 + /he/1.1.1: 93410fd21b009735151f8868c2f271f3427e23fd + /hmac-drbg/1.0.1: + dependencies: + hash.js: 1.0.3 + minimalistic-assert: 1.0.0 + minimalistic-crypto-utils: 1.0.1 + resolution: d2745701025a6c775a6c545793ed502fc0c649a1 + /hoek/2.16.3: 20bb7403d3cea398e91dc4710a8ff1b8274a25ed + /home-or-tmp/2.0.0: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + resolution: e36c3f2d2cae7d746a857e38d18d5f32a7882db8 + /homedir-polyfill/1.0.1: + dependencies: + parse-passwd: 1.0.0 + resolution: 4c2bbc8a758998feebf5ed68580f76d46768b4bc + /hosted-git-info/2.4.2: 0076b9f46a270506ddbaaea56496897460612a67 + /html-comment-regex/1.1.1: 668b93776eaae55ebde8f3ad464b307a4963625e + /html-minifier/3.4.3: + dependencies: + camel-case: 3.0.0 + clean-css: 4.0.12 + commander: 2.9.0 + he: 1.1.1 + ncname: 1.0.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 2.8.22 + resolution: eb3a7297c804611f470454eeebe0aacc427e424a + /htmlescape/1.1.1: 3a03edc2214bca3b66424a3e7959349509cb0351 + /http-errors/1.3.1: + dependencies: + inherits: 2.0.3 + statuses: 1.3.1 + resolution: 197e22cdebd4198585e8694ef6786197b91ed942 + /http-signature/1.1.1: + dependencies: + assert-plus: 0.2.0 + jsprim: 1.4.0 + sshpk: 1.13.0 + resolution: df72e267066cd0ac67fb76adf8e134a8fbcf91bf + /https-browserify/1.0.0: ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73 + /husky/0.13.3: + dependencies: + chalk: 1.1.3 + find-parent-dir: 0.3.0 + is-ci: 1.0.10 + normalize-path: 1.0.0 + resolution: bc2066080badc8b8fe3516e881f5bc68a57052ff + /iconv-lite/0.4.13: 1f88aba4ab0b1508e8312acc39345f36e992e2f2 + /ieee754/1.1.8: be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4 + /ignore-by-default/1.0.1: 48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09 + /ignore/3.3.0: 3812d22cbe9125f2c2b4915755a1b8abd745a001 + /immediate/3.0.6: 9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b + /imurmurhash/0.1.4: 9218b9b2b928a238b13dc4fb6b6d576f231453ea + /in-publish/2.0.0: e20ff5e3a2afc2690320b6dc552682a9c7fadf51 + /indent-string/2.1.0: + dependencies: + repeating: 2.0.1 + resolution: 8e2d48348742121b4a8218b7a137e9a52049dc80 + /indent-string/3.1.0: 08ff4334603388399b329e6b9538dc7a3cf5de7d + /indexes-of/1.0.1: f30f716c8e2bd346c7b67d3df3915566a7c05607 + /indexof/0.0.1: 82dc336d232b9062179d05ab3293a66059fd435d + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + resolution: 49bd6331d7d02d0c09bc910a1075ba8165b56df9 + /inherits/1.0.2: ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b + /inherits/2.0.1: b17d08d326b4423e568eff719f91b0b1cbdf69f1 + /inherits/2.0.3: 633c2c83e3da42a502f52466022480f4208261de + /ini/1.3.4: 0537cb79daf59b59a1a517dff706c86ec039162e + /inline-process-browser/1.0.0: + dependencies: + falafel: 1.2.0 + through2: 0.6.5 + resolution: 46a61b153dd3c9b1624b1a00626edb4f7f414f22 + /inline-source-map/0.6.2: + dependencies: + source-map: 0.5.6 + resolution: f9393471c18a79d1724f863fa38b586370ade2a5 + /inquirer/0.12.0: + dependencies: + ansi-escapes: 1.4.0 + ansi-regex: 2.1.1 + chalk: 1.1.3 + cli-cursor: 1.0.2 + cli-width: 2.1.0 + figures: 1.7.0 + lodash: 4.17.4 + readline2: 1.0.1 + run-async: 0.1.0 + rx-lite: 3.1.2 + string-width: 1.0.2 + strip-ansi: 3.0.1 + through: 2.3.8 + resolution: 1ef2bfd63504df0bc75785fff8c2c41df12f077e + /insert-module-globals/7.0.1: + dependencies: + JSONStream: 1.3.1 + combine-source-map: 0.7.2 + concat-stream: 1.5.2 + is-buffer: 1.1.5 + lexical-scope: 1.2.0 + process: 0.11.10 + through2: 2.0.3 + xtend: 4.0.1 + resolution: c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3 + /interpret/1.0.3: cbc35c62eeee73f19ab7b10a801511401afc0f90 + /invariant/2.2.2: + dependencies: + loose-envify: 1.3.1 + resolution: 9e1f56ac0acdb6bf303306f338be3b204ae60360 + /invert-kv/1.0.0: 104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6 + /irregular-plurals/1.2.0: 38f299834ba8c00c30be9c554e137269752ff3ac + /is-absolute-url/2.1.0: 50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6 + /is-absolute/0.2.6: + dependencies: + is-relative: 0.2.1 + is-windows: 0.2.0 + resolution: 20de69f3db942ef2d87b9c2da36f172235b1b5eb + /is-arrayish/0.2.1: 77c99840527aa8ecb1a8ba697b80645a7a926a9d + /is-binary-path/1.0.1: + dependencies: + binary-extensions: 1.8.0 + resolution: 75f16642b480f187a711c814161fd3a4a7655898 + /is-buffer/1.1.5: 1f3b26ef613b214b88cbca23cc6c01d87961eecc + /is-builtin-module/1.0.0: + dependencies: + builtin-modules: 1.1.1 + resolution: 540572d34f7ac3119f8f76c30cbc1b1e037affbe + /is-ci/1.0.10: + dependencies: + ci-info: 1.0.0 + resolution: f739336b2632365061a9d48270cd56ae3369318e + /is-directory/0.3.1: 61339b6f2475fc772fd9c9d83f5c8575dc154ae1 + /is-dotfile/1.0.2: 2c132383f39199f8edc268ca01b9b007d205cc4d + /is-equal-shallow/0.1.3: + dependencies: + is-primitive: 2.0.0 + resolution: 2238098fc221de0bcfa5d9eac4c45d638aa1c534 + /is-error/2.2.1: 684a96d84076577c98f4cdb40c6d26a5123bf19c + /is-extendable/0.1.1: 62b110e289a471418e3ec36a617d472e301dfc89 + /is-extglob/1.0.0: ac468177c4943405a092fc8f29760c6ffc6206c0 + /is-finite/1.0.2: + dependencies: + number-is-nan: 1.0.1 + resolution: cc6677695602be550ef11e8b4aa6305342b6d0aa + /is-fullwidth-code-point/1.0.0: + dependencies: + number-is-nan: 1.0.1 + resolution: ef9e31386f031a7f0d643af82fde50c457ef00cb + /is-fullwidth-code-point/2.0.0: a3b30a5c4f199183167aaab93beefae3ddfb654f + /is-generator-fn/1.0.0: 969d49e1bb3329f6bb7f09089be26578b2ddd46a + /is-get-set-prop/1.0.0: + dependencies: + get-set-props: 0.1.0 + lowercase-keys: 1.0.0 + resolution: 2731877e4d78a6a69edcce6bb9d68b0779e76312 + /is-glob/2.0.1: + dependencies: + is-extglob: 1.0.0 + resolution: d096f926a3ded5600f3fdfd91198cb0888c2d863 + /is-js-type/2.0.0: + dependencies: + js-types: 1.0.0 + resolution: 73617006d659b4eb4729bba747d28782df0f7e22 + /is-my-json-valid/2.16.0: + dependencies: + generate-function: 2.0.0 + generate-object-property: 1.2.0 + jsonpointer: 4.0.1 + xtend: 4.0.1 + resolution: f079dd9bfdae65ee2038aae8acbc86ab109e3693 + /is-npm/1.0.0: f2fb63a65e4905b406c86072765a1a4dc793b9f4 + /is-number/2.1.0: + dependencies: + kind-of: 3.2.0 + resolution: 01fcbbb393463a548f2f466cce16dece49db908f + /is-obj-prop/1.0.0: + dependencies: + lowercase-keys: 1.0.0 + obj-props: 1.1.0 + resolution: b34de79c450b8d7c73ab2cdf67dc875adb85f80e + /is-obj/1.0.1: 3e4729ac1f5fde025cd7d83a896dab9f4f67db0f + /is-observable/0.2.0: + dependencies: + symbol-observable: 0.2.4 + resolution: b361311d83c6e5d726cabf5e250b0237106f5ae2 + /is-path-cwd/1.0.0: d225ec23132e89edd38fda767472e62e65f1106d + /is-path-in-cwd/1.0.0: + dependencies: + is-path-inside: 1.0.0 + resolution: 6477582b8214d602346094567003be8a9eac04dc + /is-path-inside/1.0.0: + dependencies: + path-is-inside: 1.0.2 + resolution: fc06e5a1683fbda13de667aff717bbc10a48f37f + /is-plain-obj/1.1.0: 71a50c8429dfca773c92a390a4a03b39fcd51d3e + /is-posix-bracket/0.1.1: 3334dc79774368e92f016e6fbc0a88f5cd6e6bc4 + /is-primitive/2.0.0: 207bab91638499c07b2adf240a41a87210034575 + /is-promise/2.1.0: 79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa + /is-property/1.0.2: 57fe1c4e48474edd65b09911f26b1cd4095dda84 + /is-proto-prop/1.0.0: + dependencies: + lowercase-keys: 1.0.0 + proto-props: 0.2.1 + resolution: b3951f95c089924fb5d4fcda6542ab3e83e2b220 + /is-redirect/1.0.0: 1d03dded53bd8db0f30c26e4f95d36fc7c87dc24 + /is-relative/0.2.1: + dependencies: + is-unc-path: 0.1.2 + resolution: d27f4c7d516d175fb610db84bbeef23c3bc97aa5 + /is-resolvable/1.0.0: + dependencies: + tryit: 1.0.3 + resolution: 8df57c61ea2e3c501408d100fb013cf8d6e0cc62 + /is-retry-allowed/1.1.0: 11a060568b67339444033d0125a61a20d564fb34 + /is-stream/1.1.0: 12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44 + /is-svg/2.1.0: + dependencies: + html-comment-regex: 1.1.1 + resolution: cf61090da0d9efbcab8722deba6f032208dbb0e9 + /is-typedarray/1.0.0: e479c80858df0c1b11ddda6940f96011fcda4a9a + /is-unc-path/0.1.2: + dependencies: + unc-path-regex: 0.1.2 + resolution: 6ab053a72573c10250ff416a3814c35178af39b9 + /is-url/1.2.2: 498905a593bf47cc2d9e7f738372bbf7696c7f26 + /is-utf8/0.2.1: 4b0da1442104d1b336340e80797e865cf39f7d72 + /is-windows/0.2.0: de1aa6d63ea29dd248737b69f1ff8b8002d2108c + /isarray/0.0.1: 8a18acfca9a8f4177e09abfc6038939b05d1eedf + /isarray/1.0.0: bb935d48582cba168c06834957a54a3e07124f11 + /isexe/2.0.0: e8fbf374dc556ff8947a10dcb0572d633f2cfa10 + /isobject/2.1.0: + dependencies: + isarray: 1.0.0 + resolution: f065561096a3f1da2ef46272f815c840d87e0c89 + /isstream/0.1.2: 47e63f7af55afa6f92e1500e690eb8b8529c099a + /jest-diff/18.1.0: + dependencies: + chalk: 1.1.3 + diff: 3.2.0 + jest-matcher-utils: 18.1.0 + pretty-format: 18.1.0 + resolution: 4ff79e74dd988c139195b365dc65d87f606f4803 + /jest-file-exists/17.0.0: 7f63eb73a1c43a13f461be261768b45af2cdd169 + /jest-matcher-utils/18.1.0: + dependencies: + chalk: 1.1.3 + pretty-format: 18.1.0 + resolution: 1ac4651955ee2a60cef1e7fcc98cdfd773c0f932 + /jest-mock/18.0.0: 5c248846ea33fa558b526f5312ab4a6765e489b3 + /jest-snapshot/18.1.0: + dependencies: + jest-diff: 18.1.0 + jest-file-exists: 17.0.0 + jest-matcher-utils: 18.1.0 + jest-util: 18.1.0 + natural-compare: 1.4.0 + pretty-format: 18.1.0 + resolution: 55b96d2ee639c9bce76f87f2a3fd40b71c7a5916 + /jest-util/18.1.0: + dependencies: + chalk: 1.1.3 + diff: 3.2.0 + graceful-fs: 4.1.11 + jest-file-exists: 17.0.0 + jest-mock: 18.0.0 + mkdirp: 0.5.1 + resolution: 3a99c32114ab17f84be094382527006e6d4bfc6a + /jodid25519/1.0.2: + dependencies: + jsbn: 0.1.1 + resolution: 06d4912255093419477d425633606e0e90782967 + /js-base64/2.1.9: f0e80ae039a4bd654b5f281fc93f04a914a7fcce + /js-tokens/3.0.1: 08e9f132484a2c45a30907e9dc4d5567b7f114d7 + /js-types/1.0.0: d242e6494ed572ad3c92809fc8bed7f7687cbf03 + /js-yaml/3.6.1: + dependencies: + argparse: 1.0.9 + esprima: 2.7.3 + resolution: 6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30 + /js-yaml/3.7.0: + dependencies: + argparse: 1.0.9 + esprima: 2.7.3 + resolution: 5c967ddd837a9bfdca5f2de84253abe8a1c03b80 + /js-yaml/3.8.3: + dependencies: + argparse: 1.0.9 + esprima: 3.1.3 + resolution: 33a05ec481c850c8875929166fe1beb61c728766 + /jsbn/0.1.1: a5e654c2e5a2deb5f201d96cefbca80c0ef2f513 + /jsesc/0.5.0: e7dee66e35d6fc16f710fe91d5cf69f70f08911d + /jsesc/1.3.0: 46c3fec8c1892b12b0833db9bc7622176dbab34b + /json-schema/0.2.3: b480c892e59a2f05954ce727bd3f2a4e882f9e13 + /json-stable-stringify/0.0.1: + dependencies: + jsonify: 0.0.0 + resolution: 611c23e814db375527df851193db59dd2af27f45 + /json-stable-stringify/1.0.1: + dependencies: + jsonify: 0.0.0 + resolution: 9a759d39c5f2ff503fd5300646ed445f88c4f9af + /json-stringify-safe/5.0.1: 1296a2d58fd45f19a0f6ce01d65701e2c735b6eb + /json5/0.5.1: 1eade7acc012034ad84e2396767ead9fa5495821 + /jsonify/0.0.0: 2c74b6ee41d93ca51b7b5aaee8f503631d252a73 + /jsonparse/1.3.0: 85fc245b1d9259acc6941960b905adf64e7de0e8 + /jsonpointer/4.0.1: 4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9 + /jsprim/1.4.0: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.0.2 + json-schema: 0.2.3 + verror: 1.3.6 + resolution: a3b87e40298d8c380552d8cc7628a0bb95a22918 + /jstransform/3.0.0: + dependencies: + base62: 0.1.1 + esprima-fb: 3001.1.0-dev-harmony-fb + source-map: 0.1.31 + resolution: a2591ab6cee8d97bf3be830dbfa2313b87cd640b + /kind-of/3.2.0: + dependencies: + is-buffer: 1.1.5 + resolution: b58abe4d5c044ad33726a8c1525b48cf891bff07 + /labeled-stream-splicer/2.0.0: + dependencies: + inherits: 2.0.3 + isarray: 0.0.1 + stream-splicer: 2.0.0 + resolution: a52e1d138024c00b86b1c0c91f677918b8ae0a59 + /last-line-stream/1.0.0: + dependencies: + through2: 2.0.3 + resolution: d1b64d69f86ff24af2d04883a2ceee14520a5600 + /latest-version/2.0.0: + dependencies: + package-json: 2.4.0 + resolution: 56f8d6139620847b8017f8f1f4d78e211324168b + /latest-version/3.1.0: + dependencies: + package-json: 4.0.1 + resolution: a205383fea322b33b5ae3b18abee0dc2f356ee15 + /lazy-cache/1.0.4: a1d78fc3a50474cb80845d3b3b6e1da49a446e8e + /lazy-req/1.1.0: bdaebead30f8d824039ce0ce149d4daa07ba1fac + /lazy-req/2.0.0: c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4 + /lcid/1.0.0: + dependencies: + invert-kv: 1.0.0 + resolution: 308accafa0bc483a3867b4b6f2b9506251d1b835 + /levn/0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + resolution: 3b09924edf9f083c0490fdd4c0bc4421e04764ee + /lexical-scope/1.2.0: + dependencies: + astw: 2.2.0 + resolution: fcea5edc704a4b3a8796cdca419c3a0afaf22df4 + /lie/3.0.2: + dependencies: + es3ify: 0.1.4 + immediate: 3.0.6 + inline-process-browser: 1.0.0 + unreachable-branch-transform: 0.3.0 + resolution: ffda21d7bba26f377cad865d3649b2fc8ce39fea + /liftoff/2.3.0: + dependencies: + extend: 3.0.1 + findup-sync: 0.4.3 + fined: 1.0.2 + flagged-respawn: 0.3.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.mapvalues: 4.6.0 + rechoir: 0.6.2 + resolve: 1.3.3 + resolution: a98f2ff67183d8ba7cfaca10548bd7ff0550b385 + /lint-staged/3.4.1: + dependencies: + app-root-path: 2.0.1 + cosmiconfig: 1.1.0 + execa: 0.6.3 + listr: 0.12.0 + minimatch: 3.0.3 + npm-which: 3.0.1 + staged-git-files: 0.0.4 + resolution: 96cd1cf7a1ac92d81662643c37d1cca28b91b046 + /listr-silent-renderer/1.1.1: 924b5a3757153770bf1a8e3fbf74b8bbf3f9242e + /listr-update-renderer/0.2.0: + dependencies: + chalk: 1.1.3 + cli-truncate: 0.2.1 + elegant-spinner: 1.0.1 + figures: 1.7.0 + indent-string: 3.1.0 + log-symbols: 1.0.2 + log-update: 1.0.2 + strip-ansi: 3.0.1 + resolution: ca80e1779b4e70266807e8eed1ad6abe398550f9 + /listr-verbose-renderer/0.4.0: + dependencies: + chalk: 1.1.3 + cli-cursor: 1.0.2 + date-fns: 1.28.4 + figures: 1.7.0 + resolution: 44dc01bb0c34a03c572154d4d08cde9b1dc5620f + /listr/0.12.0: + dependencies: + chalk: 1.1.3 + cli-truncate: 0.2.1 + figures: 1.7.0 + indent-string: 2.1.0 + is-promise: 2.1.0 + is-stream: 1.1.0 + listr-silent-renderer: 1.1.1 + listr-update-renderer: 0.2.0 + listr-verbose-renderer: 0.4.0 + log-symbols: 1.0.2 + log-update: 1.0.2 + ora: 0.2.3 + p-map: 1.1.1 + rxjs: 5.3.1 + stream-to-observable: 0.1.0 + strip-ansi: 3.0.1 + resolution: 6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a + /livereload-js/2.2.2: 6c87257e648ab475bc24ea257457edcc1f8d0bc2 + /load-json-file/1.1.0: + dependencies: + graceful-fs: 4.1.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + resolution: 956905708d58b4bab4c2261b04f59f31c99374c0 + /load-json-file/2.0.0: + dependencies: + graceful-fs: 4.1.11 + parse-json: 2.2.0 + pify: 2.3.0 + strip-bom: 3.0.0 + resolution: 7947e42149af80d696cbf797bcaabcfe1fe29ca8 + /localforage/1.5.0: + dependencies: + lie: 3.0.2 + resolution: 6b994e19b56611fa85df3992df397ac4ab66e815 + /locate-path/2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + resolution: 2b568b265eec944c6d9c0de9c3dbbbca0354cd8e + /lodash._baseassign/3.2.0: + dependencies: + lodash._basecopy: 3.0.1 + lodash.keys: 3.1.2 + resolution: 8c38a099500f215ad09e59f1722fd0c52bfe0a4e + /lodash._basecopy/3.0.1: 8da0e6a876cf344c0ad8a54882111dd3c5c7ca36 + /lodash._basetostring/3.0.1: d1861d877f824a52f669832dcaf3ee15566a07d5 + /lodash._basevalues/3.0.0: 5b775762802bde3d3297503e26300820fdf661b7 + /lodash._bindcallback/3.0.1: e531c27644cf8b57a99e17ed95b35c748789392e + /lodash._createassigner/3.1.1: + dependencies: + lodash._bindcallback: 3.0.1 + lodash._isiterateecall: 3.0.9 + lodash.restparam: 3.6.1 + resolution: 838a5bae2fdaca63ac22dee8e19fa4e6d6970b11 + /lodash._getnative/3.9.1: 570bc7dede46d61cdcde687d65d3eecbaa3aaff5 + /lodash._isiterateecall/3.0.9: 5203ad7ba425fae842460e696db9cf3e6aac057c + /lodash._reescape/3.0.0: 2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a + /lodash._reevaluate/3.0.0: 58bc74c40664953ae0b124d806996daca431e2ed + /lodash._reinterpolate/3.0.0: 0ccf2d89166af03b3663c796538b75ac6e114d9d + /lodash._root/3.0.1: fba1c4524c19ee9a5f8136b4609f017cf4ded692 + /lodash.assign/3.2.0: + dependencies: + lodash._baseassign: 3.2.0 + lodash._createassigner: 3.1.1 + lodash.keys: 3.1.2 + resolution: 3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa + /lodash.assign/4.2.0: 0d99f3ccd7a6d261d19bdaeb9245005d285808e7 + /lodash.assignwith/4.2.0: 127a97f02adc41751a954d24b0de17e100e038eb + /lodash.camelcase/4.3.0: b28aa6288a2b9fc651035c7711f65ab6190331a6 + /lodash.clonedeep/4.5.0: e23f3f9c4f8fbdde872529c1071857a086e5ccef + /lodash.cond/4.5.2: f471a1da486be60f6ab955d17115523dd1d255d5 + /lodash.debounce/4.0.8: 82d79bff30a67c4005ffd5e2515300ad9ca4d7af + /lodash.difference/4.5.0: 9ccb4e505d486b91651345772885a2df27fd017c + /lodash.escape/3.2.0: + dependencies: + lodash._root: 3.0.1 + resolution: 995ee0dc18c1b48cc92effae71a10aab5b487698 + /lodash.flatten/4.4.0: f31c22225a9632d2bbf8e4addbef240aa765a61f + /lodash.isarguments/3.1.0: 2f573d85c6a24289ff00663b491c1d338ff3458a + /lodash.isarray/3.0.4: 79e4eb88c36a8122af86f844aa9bcd851b5fbb55 + /lodash.isempty/4.4.0: 6f86cbedd8be4ec987be9aaf33c9684db1b31e7e + /lodash.isequal/4.5.0: 415c4478f2bcc30120c22ce10ed3226f7d3e18e0 + /lodash.isplainobject/4.0.6: 7c526a52d89b45c45cc690b88163be0497f550cb + /lodash.isstring/4.0.1: d527dfb5456eca7cc9bb95d5daeaf88ba54a5451 + /lodash.kebabcase/4.1.1: 8489b1cb0d29ff88195cceca448ff6d6cc295c36 + /lodash.keys/3.1.2: + dependencies: + lodash._getnative: 3.9.1 + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + resolution: 4dbc0472b156be50a0b286855d1bd0b0c656098a + /lodash.mapvalues/4.6.0: 1bafa5005de9dd6f4f26668c30ca37230cc9689c + /lodash.memoize/3.0.4: 2dcbd2c287cbc0a55cc42328bd0c736150d53e3f + /lodash.memoize/4.1.2: bcc6c49a42a2840ed997f323eada5ecd182e0bfe + /lodash.mergewith/4.6.0: 150cf0a16791f5903b8891eab154609274bdea55 + /lodash.pick/4.4.0: 52f05610fff9ded422611441ed1fc123a03001b3 + /lodash.restparam/3.6.1: 936a4e309ef330a7645ed4145986c85ae5b20805 + /lodash.snakecase/4.1.1: 39d714a35357147837aefd64b5dcbb16becd8f8d + /lodash.template/3.6.2: + dependencies: + lodash._basecopy: 3.0.1 + lodash._basetostring: 3.0.1 + lodash._basevalues: 3.0.0 + lodash._isiterateecall: 3.0.9 + lodash._reinterpolate: 3.0.0 + lodash.escape: 3.2.0 + lodash.keys: 3.1.2 + lodash.restparam: 3.6.1 + lodash.templatesettings: 3.1.1 + resolution: f8cdecc6169a255be9098ae8b0c53d378931d14f + /lodash.templatesettings/3.1.1: + dependencies: + lodash._reinterpolate: 3.0.0 + lodash.escape: 3.2.0 + resolution: fb307844753b66b9f1afa54e262c745307dba8e5 + /lodash.uniq/4.5.0: d0225373aeb652adc1bc82e4945339a842754773 + /lodash.upperfirst/4.3.1: 1365edf431480481ef0d1c68957a5ed99d49f7ce + /lodash/1.0.2: 8f57560c83b59fc270bd3d561b690043430e2551 + /lodash/4.16.6: d22c9ac660288f3843e16ba7d2b5d06cca27d777 + /lodash/4.17.4: 78203a4d1c328ae1d86dca6460e369b57f4055ae + /log-symbols/1.0.2: + dependencies: + chalk: 1.1.3 + resolution: 376ff7b58ea3086a0f09facc74617eca501e1a18 + /log-update/1.0.2: + dependencies: + ansi-escapes: 1.4.0 + cli-cursor: 1.0.2 + resolution: 19929f64c4093d2d2e7075a1dad8af59c296b8d1 + /longest/1.0.1: 30a0b2da38f73770e8294a0d22e6625ed77d0097 + /loose-envify/1.3.1: + dependencies: + js-tokens: 3.0.1 + resolution: d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848 + /loud-rejection/1.6.0: + dependencies: + currently-unhandled: 0.4.1 + signal-exit: 3.0.2 + resolution: 5b46f80147edee578870f086d04821cf998e551f + /lower-case/1.1.4: 9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac + /lowercase-keys/1.0.0: 4e3366b39e7f5457e35f1324bdf6f88d0bfc7306 + /lru-cache/2.7.3: 6d4524e8b955f95d4f5b58851ce21dd72fb4e952 + /lru-cache/4.0.2: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + resolution: 1d17679c069cda5d040991a09dbc2c0db377e55e + /macaddress/0.2.8: 5904dc537c39ec6dbefeae902327135fa8511f12 + /make-error-cause/1.2.2: + dependencies: + make-error: 1.2.3 + resolution: df0388fcd0b37816dff0a5fb8108939777dcbc9d + /make-error/1.2.3: 6c4402df732e0977ac6faf754a5074b3d2b1d19d + /map-cache/0.2.2: c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf + /map-obj/1.0.1: d933ceb9205d82bdcf4886f6742bdc2b4dea146d + /map-stream/0.1.0: e56aa94c4c8055a16404a0674b78f215f7c8e194 + /matcher/0.1.2: + dependencies: + escape-string-regexp: 1.0.5 + resolution: ef20cbde64c24c50cc61af5b83ee0b1b8ff00101 + /math-expression-evaluator/1.2.17: de819fdbcd84dccd8fae59c6aeb79615b9d266ac + /max-timeout/1.0.0: b68f69a2f99e0b476fd4cb23e2059ca750715e1f + /md5-hex/1.3.0: + dependencies: + md5-o-matic: 0.1.1 + resolution: d2c4afe983c4370662179b8cad145219135046c4 + /md5-hex/2.0.0: + dependencies: + md5-o-matic: 0.1.1 + resolution: d0588e9f1c74954492ecd24ac0ac6ce997d92e33 + /md5-o-matic/0.1.1: 822bccd65e117c514fab176b25945d54100a03c3 + /media-typer/0.3.0: 8710d7af0aa626f8fffa1ce00168545263255748 + /meow/3.7.0: + dependencies: + camelcase-keys: 2.1.0 + decamelize: 1.2.0 + loud-rejection: 1.6.0 + map-obj: 1.0.1 + minimist: 1.2.0 + normalize-package-data: 2.3.8 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + redent: 1.0.0 + trim-newlines: 1.0.0 + resolution: 72cb668b425228290abbfa856892587308a801fb + /micromatch/2.3.11: + dependencies: + arr-diff: 2.0.0 + array-unique: 0.2.1 + braces: 1.8.5 + expand-brackets: 0.1.5 + extglob: 0.3.2 + filename-regex: 2.0.1 + is-extglob: 1.0.0 + is-glob: 2.0.1 + kind-of: 3.2.0 + normalize-path: 2.1.1 + object.omit: 2.0.1 + parse-glob: 3.0.4 + regex-cache: 0.4.3 + resolution: 86677c97d1720b363431d04d0d15293bd38c1565 + /miller-rabin/4.0.0: + dependencies: + bn.js: 4.11.6 + brorand: 1.1.0 + resolution: 4a62fb1d42933c05583982f4c716f6fb9e6c6d3d + /mime-db/1.27.0: 820f572296bbd20ec25ed55e5b5de869e5436eb1 + /mime-types/2.1.15: + dependencies: + mime-db: 1.27.0 + resolution: a4ebf5064094569237b8cf70046776d09fc92aed + /mimic-fn/1.1.0: e667783d92e89dbd342818b5230b9d62a672ad18 + /mini-lr/0.1.9: + dependencies: + body-parser: 1.14.2 + debug: 2.6.6 + faye-websocket: 0.7.3 + livereload-js: 2.2.2 + parseurl: 1.3.1 + qs: 2.2.5 + resolution: 02199d27347953d1fd1d6dbded4261f187b2d0f6 + /minimalistic-assert/1.0.0: 702be2dda6b37f4836bcb3f5db56641b64a1d3d3 + /minimalistic-crypto-utils/1.0.1: f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a + /minimatch/0.2.14: + dependencies: + lru-cache: 2.7.3 + sigmund: 1.0.1 + resolution: c74e780574f63c6f9a090e90efbe6ef53a6a756a + /minimatch/2.0.10: + dependencies: + brace-expansion: 1.1.7 + resolution: 8d087c39c6b38c001b97fca7ce6d0e1e80afbac7 + /minimatch/3.0.3: + dependencies: + brace-expansion: 1.1.7 + resolution: 2a4e4090b96b2db06a9d7df01055a62a77c9b774 + /minimist/0.0.8: 857fcabfc3397d2625b8228262e86aa7a011b05d + /minimist/1.2.0: a35008b20f41383eec1fb914f4cd5df79a264284 + /mkdirp/0.5.1: + dependencies: + minimist: 0.0.8 + resolution: 30057438eac6cf7f8c4767f38648d6697d75c903 + /modify-filename/1.1.0: 9a2dec83806fbb2d975f22beec859ca26b393aa1 + /module-deps/4.1.1: + dependencies: + JSONStream: 1.3.1 + browser-resolve: 1.11.2 + cached-path-relative: 1.0.1 + concat-stream: 1.5.2 + defined: 1.0.0 + detective: 4.5.0 + duplexer2: 0.1.4 + inherits: 2.0.3 + parents: 1.0.1 + readable-stream: 2.2.9 + resolve: 1.3.3 + stream-combiner2: 1.1.1 + subarg: 1.0.0 + through2: 2.0.3 + xtend: 4.0.1 + resolution: 23215833f1da13fd606ccb8087b44852dcb821fd + /ms/0.7.1: 9cd13c03adbff25b65effde7ce864ee952017098 + /ms/0.7.3: 708155a5e44e33f5fd0fc53e81d0d40a91be1fff + /multimatch/2.1.0: + dependencies: + array-differ: 1.0.0 + array-union: 1.0.2 + arrify: 1.0.1 + minimatch: 3.0.3 + resolution: 9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b + /multipipe/0.1.2: + dependencies: + duplexer2: 0.0.2 + resolution: 2a8f2ddf70eed564dff2d57f1e1a137d9f05078b + /mute-stream/0.0.5: 8fbfabb0a98a253d3184331f9e8deb7372fac6c0 + /nan/2.6.2: e4ff34e6c95fdfb5aecc08de6596f43605a7db45 + /natives/1.1.0: e9ff841418a6b2ec7a495e939984f78f163e6e31 + /natural-compare/1.4.0: 4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7 + /ncname/1.0.0: + dependencies: + xml-char-classes: 1.0.0 + resolution: 5b57ad18b1ca092864ef62b0b1ed8194f383b71c + /no-case/2.3.1: + dependencies: + lower-case: 1.1.4 + resolution: 7aeba1c73a52184265554b7dc03baf720df80081 + /node-gyp/3.6.1: + dependencies: + fstream: 1.0.11 + glob: 7.1.1 + graceful-fs: 4.1.11 + minimatch: 3.0.3 + mkdirp: 0.5.1 + nopt: 3.0.6 + npmlog: 4.1.0 + osenv: 0.1.4 + request: 2.81.0 + rimraf: 2.6.1 + semver: 5.3.0 + tar: 2.2.1 + which: 1.2.14 + resolution: 19561067ff185464aded478212681f47fd578cbc + /node-sass/4.5.2: + dependencies: + async-foreach: 0.1.3 + chalk: 1.1.3 + cross-spawn: 3.0.1 + gaze: 1.1.2 + get-stdin: 4.0.1 + glob: 7.1.1 + in-publish: 2.0.0 + lodash.assign: 4.2.0 + lodash.clonedeep: 4.5.0 + lodash.mergewith: 4.6.0 + meow: 3.7.0 + mkdirp: 0.5.1 + nan: 2.6.2 + node-gyp: 3.6.1 + npmlog: 4.1.0 + request: 2.81.0 + sass-graph: 2.2.2 + stdout-stream: 1.4.0 + resolution: 4012fa2bd129b1d6365117e88d9da0500d99da64 + /node-status-codes/1.0.0: 5ae5541d024645d32a58fcddc9ceecea7ae3ac2f + /nopt/3.0.6: + dependencies: + abbrev: 1.1.0 + resolution: c6465dbf08abcd4db359317f79ac68a646b28ff9 + /normalize-package-data/2.3.8: + dependencies: + hosted-git-info: 2.4.2 + is-builtin-module: 1.0.0 + semver: 5.3.0 + validate-npm-package-license: 3.0.1 + resolution: d819eda2a9dedbd1ffa563ea4071d936782295bb + /normalize-path/1.0.0: 32d0e472f91ff345701c15a8311018d3b0a90379 + /normalize-path/2.1.1: + dependencies: + remove-trailing-separator: 1.0.1 + resolution: 1ab28b556e198363a8c1a6f7e6fa20137fe6aed9 + /normalize-range/0.1.2: 2d10c06bdfd312ea9777695a4d28439456b75942 + /normalize-url/1.9.1: + dependencies: + object-assign: 4.1.1 + prepend-http: 1.0.4 + query-string: 4.3.4 + sort-keys: 1.1.2 + resolution: 2cc0d66b31ea23036458436e3620d85954c66c3c + /npm-path/2.0.3: + dependencies: + which: 1.2.14 + resolution: 15cff4e1c89a38da77f56f6055b24f975dfb2bbe + /npm-run-path/1.0.0: + dependencies: + path-key: 1.0.0 + resolution: f5c32bf595fe81ae927daec52e82f8b000ac3c8f + /npm-run-path/2.0.2: + dependencies: + path-key: 2.0.1 + resolution: 35a9232dfa35d7067b4cb2ddf2357b1871536c5f + /npm-which/3.0.1: + dependencies: + commander: 2.9.0 + npm-path: 2.0.3 + which: 1.2.14 + resolution: 9225f26ec3a285c209cae67c3b11a6b4ab7140aa + /npmlog/4.1.0: + dependencies: + are-we-there-yet: 1.1.4 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + resolution: dc59bee85f64f00ed424efb2af0783df25d1c0b5 + /num2fraction/1.2.2: 6f682b6a027a4e9ddfa4564cd2589d1d4e669ede + /number-is-nan/1.0.1: 097b602b53422a522c1afb8790318336941a011d + /oauth-sign/0.8.2: 46a6ab7f0aead8deae9ec0565780b7d4efeb9d43 + /obj-props/1.1.0: 626313faa442befd4a44e9a02c3cb6bde937b511 + /object-assign/3.0.0: 9bedd5ca0897949bca47e7ff408062d549f587f2 + /object-assign/4.1.0: 7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0 + /object-assign/4.1.1: 2109adc7965887cfc05cbbd442cac8bfbb360863 + /object-keys/0.4.0: 28a6aae7428dd2c3a92f3d95f21335dd204e0336 + /object-keys/1.0.11: c54601778ad560f1142ce0e01bcca8b56d13426d + /object.omit/2.0.1: + dependencies: + for-own: 0.1.5 + is-extendable: 0.1.1 + resolution: 1a9c744829f39dbb858c76ca3579ae2a54ebd1fa + /observable-to-promise/0.4.0: + dependencies: + is-observable: 0.2.0 + symbol-observable: 0.2.4 + resolution: 28afe71645308f2d41d71f47ad3fece1a377e52b + /on-finished/2.3.0: + dependencies: + ee-first: 1.1.1 + resolution: 20f1336481b083cd75337992a16971aa2d906947 + /once/1.3.3: + dependencies: + wrappy: 1.0.2 + resolution: b2e261557ce4c314ec8304f3fa82663e4297ca20 + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + resolution: 583b1aa775961d4b113ac17d9c50baef9dd76bd1 + /onetime/1.1.0: a1f7838f8314c516f05ecefcbc4ccfe04b4ed789 + /onetime/2.0.1: + dependencies: + mimic-fn: 1.1.0 + resolution: 067428230fd67443b2794b22bba528b6867962d4 + /option-chain/0.1.1: + dependencies: + object-assign: 4.1.1 + resolution: e9b811e006f1c0f54802f28295bfc8970f8dcfbd + /optionator/0.8.2: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + wordwrap: 1.0.0 + resolution: 364c5e409d3f4d6301d6c0b4c05bba50180aeb64 + /ora/0.2.3: + dependencies: + chalk: 1.1.3 + cli-cursor: 1.0.2 + cli-spinners: 0.1.2 + object-assign: 4.1.1 + resolution: 37527d220adcd53c39b73571d754156d5db657a4 + /orchestrator/0.3.8: + dependencies: + end-of-stream: 0.1.5 + sequencify: 0.0.7 + stream-consume: 0.1.0 + resolution: 14e7e9e2764f7315fbac184e506c7aa6df94ad7e + /ordered-read-streams/0.1.0: fd565a9af8eb4473ba69b6ed8a34352cb552f126 + /os-browserify/0.1.2: 49ca0293e0b19590a5f5de10c7f265a617d8fe54 + /os-homedir/1.0.2: ffbc4988336e0e833de0c168c7ef152121aa7fb3 + /os-locale/1.4.0: + dependencies: + lcid: 1.0.0 + resolution: 20f9f17ae29ed345e8bde583b13d2009803c14d9 + /os-tmpdir/1.0.2: bbe67406c79aa85c5cfec766fe5734555dfa1274 + /osenv/0.1.4: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + resolution: 42fe6d5953df06c8064be6f176c3d05aaaa34644 + /outpipe/1.1.1: + dependencies: + shell-quote: 1.6.1 + resolution: 50cf8616365e87e031e29a5ec9339a3da4725fa2 + /p-finally/1.0.0: 3fbcfb15b899a44123b34b6dcc18b724336a2cae + /p-limit/1.1.0: b07ff2d9a5d88bec806035895a2bab66a27988bc + /p-locate/2.0.0: + dependencies: + p-limit: 1.1.0 + resolution: 20a0103b222a70c8fd39cc2e580680f3dde5ec43 + /p-map/1.1.1: 05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a + /package-hash/1.2.0: + dependencies: + md5-hex: 1.3.0 + resolution: 003e56cd57b736a6ed6114cc2b81542672770e44 + /package-json/2.4.0: + dependencies: + got: 5.7.1 + registry-auth-token: 3.3.1 + registry-url: 3.1.0 + semver: 5.3.0 + resolution: 0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb + /package-json/4.0.1: + dependencies: + got: 6.7.1 + registry-auth-token: 3.3.1 + registry-url: 3.1.0 + semver: 5.3.0 + resolution: 8869a0401253661c4c4ca3da6c2121ed555f5eed + /pako/0.2.9: f3f7522f4ef782348da8161bad9ecfd51bf83a75 + /param-case/2.1.1: + dependencies: + no-case: 2.3.1 + resolution: df94fd8cf6531ecf75e6bef9a0858fbc72be2247 + /parents/1.0.1: + dependencies: + path-platform: 0.11.15 + resolution: fedd4d2bf193a77745fe71e371d73c3307d9c751 + /parse-asn1/5.1.0: + dependencies: + asn1.js: 4.9.1 + browserify-aes: 1.0.6 + create-hash: 1.1.2 + evp_bytestokey: 1.0.0 + pbkdf2: 3.0.9 + resolution: 37c4f9b7ed3ab65c74817b5f2480937fbf97c712 + /parse-filepath/1.0.1: + dependencies: + is-absolute: 0.2.6 + map-cache: 0.2.2 + path-root: 0.1.1 + resolution: 159d6155d43904d16c10ef698911da1e91969b73 + /parse-glob/3.0.4: + dependencies: + glob-base: 0.3.0 + is-dotfile: 1.0.2 + is-extglob: 1.0.0 + is-glob: 2.0.1 + resolution: b2c376cfb11f35513badd173ef0bb6e3a388391c + /parse-json/2.2.0: + dependencies: + error-ex: 1.3.1 + resolution: f480f40434ef80741f8469099f8dea18f55a4dc9 + /parse-ms/0.1.2: dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e + /parse-ms/1.0.1: 56346d4749d78f23430ca0c713850aef91aa361d + /parse-passwd/1.0.0: 6d5b934a456993b23d37f40a382d6f1666a8e5c6 + /parseurl/1.3.1: c8ab8c9223ba34888aa64a297b28853bec18da56 + /path-browserify/0.0.0: a0b870729aae214005b7d5032ec2cbbb0fb4451a + /path-exists/2.1.0: + dependencies: + pinkie-promise: 2.0.1 + resolution: 0feb6c64f0fc518d9a754dd5efb62c7022761f4b + /path-exists/3.0.0: ce0ebeaa5f78cb18925ea7d810d7b59b010fd515 + /path-is-absolute/1.0.1: 174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f + /path-is-inside/1.0.2: 365417dede44430d1c11af61027facf074bdfc53 + /path-key/1.0.0: 5d53d578019646c0d68800db4e146e6bdc2ac7af + /path-key/2.0.1: 411cadb574c5a140d3a4b1910d40d80cc9f40b40 + /path-parse/1.0.5: 3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1 + /path-platform/0.11.15: e864217f74c36850f0852b78dc7bf7d4a5721bf2 + /path-root-regex/0.1.2: bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d + /path-root/0.1.1: + dependencies: + path-root-regex: 0.1.2 + resolution: 9a4a6814cac1c0cd73360a95f32083c8ea4745b7 + /path-type/1.1.0: + dependencies: + graceful-fs: 4.1.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + resolution: 59c44f7ee491da704da415da5a4070ba4f8fe441 + /path-type/2.0.0: + dependencies: + pify: 2.3.0 + resolution: f012ccb8415b7096fc2daa1054c3d72389594c73 + /pause-stream/0.0.11: + dependencies: + through: 2.3.8 + resolution: fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445 + /pbkdf2/3.0.9: + dependencies: + create-hmac: 1.1.4 + resolution: f2c4b25a600058b3c3773c086c37dbbee1ffe693 + /performance-now/0.2.0: 33ef30c5c77d4ea21c5a53869d91b56d8f2555e5 + /pify/2.3.0: ed141a6ac043a849ea588498e7dca8b15330e90c + /pinkie-promise/1.0.0: + dependencies: + pinkie: 1.0.0 + resolution: d1da67f5482563bb7cf57f286ae2822ecfbf3670 + /pinkie-promise/2.0.1: + dependencies: + pinkie: 2.0.4 + resolution: 2135d6dfa7a358c069ac9b178776288228450ffa + /pinkie/1.0.0: 5a47f28ba1015d0201bda7bf0f358e47bec8c7e4 + /pinkie/2.0.4: 72556b80cfa0d48a974e80e77248e80ed4f7f870 + /pkg-conf/2.0.0: + dependencies: + find-up: 2.1.0 + load-json-file: 2.0.0 + resolution: 071c87650403bccfb9c627f58751bfe47c067279 + /pkg-dir/1.0.0: + dependencies: + find-up: 1.1.2 + resolution: 7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4 + /pkg-up/1.0.0: + dependencies: + find-up: 1.1.2 + resolution: 3e08fb461525c4421624a33b9f7e6d0af5b05a26 + /plur/1.0.0: db85c6814f5e5e5a3b49efc28d604fec62975156 + /plur/2.1.2: + dependencies: + irregular-plurals: 1.2.0 + resolution: 7482452c1a0f508e3e344eaec312c91c29dc655a + /pluralize/1.2.1: d1a21483fd22bb41e58a12fa3421823140897c45 + /postcss-calc/5.3.1: + dependencies: + postcss: 5.2.17 + postcss-message-helpers: 2.0.0 + reduce-css-calc: 1.3.0 + resolution: 77bae7ca928ad85716e2fda42f261bf7c1d65b5e + /postcss-colormin/2.2.2: + dependencies: + colormin: 1.1.2 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: 6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b + /postcss-convert-values/2.6.1: + dependencies: + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d + /postcss-discard-comments/2.0.4: + dependencies: + postcss: 5.2.17 + resolution: befe89fafd5b3dace5ccce51b76b81514be00e3d + /postcss-discard-duplicates/2.1.0: + dependencies: + postcss: 5.2.17 + resolution: b9abf27b88ac188158a5eb12abcae20263b91932 + /postcss-discard-empty/2.1.0: + dependencies: + postcss: 5.2.17 + resolution: d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5 + /postcss-discard-overridden/0.1.1: + dependencies: + postcss: 5.2.17 + resolution: 8b1eaf554f686fb288cd874c55667b0aa3668d58 + /postcss-discard-unused/2.2.3: + dependencies: + postcss: 5.2.17 + uniqs: 2.0.0 + resolution: bce30b2cc591ffc634322b5fb3464b6d934f4433 + /postcss-filter-plugins/2.0.2: + dependencies: + postcss: 5.2.17 + uniqid: 4.1.1 + resolution: 6d85862534d735ac420e4a85806e1f5d4286d84c + /postcss-load-config/1.2.0: + dependencies: + cosmiconfig: 2.1.3 + object-assign: 4.1.1 + postcss-load-options: 1.2.0 + postcss-load-plugins: 2.3.0 + resolution: 539e9afc9ddc8620121ebf9d8c3673e0ce50d28a + /postcss-load-options/1.2.0: + dependencies: + cosmiconfig: 2.1.3 + object-assign: 4.1.1 + resolution: b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c + /postcss-load-plugins/2.3.0: + dependencies: + cosmiconfig: 2.1.3 + object-assign: 4.1.1 + resolution: 745768116599aca2f009fad426b00175049d8d92 + /postcss-merge-idents/2.1.7: + dependencies: + has: 1.0.1 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: 4c5530313c08e1d5b3bbf3d2bbc747e278eea270 + /postcss-merge-longhand/2.0.2: + dependencies: + postcss: 5.2.17 + resolution: 23d90cd127b0a77994915332739034a1a4f3d658 + /postcss-merge-rules/2.1.2: + dependencies: + browserslist: 1.7.7 + caniuse-api: 1.6.1 + postcss: 5.2.17 + postcss-selector-parser: 2.2.3 + vendors: 1.0.1 + resolution: d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721 + /postcss-message-helpers/2.0.0: a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e + /postcss-minify-font-values/1.0.5: + dependencies: + object-assign: 4.1.1 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: 4b58edb56641eba7c8474ab3526cafd7bbdecb69 + /postcss-minify-gradients/1.0.5: + dependencies: + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: 5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1 + /postcss-minify-params/1.2.2: + dependencies: + alphanum-sort: 1.0.2 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + uniqs: 2.0.0 + resolution: ad2ce071373b943b3d930a3fa59a358c28d6f1f3 + /postcss-minify-selectors/2.1.1: + dependencies: + alphanum-sort: 1.0.2 + has: 1.0.1 + postcss: 5.2.17 + postcss-selector-parser: 2.2.3 + resolution: b2c6a98c0072cf91b932d1a496508114311735bf + /postcss-normalize-charset/1.1.1: + dependencies: + postcss: 5.2.17 + resolution: ef9ee71212d7fe759c78ed162f61ed62b5cb93f1 + /postcss-normalize-url/3.0.8: + dependencies: + is-absolute-url: 2.1.0 + normalize-url: 1.9.1 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: 108f74b3f2fcdaf891a2ffa3ea4592279fc78222 + /postcss-ordered-values/2.2.3: + dependencies: + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: eec6c2a67b6c412a8db2042e77fe8da43f95c11d + /postcss-reduce-idents/2.4.0: + dependencies: + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: c2c6d20cc958284f6abfbe63f7609bf409059ad3 + /postcss-reduce-initial/1.0.1: + dependencies: + postcss: 5.2.17 + resolution: 68f80695f045d08263a879ad240df8dd64f644ea + /postcss-reduce-transforms/1.0.4: + dependencies: + has: 1.0.1 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + resolution: ff76f4d8212437b31c298a42d2e1444025771ae1 + /postcss-selector-parser/2.2.3: + dependencies: + flatten: 1.0.2 + indexes-of: 1.0.1 + uniq: 1.0.1 + resolution: f9437788606c3c9acee16ffe8d8b16297f27bb90 + /postcss-svgo/2.1.6: + dependencies: + is-svg: 2.1.0 + postcss: 5.2.17 + postcss-value-parser: 3.3.0 + svgo: 0.7.2 + resolution: b6df18aa613b666e133f08adb5219c2684ac108d + /postcss-unique-selectors/2.0.2: + dependencies: + alphanum-sort: 1.0.2 + postcss: 5.2.17 + uniqs: 2.0.0 + resolution: 981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d + /postcss-value-parser/3.3.0: 87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15 + /postcss-zindex/2.2.0: + dependencies: + has: 1.0.1 + postcss: 5.2.17 + uniqs: 2.0.0 + resolution: d2109ddc055b91af67fc4cb3b025946639d2af22 + /postcss/5.2.17: + dependencies: + chalk: 1.1.3 + js-base64: 2.1.9 + source-map: 0.5.6 + supports-color: 3.2.3 + resolution: cf4f597b864d65c8a492b2eabe9d706c879c388b + /prelude-ls/1.1.2: 21932a549f5e52ffd9a827f570e04be62a97da54 + /prepend-http/1.0.4: d4f4562b0ce3696e41ac52d0e002e57a635dc6dc + /preserve/0.2.0: 815ed1f6ebc65926f865b310c0713bcb3315ce4b + /pretty-format/18.1.0: + dependencies: + ansi-styles: 2.2.1 + resolution: fb65a86f7a7f9194963eee91865c1bcf1039e284 + /pretty-hrtime/1.0.3: b7e3ea42435a4c9b2759d99e0f201eb195802ee1 + /pretty-ms/0.2.2: + dependencies: + parse-ms: 0.1.2 + resolution: da879a682ff33a37011046f13d627f67c73b84f6 + /pretty-ms/2.1.0: + dependencies: + is-finite: 1.0.2 + parse-ms: 1.0.1 + plur: 1.0.0 + resolution: 4257c256df3fb0b451d6affaab021884126981dc + /private/0.1.7: 68ce5e8a1ef0a23bb570cc28537b5332aba63ef1 + /process-nextick-args/1.0.7: 150e20b756590ad3f91093f25a4f2ad8bff30ba3 + /process/0.11.10: 7332300e840161bda3e69a1d1d91a7d4bc16f182 + /progress/1.1.8: e260c78f6161cdd9b0e56cc3e0a85de17c7a57be + /proto-props/0.2.1: 5e01dc2675a0de9abfa76e799dfa334d6f483f4b + /pseudomap/1.0.2: f052a28da70e618917ef0a8ac34c1ae5a68286b3 + /public-encrypt/4.0.0: + dependencies: + bn.js: 4.11.6 + browserify-rsa: 4.0.1 + create-hash: 1.1.2 + parse-asn1: 5.1.0 + randombytes: 2.0.3 + resolution: 39f699f3a46560dd5ebacbca693caf7c65c18cc6 + /punycode/1.3.2: 9653a036fb7c1ee42342f2325cceefea3926c48d + /punycode/1.4.1: c0d5a63b2718800ad8e1eb0fa5269c84dd41845e + /q/1.5.0: dd01bac9d06d30e6f219aecb8253ee9ebdc308f1 + /qs/2.2.5: 1088abaf9dcc0ae5ae45b709e6c6b5888b23923c + /qs/5.2.0: a9f31142af468cb72b25b30136ba2456834916be + /qs/6.4.0: 13e26d28ad6b0ffaa91312cd3bf708ed351e7233 + /query-string/4.3.4: + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + resolution: bbb693b9ca915c232515b228b1a02b609043dbeb + /querystring-es3/0.2.1: 9ec61f79049875707d69414596fd907a4d711e73 + /querystring/0.2.0: b209849203bb25df820da756e747005878521620 + /randomatic/1.1.6: + dependencies: + is-number: 2.1.0 + kind-of: 3.2.0 + resolution: 110dcabff397e9dcff7c0789ccc0a49adf1ec5bb + /randombytes/2.0.3: 674c99760901c3c4112771a31e521dc349cc09ec + /raw-body/2.1.7: + dependencies: + bytes: 2.4.0 + iconv-lite: 0.4.13 + unpipe: 1.0.0 + resolution: adfeace2e4fb3098058014d08c072dcc59758774 + /rc/1.2.1: + dependencies: + deep-extend: 0.4.1 + ini: 1.3.4 + minimist: 1.2.0 + strip-json-comments: 2.0.1 + resolution: 2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95 + /read-all-stream/3.1.0: + dependencies: + pinkie-promise: 2.0.1 + readable-stream: 2.2.9 + resolution: 35c3e177f2078ef789ee4bfafa4373074eaef4fa + /read-only-stream/2.0.0: + dependencies: + readable-stream: 2.2.9 + resolution: 2724fd6a8113d73764ac288d4386270c1dbf17f0 + /read-pkg-up/1.0.1: + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + resolution: 9d63c13276c065918d57f002a57f40a1b643fb02 + /read-pkg-up/2.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 2.0.0 + resolution: 6b72a8048984e0c41e79510fd5e9fa99b3b549be + /read-pkg/1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.3.8 + path-type: 1.1.0 + resolution: f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28 + /read-pkg/2.0.0: + dependencies: + load-json-file: 2.0.0 + normalize-package-data: 2.3.8 + path-type: 2.0.0 + resolution: 8ef1c0623c6a6db0dc6713c4bfac46332b2368f8 + /readable-stream/1.0.34: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.3 + isarray: 0.0.1 + string_decoder: 0.10.31 + resolution: 125820e34bc842d2f2aaafafe4c2916ee32c157c + /readable-stream/1.1.14: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.3 + isarray: 0.0.1 + string_decoder: 0.10.31 + resolution: 7cf4c54ef648e3813084c636dd2079e166c081d9 + /readable-stream/2.0.6: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.3 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + string_decoder: 0.10.31 + util-deprecate: 1.0.2 + resolution: 8f90341e68a53ccc928788dacfcd11b36eb9b78e + /readable-stream/2.2.9: + dependencies: + buffer-shims: 1.0.0 + core-util-is: 1.0.2 + inherits: 2.0.3 + isarray: 1.0.0 + process-nextick-args: 1.0.7 + string_decoder: 1.0.0 + util-deprecate: 1.0.2 + resolution: cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8 + /readdirp/2.1.0: + dependencies: + graceful-fs: 4.1.11 + minimatch: 3.0.3 + readable-stream: 2.2.9 + set-immediate-shim: 1.0.1 + resolution: 4ed0ad060df3073300c48440373f72d1cc642d78 + /readline2/1.0.1: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + mute-stream: 0.0.5 + resolution: 41059608ffc154757b715d9989d199ffbf372e35 + /recast/0.10.43: + dependencies: + ast-types: 0.8.15 + esprima-fb: 15001.1001.0-dev-harmony-fb + private: 0.1.7 + source-map: 0.5.6 + resolution: b95d50f6d60761a5f6252e15d80678168491ce7f + /rechoir/0.6.2: + dependencies: + resolve: 1.3.3 + resolution: 85204b54dba82d5742e28c96756ef43af50e3384 + /redent/1.0.0: + dependencies: + indent-string: 2.1.0 + strip-indent: 1.0.1 + resolution: cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde + /reduce-css-calc/1.3.0: + dependencies: + balanced-match: 0.4.2 + math-expression-evaluator: 1.2.17 + reduce-function-call: 1.0.2 + resolution: 747c914e049614a4c9cfbba629871ad1d2927716 + /reduce-function-call/1.0.2: + dependencies: + balanced-match: 0.4.2 + resolution: 5a200bf92e0e37751752fe45b0ab330fd4b6be99 + /regenerate/1.3.2: d1941c67bad437e1be76433add5b385f95b19260 + /regenerator-runtime/0.10.5: 336c3efc1220adcedda2c9fab67b5a7955a33658 + /regenerator-transform/0.9.11: + dependencies: + babel-runtime: 6.23.0 + babel-types: 6.24.1 + private: 0.1.7 + resolution: 3a7d067520cb7b7176769eb5ff868691befe1283 + /regex-cache/0.4.3: + dependencies: + is-equal-shallow: 0.1.3 + is-primitive: 2.0.0 + resolution: 9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145 + /regexpu-core/2.0.0: + dependencies: + regenerate: 1.3.2 + regjsgen: 0.2.0 + regjsparser: 0.1.5 + resolution: 49d038837b8dcf8bfa5b9a42139938e6ea2ae240 + /registry-auth-token/3.3.1: + dependencies: + rc: 1.2.1 + safe-buffer: 5.0.1 + resolution: fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006 + /registry-url/3.1.0: + dependencies: + rc: 1.2.1 + resolution: 3d4ef870f73dde1d77f0cf9a381432444e174942 + /regjsgen/0.2.0: 6c016adeac554f75823fe37ac05b92d5a4edb1f7 + /regjsparser/0.1.5: + dependencies: + jsesc: 0.5.0 + resolution: 7ee8f84dc6fa792d3fd0ae228d24bd949ead205c + /relateurl/0.2.7: 54dbf377e51440aca90a4cd274600d3ff2d888a9 + /remove-trailing-separator/1.0.1: 615ebb96af559552d4bf4057c8436d486ab63cc4 + /repeat-element/1.1.2: ef089a178d1483baae4d93eb98b4f9e4e11d990a + /repeat-string/1.6.1: 8dcae470e1c88abc2d600fff4a776286da75e637 + /repeating/2.0.1: + dependencies: + is-finite: 1.0.2 + resolution: 5214c53a926d3552707527fbab415dbc08d06dda + /replace-ext/0.0.1: 29bbd92078a739f0bcce2b4ee41e837953522924 + /req-all/1.0.0: d128569451c340b432409c656cf166260cd2628d + /request/2.81.0: + dependencies: + aws-sign2: 0.6.0 + aws4: 1.6.0 + caseless: 0.12.0 + combined-stream: 1.0.5 + extend: 3.0.1 + forever-agent: 0.6.1 + form-data: 2.1.4 + har-validator: 4.2.1 + hawk: 3.1.3 + http-signature: 1.1.1 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.15 + oauth-sign: 0.8.2 + performance-now: 0.2.0 + qs: 6.4.0 + safe-buffer: 5.0.1 + stringstream: 0.0.5 + tough-cookie: 2.3.2 + tunnel-agent: 0.6.0 + uuid: 3.0.1 + resolution: c6928946a0e06c5f8d6f8a9333469ffda46298a0 + /require-directory/2.1.1: 8c64ad5fd30dab1c976e2344ffe7f792a6a6df42 + /require-from-string/1.2.1: 529c9ccef27380adfec9a2f965b649bbee636418 + /require-main-filename/1.0.1: 97f717b69d48784f5f526a6c5aa8ffdda055a4d1 + /require-precompiled/0.1.0: 5a1b52eb70ebed43eb982e974c85ab59571e56fa + /require-uncached/1.0.3: + dependencies: + caller-path: 0.1.0 + resolve-from: 1.0.1 + resolution: 4e0d56d6c9662fd31e43011c4b95aa49955421d3 + /resolve-cwd/1.0.0: + dependencies: + resolve-from: 2.0.0 + resolution: 4eaeea41ed040d1702457df64a42b2b07d246f9f + /resolve-dir/0.1.1: + dependencies: + expand-tilde: 1.2.2 + global-modules: 0.2.3 + resolution: b219259a5602fac5c5c496ad894a6e8cc430261e + /resolve-from/1.0.1: 26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226 + /resolve-from/2.0.0: 9480ab20e94ffa1d9e80a804c7ea147611966b57 + /resolve-url/0.2.1: 2c637fe77c893afd2a663fe21aa9080068e2052a + /resolve/1.1.7: 203114d82ad2c5ed9e8e0411b3932875e889e97b + /resolve/1.3.3: + dependencies: + path-parse: 1.0.5 + resolution: 655907c3469a8680dc2de3a275a8fdd69691f0e5 + /restore-cursor/1.0.1: + dependencies: + exit-hook: 1.1.1 + onetime: 1.1.0 + resolution: 34661f46886327fed2991479152252df92daa541 + /restore-cursor/2.0.0: + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.2 + resolution: 9f7ee287f82fd326d4fd162923d62129eee0dfaf + /rev-hash/1.0.0: 96993959ea9bfb1c59b13adf02ac2e34bb373603 + /rev-path/1.0.0: + dependencies: + modify-filename: 1.1.0 + resolution: d4ccb436ac3370c4607175ce88eafc5c65c5d653 + /right-align/0.1.3: + dependencies: + align-text: 0.1.4 + resolution: 61339b722fe6a3515689210d24e14c96148613ef + /rimraf/2.6.1: + dependencies: + glob: 7.1.1 + resolution: c2338ec643df7a1b7fe5c54fa86f57428a55f33d + /ripemd160/1.0.1: 93a4bbd4942bc574b69a8fa57c71de10ecca7d6e + /rollup-stream/1.19.0: + dependencies: + rollup: 0.41.6 + resolution: 8ab70d3970d8ec8529f1c1d7a688d8d65f90599a + /rollup/0.41.6: + dependencies: + source-map-support: 0.4.15 + resolution: e0d05497877a398c104d816d2733a718a7a94e2a + /run-async/0.1.0: + dependencies: + once: 1.4.0 + resolution: c8ad4a5e110661e402a7d21b530e009f25f8e389 + /rx-lite/3.1.2: 19ce502ca572665f3b647b10939f97fd1615f102 + /rxjs/5.3.1: + dependencies: + symbol-observable: 1.0.4 + resolution: 9ecc9e722247e4f4490d30a878577a3740fd0cb7 + /safe-buffer/5.0.1: d263ca54696cd8a306b5ca6551e92de57918fbe7 + /sass-graph/2.2.2: + dependencies: + glob: 7.1.1 + lodash: 4.17.4 + scss-tokenizer: 0.2.1 + yargs: 6.6.0 + resolution: f4d6c95b546ea2a09d14176d0fc1a07ee2b48354 + /sax/1.2.2: fd8631a23bc7826bef5d871bdb87378c95647828 + /scss-tokenizer/0.2.1: + dependencies: + js-base64: 2.1.9 + source-map: 0.4.4 + resolution: 07c0cc577bb7ab4d08fd900185adbf4bc844141d + /semver-diff/2.1.0: + dependencies: + semver: 5.3.0 + resolution: 4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36 + /semver/4.3.6: 300bc6e0e86374f7ba61068b5b1ecd57fc6532da + /semver/5.3.0: 9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f + /sequencify/0.0.7: 90cff19d02e07027fd767f5ead3e7b95d1e7380c + /set-blocking/2.0.0: 045f9782d011ae9a6803ddd382b24392b3d890f7 + /set-immediate-shim/1.0.1: 4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61 + /sha.js/2.4.8: + dependencies: + inherits: 2.0.3 + resolution: 37068c2c476b6baf402d14a49c67f597921f634f + /shasum/1.0.2: + dependencies: + json-stable-stringify: 0.0.1 + sha.js: 2.4.8 + resolution: e7012310d8f417f4deb5712150e5678b87ae565f + /shebang-command/1.2.0: + dependencies: + shebang-regex: 1.0.0 + resolution: 44aac65b695b03398968c39f363fee5deafdf1ea + /shebang-regex/1.0.0: da42f49740c0b42db2ca9728571cb190c98efea3 + /shell-quote/1.6.1: + dependencies: + array-filter: 0.0.1 + array-map: 0.0.0 + array-reduce: 0.0.0 + jsonify: 0.0.0 + resolution: f4781949cce402697127430ea3b3c5476f481767 + /shelljs/0.7.7: + dependencies: + glob: 7.1.1 + interpret: 1.0.3 + rechoir: 0.6.2 + resolution: b2f5c77ef97148f4b4f6e22682e10bba8667cff1 + /sigmund/1.0.1: 3ff21f198cad2175f9f3b781853fd94d0d19b590 + /signal-exit/3.0.2: b5fdc08f1287ea1178628e415e25132b73646c6d + /slash/1.0.0: c41f2f6c39fc16d1cd17ad4b5d896114ae470d55 + /slice-ansi/0.0.4: edbf8903f66f7ce2f8eafd6ceed65e264c831b35 + /slide/1.1.6: 56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707 + /sntp/1.0.9: + dependencies: + hoek: 2.16.3 + resolution: 6541184cc90aeea6c6e7b35e2659082443c66198 + /sort-keys/1.1.2: + dependencies: + is-plain-obj: 1.1.0 + resolution: 441b6d4d346798f1b4e49e8920adfba0e543f9ad + /source-map-resolve/0.3.1: + dependencies: + atob: 1.1.3 + resolve-url: 0.2.1 + source-map-url: 0.3.0 + urix: 0.1.0 + resolution: 610f6122a445b8dd51535a2a71b783dfc1248761 + /source-map-support/0.4.15: + dependencies: + source-map: 0.5.6 + resolution: 03202df65c06d2bd8c7ec2362a193056fef8d3b1 + /source-map-url/0.3.0: 7ecaf13b57bcd09da8a40c5d269db33799d4aaf9 + /source-map/0.1.31: + dependencies: + amdefine: 1.0.1 + resolution: 9f704d0d69d9e138a81badf6ebb4fde33d151c61 + /source-map/0.1.43: + dependencies: + amdefine: 1.0.1 + resolution: c24bc146ca517c1471f5dacbe2571b2b7f9e3346 + /source-map/0.2.0: + dependencies: + amdefine: 1.0.1 + resolution: dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d + /source-map/0.4.4: + dependencies: + amdefine: 1.0.1 + resolution: eba4f5da9c0dc999de68032d8b4f76173652036b + /source-map/0.5.6: 75ce38f52bf0733c5a7f0c118d81334a2bb5f412 + /sparkles/1.0.0: 1acbbfb592436d10bbe8f785b7cc6f82815012c3 + /spdx-correct/1.0.2: + dependencies: + spdx-license-ids: 1.2.2 + resolution: 4b3073d933ff51f3912f03ac5519498a4150db40 + /spdx-expression-parse/1.0.4: 9bdf2f20e1f40ed447fbe273266191fced51626c + /spdx-license-ids/1.2.2: c9df7a3424594ade6bd11900d596696dc06bac57 + /split/0.3.3: + dependencies: + through: 2.3.8 + resolution: cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f + /sprintf-js/1.0.3: 04e6926f662895354f3dd015203633b857297e2c + /sshpk/1.13.0: + dependencies: + asn1: 0.2.3 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.1 + dashdash: 1.14.1 + ecc-jsbn: 0.1.1 + getpass: 0.1.7 + jodid25519: 1.0.2 + jsbn: 0.1.1 + tweetnacl: 0.14.5 + resolution: ff2a3e4fd04497555fed97b39a0fd82fafb3a33c + /stack-utils/1.0.1: d4f33ab54e8e38778b0ca5cfd3b3afb12db68620 + /staged-git-files/0.0.4: d797e1b551ca7a639dec0237dc6eb4bb9be17d35 + /static-eval/1.1.1: + dependencies: + escodegen: 1.8.1 + resolution: ca8130210354cf13d9a722bc7e923778457bb192 + /statuses/1.3.1: faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e + /stdout-stream/1.4.0: + dependencies: + readable-stream: 2.2.9 + resolution: a2c7c8587e54d9427ea9edb3ac3f2cd522df378b + /stream-browserify/2.0.1: + dependencies: + inherits: 2.0.3 + readable-stream: 2.2.9 + resolution: 66266ee5f9bdb9940a4e4514cafb43bb71e5c9db + /stream-combiner/0.0.4: + dependencies: + duplexer: 0.1.1 + resolution: 4d5e433c185261dde623ca3f44c586bcf5c4ad14 + /stream-combiner2/1.1.1: + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.2.9 + resolution: fb4d8a1420ea362764e21ad4780397bebcb41cbe + /stream-consume/0.1.0: a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f + /stream-http/2.7.0: + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.3 + readable-stream: 2.2.9 + to-arraybuffer: 1.0.1 + xtend: 4.0.1 + resolution: cec1f4e3b494bc4a81b451808970f8b20b4ed5f6 + /stream-splicer/2.0.0: + dependencies: + inherits: 2.0.3 + readable-stream: 2.2.9 + resolution: 1b63be438a133e4b671cc1935197600175910d83 + /stream-to-observable/0.1.0: 45bf1d9f2d7dc09bed81f1c307c430e68b84cffe + /strict-uri-encode/1.1.0: 279b225df1d582b1f54e65addd4352e18faa0713 + /string-width/1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + resolution: 118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3 + /string-width/2.0.0: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 3.0.1 + resolution: 635c5436cc72a6e0c387ceca278d4e2eec52687e + /string_decoder/0.10.31: 62e203bc41766c6c28c9fc84301dab1c5310fa94 + /string_decoder/1.0.0: + dependencies: + buffer-shims: 1.0.0 + resolution: f06f41157b664d86069f84bdbdc9b0d8ab281667 + /stringstream/0.0.5: 4e484cd4de5a0bbbee18e46307710a8a81621878 + /strip-ansi/0.1.1: 39e8a98d044d150660abe4a6808acf70bb7bc991 + /strip-ansi/0.3.0: + dependencies: + ansi-regex: 0.2.1 + resolution: 25f48ea22ca79187f3174a4db8759347bb126220 + /strip-ansi/3.0.1: + dependencies: + ansi-regex: 2.1.1 + resolution: 6a385fb8853d952d5ff05d0e8aaf94278dc63dcf + /strip-bom-buf/1.0.0: + dependencies: + is-utf8: 0.2.1 + resolution: 1cb45aaf57530f4caf86c7f75179d2c9a51dd572 + /strip-bom-stream/1.0.0: + dependencies: + first-chunk-stream: 1.0.0 + strip-bom: 2.0.0 + resolution: e7144398577d51a6bed0fa1994fa05f43fd988ee + /strip-bom-string/1.0.0: e5211e9224369fbb81d633a2f00044dc8cedad92 + /strip-bom/1.0.0: + dependencies: + first-chunk-stream: 1.0.0 + is-utf8: 0.2.1 + resolution: 85b8862f3844b5a6d5ec8467a93598173a36f794 + /strip-bom/2.0.0: + dependencies: + is-utf8: 0.2.1 + resolution: 6219a85616520491f35788bdbf1447a99c7e6b0e + /strip-bom/3.0.0: 2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3 + /strip-eof/1.0.0: bb43ff5598a6eb05d89b59fcd129c983313606bf + /strip-indent/1.0.1: + dependencies: + get-stdin: 4.0.1 + resolution: 0c7962a6adefa7bbd4ac366460a638552ae1a0a2 + /strip-json-comments/2.0.1: 3c531942e908c2697c0ec344858c286c7ca0a60a + /subarg/1.0.0: + dependencies: + minimist: 1.2.0 + resolution: f62cf17581e996b48fc965699f54c06ae268b8d2 + /supports-color/0.2.0: d92de2694eb3f67323973d7ae3d8b55b4c22190a + /supports-color/2.0.0: 535d045ce6b6363fa40117084629995e9df324c7 + /supports-color/3.2.3: + dependencies: + has-flag: 1.0.0 + resolution: 65ac0504b3954171d8a64946b2ae3cbb8a5f54f6 + /svgo/0.6.6: + dependencies: + coa: 1.0.1 + colors: 1.1.2 + csso: 2.0.0 + js-yaml: 3.6.1 + mkdirp: 0.5.1 + sax: 1.2.2 + whet.extend: 0.9.9 + resolution: b340889036f20f9b447543077d0f5573ed044c08 + /svgo/0.7.2: + dependencies: + coa: 1.0.1 + colors: 1.1.2 + csso: 2.3.2 + js-yaml: 3.7.0 + mkdirp: 0.5.1 + sax: 1.2.2 + whet.extend: 0.9.9 + resolution: 9f5772413952135c6fefbf40afe6a4faa88b4bb5 + /symbol-observable/0.2.4: 95a83db26186d6af7e7a18dbd9760a2f86d08f40 + /symbol-observable/1.0.4: 29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d + /syntax-error/1.3.0: + dependencies: + acorn: 4.0.11 + resolution: 1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1 + /table/3.8.3: + dependencies: + ajv: 4.11.8 + ajv-keywords: 1.5.1 + chalk: 1.1.3 + lodash: 4.17.4 + slice-ansi: 0.0.4 + string-width: 2.0.0 + resolution: 2bbc542f0fda9861a755d3947fefd8b3f513855f + /tar/2.2.1: + dependencies: + block-stream: 0.0.9 + fstream: 1.0.11 + inherits: 2.0.3 + resolution: 8e4d2a256c0e2185c6b18ad694aec968b83cb1d1 + /term-size/0.1.1: + dependencies: + execa: 0.4.0 + resolution: 87360b96396cab5760963714cda0d0cbeecad9ca + /text-table/0.2.0: 7f5ee823ae805207c00af2df4a84ec3fcfa570b4 + /the-argv/1.0.0: 0084705005730dd84db755253c931ae398db9522 + /through/2.3.8: 0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5 + /through2/0.4.2: + dependencies: + readable-stream: 1.0.34 + xtend: 2.1.2 + resolution: dbf5866031151ec8352bb6c4db64a2292a840b9b + /through2/0.6.5: + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.1 + resolution: 41ab9c67b29d57209071410e1d7a7a968cd3ad48 + /through2/2.0.3: + dependencies: + readable-stream: 2.2.9 + xtend: 4.0.1 + resolution: 0004569b37c7c74ba39c43f3ced78d1ad94140be + /tildify/1.2.0: + dependencies: + os-homedir: 1.0.2 + resolution: dcec03f55dca9b7aa3e5b04f21817eb56e63588a + /time-require/0.1.2: + dependencies: + chalk: 0.4.0 + date-time: 0.1.1 + pretty-ms: 0.2.2 + text-table: 0.2.0 + resolution: f9e12cb370fc2605e11404582ba54ef5ca2b2d98 + /time-stamp/1.0.1: 9f4bd23559c9365966f3302dbba2b07c6b99b151 + /timed-out/3.1.3: 95860bfcc5c76c277f8f8326fd0f5b2e20eba217 + /timed-out/4.0.1: f32eacac5a175bea25d7fab565ab3ed8741ef56f + /timers-browserify/1.4.2: + dependencies: + process: 0.11.10 + resolution: c9c58b575be8407375cb5e2462dacee74359f41d + /to-arraybuffer/1.0.1: 7d229b1fcc637e466ca081180836a7aabff83f43 + /to-fast-properties/1.0.3: b83571fa4d8c25b82e231b06e3a3055de4ca1a47 + /tough-cookie/2.3.2: + dependencies: + punycode: 1.4.1 + resolution: f081f76e4c85720e6c37a5faced737150d84072a + /trim-newlines/1.0.0: 5887966bb582a4503a41eb524f7d35011815a613 + /trim-right/1.0.1: cb2e1203067e0c8de1f614094b9fe45704ea6003 + /tryit/1.0.3: 393be730a9446fd1ead6da59a014308f36c289cb + /tty-browserify/0.0.0: a157ba402da24e9bf957f9aa69d524eed42901a6 + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.0.1 + resolution: 27a5dea06b36b04a0a9966774b290868f0fc40fd + /tweetnacl/0.14.5: 5ae68177f192d4456269d108afa93ff8743f4f64 + /type-check/0.3.2: + dependencies: + prelude-ls: 1.1.2 + resolution: 5884cab512cf1d355e3fb784f30804b2b520db72 + /type-detect/0.1.1: 0ba5ec2a885640e470ea4e8505971900dac58822 + /type-detect/1.0.0: 762217cc06db258ec48908a1298e8b95121e8ea2 + /type-is/1.6.15: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.15 + resolution: cab10fb4909e441c82842eafe1ad646c81804410 + /typedarray/0.0.6: 867ac74e3864187b1d3d47d996a78ec5c8830777 + /uglify-js/2.8.22: + dependencies: + source-map: 0.5.6 + uglify-to-browserify: 1.0.2 + yargs: 3.10.0 + resolution: d54934778a8da14903fa29a326fb24c0ab51a1a0 + /uglify-save-license/0.4.1: 95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1 + /uglify-to-browserify/1.0.2: 6e0924d6bda6b5afe349e39a6d632850a0f882b7 + /uglifyify/3.0.4: + dependencies: + convert-source-map: 1.1.3 + extend: 1.3.0 + minimatch: 3.0.3 + through: 2.3.8 + uglify-js: 2.8.22 + resolution: 487e080a5a7798880e68e90def9b06681fb13bd2 + /uid2/0.0.3: 483126e11774df2f71b8b639dcd799c376162b82 + /umd/3.0.1: 8ae556e11011f63c2596708a8837259f01b3d60e + /unc-path-regex/0.1.2: e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa + /uniq/1.0.1: b31c5ae8254844a3a8281541ce2b04b865a734ff + /uniqid/4.1.1: + dependencies: + macaddress: 0.2.8 + resolution: 89220ddf6b751ae52b5f72484863528596bb84c1 + /uniqs/2.0.0: ffede4b36b25290696e6e165d4a59edb998e6b02 + /unique-stream/1.0.0: d59a4a75427447d9aa6c91e70263f8d26a4b104b + /unique-string/1.0.0: + dependencies: + crypto-random-string: 1.0.0 + resolution: 9e1057cca851abb93398f8b33ae187b99caec11a + /unique-temp-dir/1.0.0: + dependencies: + mkdirp: 0.5.1 + os-tmpdir: 1.0.2 + uid2: 0.0.3 + resolution: 6dce95b2681ca003eebfb304a415f9cbabcc5385 + /unpipe/1.0.0: b2bf4ee8514aae6165b4817829d21b2ef49904ec + /unreachable-branch-transform/0.3.0: + dependencies: + esmangle-evaluator: 1.0.1 + recast: 0.10.43 + through2: 0.6.5 + resolution: d99cc4c6e746d264928845b611db54b0f3474caa + /unzip-response/1.0.2: b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe + /unzip-response/2.0.1: d2f0f737d16b0615e72a6935ed04214572d56f97 + /update-notifier/1.0.3: + dependencies: + boxen: 0.6.0 + chalk: 1.1.3 + configstore: 2.1.0 + is-npm: 1.0.0 + latest-version: 2.0.0 + lazy-req: 1.1.0 + semver-diff: 2.1.0 + xdg-basedir: 2.0.0 + resolution: 8f92c515482bd6831b7c93013e70f87552c7cf5a + /update-notifier/2.1.0: + dependencies: + boxen: 1.1.0 + chalk: 1.1.3 + configstore: 3.0.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + lazy-req: 2.0.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + resolution: ec0c1e53536b76647a24b77cb83966d9315123d9 + /upper-case/1.1.3: f6b4501c2ec4cdd26ba78be7222961de77621598 + /urix/0.1.0: da937f7a62e21fec1fd18d49b35c2935067a6c72 + /url-parse-lax/1.0.0: + dependencies: + prepend-http: 1.0.4 + resolution: 7af8f303645e9bd79a272e7a14ac68bc0609da73 + /url/0.11.0: + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + resolution: 3838e97cfc60521eb73c525a8e55bfdd9e2e28f1 + /user-home/1.1.1: 2b5be23a32b63a7c9deb8d0f28d485724a3df190 + /user-home/2.0.0: + dependencies: + os-homedir: 1.0.2 + resolution: 9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f + /util-deprecate/1.0.2: 450d4dc9fa70de732762fbd2d4a28981419a0ccf + /util/0.10.3: + dependencies: + inherits: 2.0.1 + resolution: 7afb1afe50805246489e3db7fe0ed379336ac0f9 + /uuid/2.0.3: 67e2e863797215530dff318e5bf9dcebfd47b21a + /uuid/3.0.1: 6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1 + /v8flags/2.1.1: + dependencies: + user-home: 1.1.1 + resolution: aab1a1fa30d45f88dd321148875ac02c0b55e5b4 + /validate-npm-package-license/3.0.1: + dependencies: + spdx-correct: 1.0.2 + spdx-expression-parse: 1.0.4 + resolution: 2804babe712ad3379459acfbe24746ab2c303fbc + /vendors/1.0.1: 37ad73c8ee417fb3d580e785312307d274847f22 + /verror/1.3.6: + dependencies: + extsprintf: 1.0.2 + resolution: cff5df12946d297d2baaefaa2689e25be01c005c + /vinyl-buffer/1.0.0: + dependencies: + bl: 0.9.5 + through2: 0.6.5 + resolution: ca067ea08431d507722b1de5083f602616ebc234 + /vinyl-file/1.3.0: + dependencies: + graceful-fs: 4.1.11 + strip-bom: 2.0.0 + strip-bom-stream: 1.0.0 + vinyl: 1.2.0 + resolution: aa05634d3a867ba91447bedbb34afcb26f44f6e7 + /vinyl-fs/0.3.14: + dependencies: + defaults: 1.0.3 + glob-stream: 3.1.18 + glob-watcher: 0.0.6 + graceful-fs: 3.0.11 + mkdirp: 0.5.1 + strip-bom: 1.0.0 + through2: 0.6.5 + vinyl: 0.4.6 + resolution: 9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6 + /vinyl-source-stream/1.1.0: + dependencies: + through2: 0.6.5 + vinyl: 0.4.6 + resolution: 44cbe5108205279deb0c5653c094a2887938b1ab + /vinyl-sourcemaps-apply/0.2.1: + dependencies: + source-map: 0.5.6 + resolution: ab6549d61d172c2b1b87be5c508d239c8ef87705 + /vinyl/0.4.6: + dependencies: + clone: 0.2.0 + clone-stats: 0.0.1 + resolution: 2f356c87a550a255461f36bbeb2a5ba8bf784847 + /vinyl/0.5.3: + dependencies: + clone: 1.0.2 + clone-stats: 0.0.1 + replace-ext: 0.0.1 + resolution: b0455b38fc5e0cf30d4325132e461970c2091cde + /vinyl/1.2.0: + dependencies: + clone: 1.0.2 + clone-stats: 0.0.1 + replace-ext: 0.0.1 + resolution: 5c88036cf565e5df05558bfc911f8656df218884 + /vm-browserify/0.0.4: + dependencies: + indexof: 0.0.1 + resolution: 5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73 + /watchify/3.9.0: + dependencies: + anymatch: 1.3.0 + browserify: 14.3.0 + chokidar: 1.6.1 + defined: 1.0.0 + outpipe: 1.1.1 + through2: 2.0.3 + xtend: 4.0.1 + resolution: f075fd2e8a86acde84cedba6e5c2a0bedd523d9e + /websocket-driver/0.6.5: + dependencies: + websocket-extensions: 0.1.1 + resolution: 5cb2556ceb85f4373c6d8238aa691c8454e13a36 + /websocket-extensions/0.1.1: 76899499c184b6ef754377c2dbb0cd6cb55d29e7 + /whet.extend/0.9.9: f877d5bf648c97e5aa542fadc16d6a259b9c11a1 + /which-module/1.0.0: bba63ca861948994ff307736089e3b96026c2a4f + /which/1.2.14: + dependencies: + isexe: 2.0.0 + resolution: 9a87c4378f03e827cecaf1acdf56c736c01c14e5 + /wide-align/1.1.0: + dependencies: + string-width: 1.0.2 + resolution: 40edde802a71fea1f070da3e62dcda2e7add96ad + /widest-line/1.0.0: + dependencies: + string-width: 1.0.2 + resolution: 0c09c85c2a94683d0d7eaf8ee097d564bf0e105c + /window-size/0.1.0: 5438cd2ea93b202efa3a19fe8887aee7c94f9c9d + /wordwrap/0.0.2: b79669bb42ecb409f83d583cad52ca17eaa1643f + /wordwrap/1.0.0: 27584810891456a4171c8d0226441ade90cbcaeb + /wrap-ansi/2.1.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + resolution: d8fc3d284dd05794fe84973caecdd1cf824fdd85 + /wrappy/1.0.2: b5243d8f3ec1aa35f1364605bc0d1036e30ab69f + /write-file-atomic/1.3.4: + dependencies: + graceful-fs: 4.1.11 + imurmurhash: 0.1.4 + slide: 1.1.6 + resolution: f807a4f0b1d9e913ae7a48112e6cc3af1991b45f + /write-json-file/2.0.0: + dependencies: + graceful-fs: 4.1.11 + mkdirp: 0.5.1 + pify: 2.3.0 + sort-keys: 1.1.2 + write-file-atomic: 1.3.4 + resolution: 0eaec981fcf9288dbc2806cbd26e06ab9bdca4ed + /write-pkg/2.1.0: + dependencies: + sort-keys: 1.1.2 + write-json-file: 2.0.0 + resolution: 353aa44c39c48c21440f5c08ce6abd46141c9c08 + /write/0.2.1: + dependencies: + mkdirp: 0.5.1 + resolution: 5fc03828e264cea3fe91455476f7a3c566cb0757 + /xdg-basedir/2.0.0: + dependencies: + os-homedir: 1.0.2 + resolution: edbc903cc385fc04523d966a335504b5504d1bd2 + /xdg-basedir/3.0.0: 496b2cc109eca8dbacfe2dc72b603c17c5870ad4 + /xml-char-classes/1.0.0: 64657848a20ffc5df583a42ad8a277b4512bbc4d + /xo-init/0.5.0: + dependencies: + arrify: 1.0.1 + execa: 0.5.1 + minimist: 1.2.0 + path-exists: 3.0.0 + read-pkg-up: 2.0.0 + the-argv: 1.0.0 + write-pkg: 2.1.0 + resolution: 8e28dec79676cc5e042fde5fd8f710e2646b0e36 + /xo/0.18.2: + dependencies: + arrify: 1.0.1 + debug: 2.6.6 + deep-assign: 1.0.0 + eslint: 3.19.0 + eslint-config-xo: 0.18.1 + eslint-formatter-pretty: 1.1.0 + eslint-plugin-ava: 4.2.0 + eslint-plugin-import: 2.2.0 + eslint-plugin-no-use-extend-native: 0.3.12 + eslint-plugin-promise: 3.5.0 + eslint-plugin-unicorn: 2.1.1 + get-stdin: 5.0.1 + globby: 6.1.0 + has-flag: 2.0.0 + ignore: 3.3.0 + lodash.isequal: 4.5.0 + meow: 3.7.0 + multimatch: 2.1.0 + path-exists: 3.0.0 + pkg-conf: 2.0.0 + resolve-cwd: 1.0.0 + resolve-from: 2.0.0 + slash: 1.0.0 + update-notifier: 2.1.0 + xo-init: 0.5.0 + resolution: 92a42eb02a4fb149dfea5518021914f5aac84ff0 + /xtend/2.1.2: + dependencies: + object-keys: 0.4.0 + resolution: 6efecc2a4dad8e6962c4901b337ce7ba87b5d28b + /xtend/4.0.1: a5c6d532be656e23db820efb943a1f04998d63af + /y18n/3.2.1: 6d15fba884c08679c0d77e88e7759e811e07fa41 + /yallist/2.1.2: 1c11f9218f076089a47dd512f93c6699a6a81d52 + /yargs-parser/4.2.1: + dependencies: + camelcase: 3.0.0 + resolution: 29cceac0dc4f03c6c87b4a9f217dd18c9f74871c + /yargs/3.10.0: + dependencies: + camelcase: 1.2.1 + cliui: 2.1.0 + decamelize: 1.2.0 + window-size: 0.1.0 + resolution: f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1 + /yargs/6.6.0: + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.2 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + y18n: 3.2.1 + yargs-parser: 4.2.1 + resolution: 782ec21ef403345f830a808ca3d513af56065208 +registry: 'https://registry.npmjs.org/' +version: 2 diff --git a/src/html/404.html b/src/html/404.html new file mode 100644 index 0000000..829eda8 --- /dev/null +++ b/src/html/404.html @@ -0,0 +1,33 @@ + + + + + + Page Not Found + + + + +
+

404

+

Page Not Found

+

The specified file was not found on this website. Please check the URL for mistakes and try again.

+

Why am I seeing this?

+

This page was generated by the Firebase Command-Line Interface. To modify it, edit the 404.html file in your project's configured public directory.

+
+ + diff --git a/src/html/index.html b/src/html/index.html new file mode 100644 index 0000000..8d926f7 --- /dev/null +++ b/src/html/index.html @@ -0,0 +1,100 @@ + + + + Practice JavaScript + + + + + + +
+ + +

Practice JavaScript!

+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+

TEST ERRORS

+
+
+
+
+ +
+

CODE OUTPUT

+
+
+
+
+
+
+ + +
+ +
+ + + + + + + + + + + From 13f55f6929aaa418ba1d0e6777b975a4e2613de0 Mon Sep 17 00:00:00 2001 From: Jakob Anderson Date: Fri, 5 May 2017 21:02:09 -0600 Subject: [PATCH 2/2] removed some junk i didn't use --- package.json | 3 --- shrinkwrap.yaml | 45 --------------------------------------------- 2 files changed, 48 deletions(-) diff --git a/package.json b/package.json index ce01fa8..59c460b 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "gulp": "^3.9.1", "gulp-htmlmin": "^3.0.0", "gulp-postcss": "^6.4.0", - "gulp-rev": "^7.1.2", "gulp-sourcemaps": "^2.5.1", "gulp-uglify": "^2.1.2", "gulp-util": "^3.0.8", @@ -68,10 +67,8 @@ "babel-preset-latest": "^6.24.1", "browserify": "^14.1.0", "chai": "^3.5.0", - "gulp-buffer": "^0.0.2", "gulp-htmlmin": "^3.0.0", "gulp-livereload": "^3.8.1", - "gulp-rev": "^7.1.2", "gulp-sass": "^3.1.0", "gulp-svgo": "^1.0.3", "husky": "^0.13.3", diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml index 6c34065..1188978 100644 --- a/shrinkwrap.yaml +++ b/shrinkwrap.yaml @@ -10,11 +10,9 @@ dependencies: browserify@^14.1.0: 14.3.0 chai@^3.5.0: 3.5.0 cssnano@^3.10.0: 3.10.0 - gulp-buffer@^0.0.2: 0.0.2 gulp-htmlmin@^3.0.0: 3.0.0 gulp-livereload@^3.8.1: 3.8.1 gulp-postcss@^6.4.0: 6.4.0 - gulp-rev@^7.1.2: 7.1.2 gulp-sass@^3.1.0: 3.1.0 gulp-sourcemaps@^2.5.1: 2.6.0 gulp-svgo@^1.0.3: 1.0.3 @@ -1957,10 +1955,6 @@ packages: resolution: 7613c778a1afea62f25c630a086d7f3acbbdd818 /graceful-fs/4.1.11: 0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658 /graceful-readlink/1.0.1: 4cafad76bc62f02fa039b2f94e9a3dd3a391a725 - /gulp-buffer/0.0.2: - dependencies: - through2: 0.4.2 - resolution: af81b4346101736b49942ec6c9fa867ffe737036 /gulp-htmlmin/3.0.0: dependencies: bufferstreams: 1.1.1 @@ -1986,17 +1980,6 @@ packages: postcss-load-config: 1.2.0 vinyl-sourcemaps-apply: 0.2.1 resolution: 78a32e3c87aa6cdcec5ae1c905e196d478e8c5d5 - /gulp-rev/7.1.2: - dependencies: - gulp-util: 3.0.8 - modify-filename: 1.1.0 - object-assign: 4.1.1 - rev-hash: 1.0.0 - rev-path: 1.0.0 - sort-keys: 1.1.2 - through2: 2.0.3 - vinyl-file: 1.3.0 - resolution: 5e17cc229f6b45c74256f88ad3f2d3e9a3305829 /gulp-sass/3.1.0: dependencies: gulp-util: 3.0.8 @@ -2771,7 +2754,6 @@ packages: dependencies: minimist: 0.0.8 resolution: 30057438eac6cf7f8c4767f38648d6697d75c903 - /modify-filename/1.1.0: 9a2dec83806fbb2d975f22beec859ca26b393aa1 /module-deps/4.1.1: dependencies: JSONStream: 1.3.1 @@ -2909,7 +2891,6 @@ packages: /object-assign/3.0.0: 9bedd5ca0897949bca47e7ff408062d549f587f2 /object-assign/4.1.0: 7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0 /object-assign/4.1.1: 2109adc7965887cfc05cbbd442cac8bfbb360863 - /object-keys/0.4.0: 28a6aae7428dd2c3a92f3d95f21335dd204e0336 /object-keys/1.0.11: c54601778ad560f1142ce0e01bcca8b56d13426d /object.omit/2.0.1: dependencies: @@ -3549,11 +3530,6 @@ packages: onetime: 2.0.1 signal-exit: 3.0.2 resolution: 9f7ee287f82fd326d4fd162923d62129eee0dfaf - /rev-hash/1.0.0: 96993959ea9bfb1c59b13adf02ac2e34bb373603 - /rev-path/1.0.0: - dependencies: - modify-filename: 1.1.0 - resolution: d4ccb436ac3370c4607175ce88eafc5c65c5d653 /right-align/0.1.3: dependencies: align-text: 0.1.4 @@ -3767,11 +3743,6 @@ packages: dependencies: is-utf8: 0.2.1 resolution: 1cb45aaf57530f4caf86c7f75179d2c9a51dd572 - /strip-bom-stream/1.0.0: - dependencies: - first-chunk-stream: 1.0.0 - strip-bom: 2.0.0 - resolution: e7144398577d51a6bed0fa1994fa05f43fd988ee /strip-bom-string/1.0.0: e5211e9224369fbb81d633a2f00044dc8cedad92 /strip-bom/1.0.0: dependencies: @@ -3847,11 +3818,6 @@ packages: /text-table/0.2.0: 7f5ee823ae805207c00af2df4a84ec3fcfa570b4 /the-argv/1.0.0: 0084705005730dd84db755253c931ae398db9522 /through/2.3.8: 0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5 - /through2/0.4.2: - dependencies: - readable-stream: 1.0.34 - xtend: 2.1.2 - resolution: dbf5866031151ec8352bb6c4db64a2292a840b9b /through2/0.6.5: dependencies: readable-stream: 1.0.34 @@ -4016,13 +3982,6 @@ packages: bl: 0.9.5 through2: 0.6.5 resolution: ca067ea08431d507722b1de5083f602616ebc234 - /vinyl-file/1.3.0: - dependencies: - graceful-fs: 4.1.11 - strip-bom: 2.0.0 - strip-bom-stream: 1.0.0 - vinyl: 1.2.0 - resolution: aa05634d3a867ba91447bedbb34afcb26f44f6e7 /vinyl-fs/0.3.14: dependencies: defaults: 1.0.3 @@ -4169,10 +4128,6 @@ packages: update-notifier: 2.1.0 xo-init: 0.5.0 resolution: 92a42eb02a4fb149dfea5518021914f5aac84ff0 - /xtend/2.1.2: - dependencies: - object-keys: 0.4.0 - resolution: 6efecc2a4dad8e6962c4901b337ce7ba87b5d28b /xtend/4.0.1: a5c6d532be656e23db820efb943a1f04998d63af /y18n/3.2.1: 6d15fba884c08679c0d77e88e7759e811e07fa41 /yallist/2.1.2: 1c11f9218f076089a47dd512f93c6699a6a81d52