diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e86fe25..0000000 --- a/.gitignore +++ /dev/null @@ -1,69 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# dotenv environment variables file -.env - -# gatsby files -.cache/ -public - -# Mac files -.DS_Store - -# Yarn -yarn-error.log -.pnp/ -.pnp.js -# Yarn Integrity file -.yarn-integrity diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 38bc8e0..0000000 --- a/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "trailingComma": "none" -} diff --git a/09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js b/09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js new file mode 100644 index 0000000..d3efcc7 --- /dev/null +++ b/09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{"2rMq":function(e,t,n){var r;!function(){"use strict";var o=!("undefined"==typeof window||!window.document||!window.document.createElement),a={canUseDOM:o,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:o&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:o&&!!window.screen};void 0===(r=function(){return a}.call(t,n,t,e))||(e.exports=r)}()},"8+s/":function(e,t,n){"use strict";function r(e){return e&&"object"==typeof e&&"default"in e?e.default:e}n("sc67"),n("AqHK"),n("pJf4"),n("LagC"),n("pS08");var o=n("q1tI"),a=r(o),i=r(n("2rMq")),c=r(n("Gytx"));function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}e.exports=function(e,t,n){if("function"!=typeof e)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof t)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var s=[],f=void 0;function T(){f=e(s.map((function(e){return e.props}))),p.canUseDOM?t(f):n&&(f=n(f))}var p=function(e){function t(){return u(this,t),l(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.peek=function(){return f},t.rewind=function(){if(t.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var e=f;return f=void 0,s=[],e},t.prototype.shouldComponentUpdate=function(e){return!c(e,this.props)},t.prototype.componentWillMount=function(){s.push(this),T()},t.prototype.componentDidUpdate=function(){T()},t.prototype.componentWillUnmount=function(){var e=s.indexOf(this);s.splice(e,1),T()},t.prototype.render=function(){return a.createElement(r,this.props)},t}(o.Component);return p.displayName="SideEffect("+function(e){return e.displayName||e.name||"Component"}(r)+")",p.canUseDOM=i.canUseDOM,p}}},Bl7J:function(e,t,n){"use strict";var r=n("PlB2"),o=n("q1tI"),a=n.n(o),i=n("Wbzz"),c=n("WboA"),u=n.n(c);var l=function(e){var t,n;function r(t){var n;return(n=e.call(this,t)||this).toggleNav=function(){n.setState({showNav:!n.state.showNav})},n.state={showNav:!1},n}return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,r.prototype.render=function(){var e=this.state.showNav;return a.a.createElement("header",{className:u.a.header},a.a.createElement("div",null,a.a.createElement(i.Link,{className:u.a.logo__link,to:"/"},this.props.siteTitle)),a.a.createElement("div",{className:u.a.toggle,onClick:this.toggleNav},"☰"),a.a.createElement("nav",{className:u.a.nav},e&&a.a.createElement("ul",{className:u.a.nav__mobile},a.a.createElement("li",{className:u.a.nav__item},a.a.createElement(i.Link,{to:"/",className:u.a.nav__link},"home")),a.a.createElement("li",{className:u.a.nav__item},a.a.createElement(i.Link,{to:"/Blog",className:u.a.nav__link},"blog")),a.a.createElement("li",{className:u.a.nav__item},a.a.createElement(i.Link,{to:"/Portfolio",className:u.a.nav__link},"portfolio"))),a.a.createElement("div",{className:u.a.nav__desktop},a.a.createElement(i.Link,{to:"/",className:u.a.nav__link},"home"),a.a.createElement(i.Link,{to:"/Blog",className:u.a.nav__link},"blog"),a.a.createElement(i.Link,{to:"/Portfolio",className:u.a.nav__link},"portfolio"))))},r}(a.a.Component);l.defaultProps={siteTitle:""};var s=l;n("e4Pr"),t.a=function(e){var t=e.children;return a.a.createElement(i.StaticQuery,{query:"755544856",render:function(e){return a.a.createElement(a.a.Fragment,null,a.a.createElement(s,{siteTitle:e.site.siteMetadata.title}),a.a.createElement("div",{style:{margin:"0 auto",width:"100%",paddingTop:0}},t))},data:r})}},C9fy:function(e,t,n){var r=Date.prototype,o=r.toString,a=r.getTime;new Date(NaN)+""!="Invalid Date"&&n("IYdN")(r,"toString",(function(){var e=a.call(this);return e==e?o.call(this):"Invalid Date"}))},Gytx:function(e,t,n){n("n7j8"),n("rzGZ"),n("Dq+y"),n("8npG"),n("Ggvi"),e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var c=Object.prototype.hasOwnProperty.bind(t),u=0;u=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function p(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function d(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var E,A,m,y=(0,c.default)(l.reducePropsToState,l.handleClientStateChange,l.mapStateOnServer)((function(){return null})),h=(E=y,m=A=function(e){function t(){return p(this,t),d(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.shouldComponentUpdate=function(e){return!(0,u.default)(this.props,e)},t.prototype.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case s.TAG_NAMES.SCRIPT:case s.TAG_NAMES.NOSCRIPT:return{innerHTML:t};case s.TAG_NAMES.STYLE:return{cssText:t}}throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},t.prototype.flattenArrayTypeChildren=function(e){var t,n=e.child,o=e.arrayTypeChildren,a=e.newChildProps,i=e.nestedChildren;return r({},o,((t={})[n.type]=[].concat(o[n.type]||[],[r({},a,this.mapNestedChildrenToProps(n,i))]),t))},t.prototype.mapObjectTypeChildren=function(e){var t,n,o=e.child,a=e.newProps,i=e.newChildProps,c=e.nestedChildren;switch(o.type){case s.TAG_NAMES.TITLE:return r({},a,((t={})[o.type]=c,t.titleAttributes=r({},i),t));case s.TAG_NAMES.BODY:return r({},a,{bodyAttributes:r({},i)});case s.TAG_NAMES.HTML:return r({},a,{htmlAttributes:r({},i)})}return r({},a,((n={})[o.type]=r({},i),n))},t.prototype.mapArrayTypeChildrenToProps=function(e,t){var n=r({},t);return Object.keys(e).forEach((function(t){var o;n=r({},n,((o={})[t]=e[t],o))})),n},t.prototype.warnOnInvalidChildren=function(e,t){return!0},t.prototype.mapChildrenToProps=function(e,t){var n=this,r={};return a.default.Children.forEach(e,(function(e){if(e&&e.props){var o=e.props,a=o.children,i=T(o,["children"]),c=(0,l.convertReactPropstoHtmlAttributes)(i);switch(n.warnOnInvalidChildren(e,a),e.type){case s.TAG_NAMES.LINK:case s.TAG_NAMES.META:case s.TAG_NAMES.NOSCRIPT:case s.TAG_NAMES.SCRIPT:case s.TAG_NAMES.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:c,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:c,nestedChildren:a})}}})),t=this.mapArrayTypeChildrenToProps(r,t)},t.prototype.render=function(){var e=this.props,t=e.children,n=T(e,["children"]),o=r({},n);return t&&(o=this.mapChildrenToProps(t,o)),a.default.createElement(E,o)},o(t,null,[{key:"canUseDOM",set:function(e){E.canUseDOM=e}}]),t}(a.default.Component),A.propTypes={base:i.default.object,bodyAttributes:i.default.object,children:i.default.oneOfType([i.default.arrayOf(i.default.node),i.default.node]),defaultTitle:i.default.string,defer:i.default.bool,encodeSpecialCharacters:i.default.bool,htmlAttributes:i.default.object,link:i.default.arrayOf(i.default.object),meta:i.default.arrayOf(i.default.object),noscript:i.default.arrayOf(i.default.object),onChangeClientState:i.default.func,script:i.default.arrayOf(i.default.object),style:i.default.arrayOf(i.default.object),title:i.default.string,titleAttributes:i.default.object,titleTemplate:i.default.string},A.defaultProps={defer:!0,encodeSpecialCharacters:!0},A.peek=E.peek,A.rewind=function(){var e=E.rewind();return e||(e=(0,l.mapStateOnServer)({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),e},m);h.renderStatic=h.rewind,t.Helmet=h,t.default=h},WboA:function(e,t,n){e.exports={header:"Header-module--header--1Op28",logo__link:"Header-module--logo__link--1Pt5A",toggle:"Header-module--toggle--3ZlCy",nav:"Header-module--nav--10wjH",nav__mobile:"Header-module--nav__mobile--3IJWS",nav__desktop:"Header-module--nav__desktop--GITIO",nav__item:"Header-module--nav__item--2VcX9",nav__link:"Header-module--nav__link--3n2Pi"}},bmMU:function(e,t,n){"use strict";n("pJf4"),n("Ll4R"),n("q8oJ"),n("C9fy"),n("klQ5"),n("rzGZ"),n("Dq+y"),n("8npG"),n("Ggvi"),n("MIFh");var r=Array.isArray,o=Object.keys,a=Object.prototype.hasOwnProperty,i="undefined"!=typeof Element;e.exports=function(e,t){try{return function e(t,n){if(t===n)return!0;if(t&&n&&"object"==typeof t&&"object"==typeof n){var c,u,l,s=r(t),f=r(n);if(s&&f){if((u=t.length)!=n.length)return!1;for(c=u;0!=c--;)if(!e(t[c],n[c]))return!1;return!0}if(s!=f)return!1;var T=t instanceof Date,p=n instanceof Date;if(T!=p)return!1;if(T&&p)return t.getTime()==n.getTime();var d=t instanceof RegExp,E=n instanceof RegExp;if(d!=E)return!1;if(d&&E)return t.toString()==n.toString();var A=o(t);if((u=A.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!a.call(n,A[c]))return!1;if(i&&t instanceof Element&&n instanceof Element)return t===n;for(c=u;0!=c--;)if(!("_owner"===(l=A[c])&&t.$$typeof||e(t[l],n[l])))return!1;return!0}return t!=t&&n!=n}(e,t)}catch(n){if(n.message&&n.message.match(/stack|recursion/i)||-2146828260===n.number)return console.warn("Warning: react-fast-compare does not handle circular references.",n.name,n.message),!1;throw n}}},e4Pr:function(e,t,n){},"ff/Y":function(e){e.exports=JSON.parse('{"data":{"site":{"siteMetadata":{"title":"Welcome to Alex\'s Midway","description":"a simple personal blog","author":"Alex Wang"}}}}')},"hFT/":function(e,t,n){n("U6Bt"),n("rzGZ"),n("Dq+y"),n("8npG"),n("Ggvi"),n("AqHK"),t.__esModule=!0;t.ATTRIBUTE_NAMES={BODY:"bodyAttributes",HTML:"htmlAttributes",TITLE:"titleAttributes"};var r=t.TAG_NAMES={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},o=(t.VALID_TAG_NAMES=Object.keys(r).map((function(e){return r[e]})),t.TAG_PROPERTIES={CHARSET:"charset",CSS_TEXT:"cssText",HREF:"href",HTTPEQUIV:"http-equiv",INNER_HTML:"innerHTML",ITEM_PROP:"itemprop",NAME:"name",PROPERTY:"property",REL:"rel",SRC:"src"},t.REACT_TAG_MAP={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"});t.HELMET_PROPS={DEFAULT_TITLE:"defaultTitle",DEFER:"defer",ENCODE_SPECIAL_CHARACTERS:"encodeSpecialCharacters",ON_CHANGE_CLIENT_STATE:"onChangeClientState",TITLE_TEMPLATE:"titleTemplate"},t.HTML_TAG_MAP=Object.keys(o).reduce((function(e,t){return e[o[t]]=t,e}),{}),t.SELF_CLOSING_TAGS=[r.NOSCRIPT,r.SCRIPT,r.STYLE],t.HELMET_ATTRIBUTE="data-react-helmet"},v1p5:function(e,t,n){(function(e){n("wZFJ"),n("HQhv"),n("1dPr"),n("JHok"),n("MIFh"),n("sc67"),n("rzGZ"),n("Dq+y"),n("8npG"),n("Ggvi"),n("OeI1"),n("AqHK"),n("U6Bt"),n("sC2a"),n("E5k/"),n("m210"),n("4DPX"),t.__esModule=!0,t.warn=t.requestAnimationFrame=t.reducePropsToState=t.mapStateOnServer=t.handleClientStateChange=t.convertReactPropstoHtmlAttributes=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1])||arguments[1];return!1===t?String(e):String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},f=function(e){var t=A(e,c.TAG_NAMES.TITLE),n=A(e,c.HELMET_PROPS.TITLE_TEMPLATE);if(n&&t)return n.replace(/%s/g,(function(){return t}));var r=A(e,c.HELMET_PROPS.DEFAULT_TITLE);return t||r||void 0},T=function(e){return A(e,c.HELMET_PROPS.ON_CHANGE_CLIENT_STATE)||function(){}},p=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return o({},e,t)}),{})},d=function(e,t){return t.filter((function(e){return void 0!==e[c.TAG_NAMES.BASE]})).map((function(e){return e[c.TAG_NAMES.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o=0;n--){var r=e[n];if(r.hasOwnProperty(t))return r[t]}return null},m=(l=Date.now(),function(e){var t=Date.now();t-l>16?(l=t,e(t)):setTimeout((function(){m(e)}),0)}),y=function(e){return clearTimeout(e)},h="undefined"!=typeof window?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||m:e.requestAnimationFrame||m,_="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||y:e.cancelAnimationFrame||y,S=function(e){return console&&"function"==typeof console.warn&&console.warn(e)},v=null,b=function(e,t){var n=e.baseTag,r=e.bodyAttributes,o=e.htmlAttributes,a=e.linkTags,i=e.metaTags,u=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,f=e.styleTags,T=e.title,p=e.titleAttributes;M(c.TAG_NAMES.BODY,r),M(c.TAG_NAMES.HTML,o),P(T,p);var d={baseTag:R(c.TAG_NAMES.BASE,n),linkTags:R(c.TAG_NAMES.LINK,a),metaTags:R(c.TAG_NAMES.META,i),noscriptTags:R(c.TAG_NAMES.NOSCRIPT,u),scriptTags:R(c.TAG_NAMES.SCRIPT,s),styleTags:R(c.TAG_NAMES.STYLE,f)},E={},A={};Object.keys(d).forEach((function(e){var t=d[e],n=t.newTags,r=t.oldTags;n.length&&(E[e]=n),r.length&&(A[e]=d[e].oldTags)})),t&&t(),l(e,E,A)},g=function(e){return Array.isArray(e)?e.join(""):e},P=function(e,t){void 0!==e&&document.title!==e&&(document.title=g(e)),M(c.TAG_NAMES.TITLE,t)},M=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute(c.HELMET_ATTRIBUTE),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),u=0;u=0;T--)n.removeAttribute(a[T]);o.length===a.length?n.removeAttribute(c.HELMET_ATTRIBUTE):n.getAttribute(c.HELMET_ATTRIBUTE)!==i.join(",")&&n.setAttribute(c.HELMET_ATTRIBUTE,i.join(","))}},R=function(e,t){var n=document.head||document.querySelector(c.TAG_NAMES.HEAD),r=n.querySelectorAll(e+"["+c.HELMET_ATTRIBUTE+"]"),o=Array.prototype.slice.call(r),a=[],i=void 0;return t&&t.length&&t.forEach((function(t){var n=document.createElement(e);for(var r in t)if(t.hasOwnProperty(r))if(r===c.TAG_PROPERTIES.INNER_HTML)n.innerHTML=t.innerHTML;else if(r===c.TAG_PROPERTIES.CSS_TEXT)n.styleSheet?n.styleSheet.cssText=t.cssText:n.appendChild(document.createTextNode(t.cssText));else{var u=void 0===t[r]?"":t[r];n.setAttribute(r,u)}n.setAttribute(c.HELMET_ATTRIBUTE,"true"),o.some((function(e,t){return i=t,n.isEqualNode(e)}))?o.splice(i,1):a.push(n)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),a.forEach((function(e){return n.appendChild(e)})),{oldTags:o,newTags:a}},O=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},w=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,n){return t[c.REACT_TAG_MAP[n]||n]=e[n],t}),t)},N=function(e,t,n){switch(e){case c.TAG_NAMES.TITLE:return{toComponent:function(){return e=t.title,n=t.titleAttributes,(r={key:e})[c.HELMET_ATTRIBUTE]=!0,o=w(n,r),[a.default.createElement(c.TAG_NAMES.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,r){var o=O(n),a=g(t);return o?"<"+e+" "+c.HELMET_ATTRIBUTE+'="true" '+o+">"+s(a,r)+"":"<"+e+" "+c.HELMET_ATTRIBUTE+'="true">'+s(a,r)+""}(e,t.title,t.titleAttributes,n)}};case c.ATTRIBUTE_NAMES.BODY:case c.ATTRIBUTE_NAMES.HTML:return{toComponent:function(){return w(t)},toString:function(){return O(t)}};default:return{toComponent:function(){return function(e,t){return t.map((function(t,n){var r,o=((r={key:n})[c.HELMET_ATTRIBUTE]=!0,r);return Object.keys(t).forEach((function(e){var n=c.REACT_TAG_MAP[e]||e;if(n===c.TAG_PROPERTIES.INNER_HTML||n===c.TAG_PROPERTIES.CSS_TEXT){var r=t.innerHTML||t.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=t[e]})),a.default.createElement(e,o)}))}(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!(e===c.TAG_PROPERTIES.INNER_HTML||e===c.TAG_PROPERTIES.CSS_TEXT)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+s(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===c.SELF_CLOSING_TAGS.indexOf(e);return t+"<"+e+" "+c.HELMET_ATTRIBUTE+'="true" '+o+(i?"/>":">"+a+"")}),"")}(e,t,n)}}}};t.convertReactPropstoHtmlAttributes=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,n){return t[c.HTML_TAG_MAP[n]||n]=e[n],t}),t)},t.handleClientStateChange=function(e){v&&_(v),e.defer?v=h((function(){b(e,(function(){v=null}))})):(b(e),v=null)},t.mapStateOnServer=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.linkTags,i=e.metaTags,u=e.noscriptTags,l=e.scriptTags,s=e.styleTags,f=e.title,T=void 0===f?"":f,p=e.titleAttributes;return{base:N(c.TAG_NAMES.BASE,t,r),bodyAttributes:N(c.ATTRIBUTE_NAMES.BODY,n,r),htmlAttributes:N(c.ATTRIBUTE_NAMES.HTML,o,r),link:N(c.TAG_NAMES.LINK,a,r),meta:N(c.TAG_NAMES.META,i,r),noscript:N(c.TAG_NAMES.NOSCRIPT,u,r),script:N(c.TAG_NAMES.SCRIPT,l,r),style:N(c.TAG_NAMES.STYLE,s,r),title:N(c.TAG_NAMES.TITLE,{title:T,titleAttributes:p},r)}},t.reducePropsToState=function(e){return{baseTag:d([c.TAG_PROPERTIES.HREF],e),bodyAttributes:p(c.ATTRIBUTE_NAMES.BODY,e),defer:A(e,c.HELMET_PROPS.DEFER),encode:A(e,c.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:p(c.ATTRIBUTE_NAMES.HTML,e),linkTags:E(c.TAG_NAMES.LINK,[c.TAG_PROPERTIES.REL,c.TAG_PROPERTIES.HREF],e),metaTags:E(c.TAG_NAMES.META,[c.TAG_PROPERTIES.NAME,c.TAG_PROPERTIES.CHARSET,c.TAG_PROPERTIES.HTTPEQUIV,c.TAG_PROPERTIES.PROPERTY,c.TAG_PROPERTIES.ITEM_PROP],e),noscriptTags:E(c.TAG_NAMES.NOSCRIPT,[c.TAG_PROPERTIES.INNER_HTML],e),onChangeClientState:T(e),scriptTags:E(c.TAG_NAMES.SCRIPT,[c.TAG_PROPERTIES.SRC,c.TAG_PROPERTIES.INNER_HTML],e),styleTags:E(c.TAG_NAMES.STYLE,[c.TAG_PROPERTIES.CSS_TEXT],e),title:f(e),titleAttributes:p(c.ATTRIBUTE_NAMES.TITLE,e)}},t.requestAnimationFrame=h,t.warn=S}).call(this,n("yLpj"))},vrFN:function(e,t,n){"use strict";var r=n("ff/Y"),o=n("q1tI"),a=n.n(o),i=n("TJpk"),c=n.n(i),u=n("Wbzz");function l(e){var t=e.description,n=e.lang,o=e.meta,i=e.keywords,l=e.title;return a.a.createElement(u.StaticQuery,{query:s,render:function(e){var r=t||e.site.siteMetadata.description;return a.a.createElement(c.a,{htmlAttributes:{lang:n},title:l,titleTemplate:"%s | "+e.site.siteMetadata.title,meta:[{name:"description",content:r},{property:"og:title",content:l},{property:"og:description",content:r},{property:"og:type",content:"website"},{name:"twitter:card",content:"summary"},{name:"twitter:creator",content:e.site.siteMetadata.author},{name:"twitter:title",content:l},{name:"twitter:description",content:r}].concat(i.length>0?{name:"keywords",content:i.join(", ")}:[]).concat(o)})},data:r})}l.defaultProps={lang:"en",meta:[],keywords:[]},t.a=l;var s="1025518380"},yLpj:function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n}}]); +//# sourceMappingURL=09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js.map \ No newline at end of file diff --git a/09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js.map b/09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js.map new file mode 100644 index 0000000..5940dfb --- /dev/null +++ b/09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/exenv/index.js","webpack:///./node_modules/react-side-effect/lib/index.js","webpack:///./src/components/Header/Header.js","webpack:///./src/components/Header/index.js","webpack:///./src/components/layout.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/es6.date.to-string.js","webpack:///./node_modules/shallowequal/index.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/es6.object.define-property.js","webpack:///./node_modules/react-helmet/lib/Helmet.js","webpack:///./src/components/Header/Header.module.css","webpack:///./node_modules/react-fast-compare/index.js","webpack:///./node_modules/react-helmet/lib/HelmetConstants.js","webpack:///./node_modules/react-helmet/lib/HelmetUtils.js","webpack:///./src/components/seo.js","webpack:///(webpack)/buildin/global.js"],"names":["canUseDOM","window","document","createElement","ExecutionEnvironment","canUseWorkers","Worker","canUseEventListeners","addEventListener","attachEvent","canUseViewport","screen","_interopDefault","ex","React","React__default","shallowEqual","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","self","call","ReferenceError","module","exports","reducePropsToState","handleStateChangeOnClient","mapStateOnServer","Error","WrappedComponent","mountedInstances","state","emitChange","map","props","SideEffect","_Component","this","apply","arguments","subClass","superClass","prototype","Object","create","constructor","value","enumerable","writable","configurable","setPrototypeOf","__proto__","_inherits","peek","rewind","recordedState","undefined","shouldComponentUpdate","nextProps","componentWillMount","push","componentDidUpdate","componentWillUnmount","index","indexOf","splice","render","Component","displayName","name","getDisplayName","Header","toggleNav","setState","showNav","className","headerStyles","header","logo__link","to","siteTitle","toggle","onClick","nav","nav__mobile","nav__item","nav__link","nav__desktop","defaultProps","Layout","children","query","data","site","siteMetadata","title","style","margin","width","paddingTop","DateProto","Date","$toString","getTime","NaN","objA","objB","compare","compareContext","ret","keysA","keys","keysB","length","bHasOwnProperty","hasOwnProperty","bind","idx","key","valueA","valueB","$export","S","F","defineProperty","f","__esModule","Helmet","_extends","assign","target","i","source","_createClass","defineProperties","descriptor","protoProps","staticProps","_react2","_interopRequireDefault","_propTypes2","_reactSideEffect2","_reactFastCompare2","_HelmetUtils","_HelmetConstants","obj","_objectWithoutProperties","_class","_temp","HelmetSideEffects","handleClientStateChange","HelmetExport","_React$Component","HelmetWrapper","mapNestedChildrenToProps","child","nestedChildren","type","TAG_NAMES","SCRIPT","NOSCRIPT","innerHTML","STYLE","cssText","flattenArrayTypeChildren","_ref","_extends2","arrayTypeChildren","newChildProps","concat","mapObjectTypeChildren","_ref2","_extends3","_extends4","newProps","TITLE","titleAttributes","BODY","bodyAttributes","HTML","htmlAttributes","mapArrayTypeChildrenToProps","newFlattenedProps","forEach","arrayChildName","_extends5","warnOnInvalidChildren","mapChildrenToProps","_this2","Children","_child$props","childProps","convertReactPropstoHtmlAttributes","LINK","META","_props","set","propTypes","base","object","oneOfType","arrayOf","node","defaultTitle","string","defer","bool","encodeSpecialCharacters","link","meta","noscript","onChangeClientState","func","script","titleTemplate","mappedState","baseTag","linkTags","metaTags","noscriptTags","scriptTags","styleTags","renderStatic","isArray","Array","keyList","hasProp","hasElementType","Element","a","b","equal","arrA","arrB","dateA","dateB","regexpA","RegExp","regexpB","toString","$$typeof","error","message","match","number","console","warn","ATTRIBUTE_NAMES","BASE","HEAD","REACT_TAG_MAP","VALID_TAG_NAMES","TAG_PROPERTIES","CHARSET","CSS_TEXT","HREF","HTTPEQUIV","INNER_HTML","ITEM_PROP","NAME","PROPERTY","REL","SRC","accesskey","charset","contenteditable","contextmenu","itemprop","tabindex","HELMET_PROPS","DEFAULT_TITLE","DEFER","ENCODE_SPECIAL_CHARACTERS","ON_CHANGE_CLIENT_STATE","TITLE_TEMPLATE","HTML_TAG_MAP","reduce","SELF_CLOSING_TAGS","HELMET_ATTRIBUTE","requestAnimationFrame","_typeof","Symbol","iterator","_objectAssign2","clock","str","encode","String","replace","getTitleFromPropsList","propsList","innermostTitle","getInnermostProperty","innermostTemplate","innermostDefaultTitle","getOnChangeClientState","getAttributesFromPropsList","tagType","filter","tagAttrs","current","getBaseTagFromPropsList","primaryAttributes","reverse","innermostBaseTag","tag","lowerCaseAttributeKey","toLowerCase","getTagsFromPropsList","tagName","approvedSeenTags","approvedTags","instanceTags","instanceSeenTags","primaryAttributeKey","attributeKey","tagUnion","property","rafPolyfill","now","callback","currentTime","setTimeout","cafPolyfill","id","clearTimeout","webkitRequestAnimationFrame","mozRequestAnimationFrame","global","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msg","_helmetCallback","commitTagChanges","newState","cb","updateAttributes","updateTitle","tagUpdates","updateTags","addedTags","removedTags","_tagUpdates$tagType","newTags","oldTags","flattenArray","possibleArray","join","attributes","elementTag","getElementsByTagName","helmetAttributeString","getAttribute","helmetAttributes","split","attributesToRemove","attributeKeys","attribute","setAttribute","indexToSave","_i","removeAttribute","tags","headElement","head","querySelector","tagNodes","querySelectorAll","slice","indexToDelete","newElement","styleSheet","appendChild","createTextNode","some","existingTag","isEqualNode","parentNode","removeChild","generateElementAttributesAsString","attr","convertElementAttributestoReactProps","initProps","getMethodsForTag","toComponent","_initProps","attributeString","flattenedTitle","generateTitleAsString","_mappedTag","mappedTag","mappedAttribute","content","dangerouslySetInnerHTML","__html","generateTagsAsReactComponent","attributeHtml","tagContent","isSelfClosing","generateTagsAsString","initAttributes","_ref$title","SEO","description","lang","keywords","detailsQuery","metaDescription","author","g","Function","e"],"mappings":"gFAAA,OAOA,WACE,aAEA,IAAIA,IAAiC,oBAAXC,SAA0BA,OAAOC,WAAYD,OAAOC,SAASC,eACnFC,EAAuB,CACzBJ,UAAWA,EACXK,cAAiC,oBAAXC,OACtBC,qBAAsBP,MAAgBC,OAAOO,mBAAoBP,OAAOQ,aACxEC,eAAgBV,KAAeC,OAAOU,aAMrC,KAFD,aACE,OAAOP,GACR,8BAdL,I,oCCKA,SAASQ,EAAgBC,GACvB,OAAOA,GAAoB,iBAAPA,GAAmB,YAAaA,EAAKA,EAAY,QAAIA,EAX3E,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAMR,IAAIC,EAAQ,EAAQ,QAEhBC,EAAiBH,EAAgBE,GAEjCV,EAAuBQ,EAAgB,EAAQ,SAE/CI,EAAeJ,EAAgB,EAAQ,SAE3C,SAASK,EAAgBC,EAAUC,GACjC,KAAMD,aAAoBC,GACxB,MAAM,IAAIC,UAAU,qCAIxB,SAASC,EAA2BC,EAAMC,GACxC,IAAKD,EACH,MAAM,IAAIE,eAAe,6DAG3B,OAAOD,GAAyB,iBAATA,GAAqC,mBAATA,EAA8BD,EAAPC,EAkH5EE,EAAOC,QA/FP,SAAwBC,EAAoBC,EAA2BC,GACrE,GAAkC,mBAAvBF,EACT,MAAM,IAAIG,MAAM,iDAGlB,GAAyC,mBAA9BF,EACT,MAAM,IAAIE,MAAM,wDAGlB,QAAgC,IAArBD,GAAgE,mBAArBA,EACpD,MAAM,IAAIC,MAAM,mEAOlB,OAAO,SAAcC,GACnB,GAAgC,mBAArBA,EACT,MAAM,IAAID,MAAM,sDAGlB,IAAIE,EAAmB,GACnBC,OAAQ,EAEZ,SAASC,IACPD,EAAQN,EAAmBK,EAAiBG,KAAI,SAAUjB,GACxD,OAAOA,EAASkB,UAGdC,EAAWrC,UACb4B,EAA0BK,GACjBJ,IACTI,EAAQJ,EAAiBI,IAI7B,IAAII,EAAa,SAAUC,GAGzB,SAASD,IAGP,OAFApB,EAAgBsB,KAAMF,GAEfhB,EAA2BkB,KAAMD,EAAWE,MAAMD,KAAME,YA2CjE,OAtGN,SAAmBC,EAAUC,GAC3B,GAA0B,mBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAIvB,UAAU,kEAAoEuB,GAG1FD,EAASE,UAAYC,OAAOC,OAAOH,GAAcA,EAAWC,UAAW,CACrEG,YAAa,CACXC,MAAON,EACPO,YAAY,EACZC,UAAU,EACVC,cAAc,KAGdR,IAAYE,OAAOO,eAAiBP,OAAOO,eAAeV,EAAUC,GAAcD,EAASW,UAAYV,GAyCvGW,CAAUjB,EAAYC,GAStBD,EAAWkB,KAAO,WAChB,OAAOtB,GAITI,EAAWmB,OAAS,WAClB,GAAInB,EAAWrC,UACb,MAAM,IAAI8B,MAAM,oFAGlB,IAAI2B,EAAgBxB,EAGpB,OAFAA,OAAQyB,EACR1B,EAAmB,GACZyB,GAGTpB,EAAWO,UAAUe,sBAAwB,SAA+BC,GAC1E,OAAQ5C,EAAa4C,EAAWrB,KAAKH,QAGvCC,EAAWO,UAAUiB,mBAAqB,WACxC7B,EAAiB8B,KAAKvB,MACtBL,KAGFG,EAAWO,UAAUmB,mBAAqB,WACxC7B,KAGFG,EAAWO,UAAUoB,qBAAuB,WAC1C,IAAIC,EAAQjC,EAAiBkC,QAAQ3B,MACrCP,EAAiBmC,OAAOF,EAAO,GAC/B/B,KAGFG,EAAWO,UAAUwB,OAAS,WAC5B,OAAOrD,EAAeZ,cAAc4B,EAAkBQ,KAAKH,QAGtDC,EAjDQ,CAkDfvB,EAAMuD,WAIR,OAFAhC,EAAWiC,YAAc,cA5E3B,SAAwBvC,GACtB,OAAOA,EAAiBuC,aAAevC,EAAiBwC,MAAQ,YA2EvBC,CAAezC,GAAoB,IAC5EM,EAAWrC,UAAYI,EAAqBJ,UACrCqC,K,4GC5ILoC,E,oBACJ,WAAYrC,GAAQ,IAAD,SACjB,cAAMA,IAAN,MAKFsC,UAAY,WACV,EAAKC,SAAS,CACZC,SAAU,EAAK3C,MAAM2C,WANvB,EAAK3C,MAAQ,CACX2C,SAAS,GAHM,E,0GAYnBR,OAAA,WAAU,IACAQ,EAAYrC,KAAKN,MAAjB2C,QACR,OACE,4BAAQC,UAAWC,IAAaC,QAC9B,6BACE,kBAAC,OAAD,CAAMF,UAAWC,IAAaE,WAAYC,GAAG,KAC1C1C,KAAKH,MAAM8C,YAGhB,yBAAKL,UAAWC,IAAaK,OAAQC,QAAS7C,KAAKmC,WAAnD,KAIA,yBAAKG,UAAWC,IAAaO,KAC1BT,GACC,wBAAIC,UAAWC,IAAaQ,aAC1B,wBAAIT,UAAWC,IAAaS,WAC1B,kBAAC,OAAD,CAAMN,GAAG,IAAIJ,UAAWC,IAAaU,WAArC,SAIF,wBAAIX,UAAWC,IAAaS,WAC1B,kBAAC,OAAD,CAAMN,GAAG,QAAQJ,UAAWC,IAAaU,WAAzC,SAIF,wBAAIX,UAAWC,IAAaS,WAC1B,kBAAC,OAAD,CAAMN,GAAG,aAAaJ,UAAWC,IAAaU,WAA9C,eAMN,yBAAKX,UAAWC,IAAaW,cAC3B,kBAAC,OAAD,CAAMR,GAAG,IAAIJ,UAAWC,IAAaU,WAArC,QAGA,kBAAC,OAAD,CAAMP,GAAG,QAAQJ,UAAWC,IAAaU,WAAzC,QAGA,kBAAC,OAAD,CAAMP,GAAG,aAAaJ,UAAWC,IAAaU,WAA9C,iB,GArDS1E,IAAMuD,WAmE3BI,EAAOiB,aAAe,CACpBR,UAAW,IAGET,IC1EAA,ED0EAA,E,UEpCAkB,IAjCA,SAAC,GAAD,IAAGC,EAAH,EAAGA,SAAH,OACb,kBAAC,cAAD,CACEC,MAAK,YASLzB,OAAQ,SAAA0B,GAAI,OACV,oCACE,kBAAC,EAAD,CAAQZ,UAAWY,EAAKC,KAAKC,aAAaC,QAE1C,yBACEC,MAAO,CACLC,OAAQ,SACRC,MAAO,OACPC,WAAY,IAGbT,KArBT,W,qBCRF,IAAIU,EAAYC,KAAK3D,UAGjB4D,EAAYF,EAAmB,SAC/BG,EAAUH,EAAUG,QACpB,IAAIF,KAAKG,KAAO,IAJD,gBAKjB,EAAQ,OAAR,CAAuBJ,EAJT,YAI+B,WAC3C,IAAItD,EAAQyD,EAAQlF,KAAKgB,MAEzB,OAAOS,GAAUA,EAAQwD,EAAUjF,KAAKgB,MARzB,mB,qBCDnB,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAGRd,EAAOC,QAAU,SAAsBiF,EAAMC,EAAMC,EAASC,GAC1D,IAAIC,EAAMF,EAAUA,EAAQtF,KAAKuF,EAAgBH,EAAMC,QAAQ,EAE/D,QAAY,IAARG,EACF,QAASA,EAGX,GAAIJ,IAASC,EACX,OAAO,EAGT,GAAoB,iBAATD,IAAsBA,GAAwB,iBAATC,IAAsBA,EACpE,OAAO,EAGT,IAAII,EAAQnE,OAAOoE,KAAKN,GACpBO,EAAQrE,OAAOoE,KAAKL,GAExB,GAAII,EAAMG,SAAWD,EAAMC,OACzB,OAAO,EAKT,IAFA,IAAIC,EAAkBvE,OAAOD,UAAUyE,eAAeC,KAAKV,GAElDW,EAAM,EAAGA,EAAMP,EAAMG,OAAQI,IAAO,CAC3C,IAAIC,EAAMR,EAAMO,GAEhB,IAAKH,EAAgBI,GACnB,OAAO,EAGT,IAAIC,EAASd,EAAKa,GACdE,EAASd,EAAKY,GAGlB,IAAY,KAFZT,EAAMF,EAAUA,EAAQtF,KAAKuF,EAAgBW,EAAQC,EAAQF,QAAO,SAEvC,IAART,GAAkBU,IAAWC,EAChD,OAAO,EAIX,OAAO,I,wICnDT,IAAIC,EAAU,EAAQ,QAEtBA,EAAQA,EAAQC,EAAID,EAAQE,GAAK,EAAQ,QAAmB,SAAU,CAAEC,eAAgB,EAAQ,QAAgBC,K,qBCFhH,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAERrG,EAAQsG,YAAa,EACrBtG,EAAQuG,YAASvE,EAEjB,IAAIwE,EAAWrF,OAAOsF,QAAU,SAAUC,GACxC,IAAK,IAAIC,EAAI,EAAGA,EAAI5F,UAAU0E,OAAQkB,IAAK,CACzC,IAAIC,EAAS7F,UAAU4F,GAEvB,IAAK,IAAIb,KAAOc,EACVzF,OAAOD,UAAUyE,eAAe9F,KAAK+G,EAAQd,KAC/CY,EAAOZ,GAAOc,EAAOd,IAK3B,OAAOY,GAGLG,EAAe,WACjB,SAASC,EAAiBJ,EAAQhG,GAChC,IAAK,IAAIiG,EAAI,EAAGA,EAAIjG,EAAM+E,OAAQkB,IAAK,CACrC,IAAII,EAAarG,EAAMiG,GACvBI,EAAWxF,WAAawF,EAAWxF,aAAc,EACjDwF,EAAWtF,cAAe,EACtB,UAAWsF,IAAYA,EAAWvF,UAAW,GACjDL,OAAOiF,eAAeM,EAAQK,EAAWjB,IAAKiB,IAIlD,OAAO,SAAUtH,EAAauH,EAAYC,GAGxC,OAFID,GAAYF,EAAiBrH,EAAYyB,UAAW8F,GACpDC,GAAaH,EAAiBrH,EAAawH,GACxCxH,GAdQ,GAoBfyH,EAAUC,EAFD,EAAQ,SAMjBC,EAAcD,EAFD,EAAQ,SAMrBE,EAAoBF,EAFD,EAAQ,SAM3BG,EAAqBH,EAFD,EAAQ,SAI5BI,EAAe,EAAQ,QAEvBC,EAAmB,EAAQ,QAE/B,SAASL,EAAuBM,GAC9B,OAAOA,GAAOA,EAAInB,WAAamB,EAAM,CACnC,QAAWA,GAIf,SAASC,EAAyBD,EAAKlC,GACrC,IAAImB,EAAS,GAEb,IAAK,IAAIC,KAAKc,EACRlC,EAAK/C,QAAQmE,IAAM,GAClBxF,OAAOD,UAAUyE,eAAe9F,KAAK4H,EAAKd,KAC/CD,EAAOC,GAAKc,EAAId,IAGlB,OAAOD,EAGT,SAASnH,EAAgBC,EAAUC,GACjC,KAAMD,aAAoBC,GACxB,MAAM,IAAIC,UAAU,qCAIxB,SAASC,EAA2BC,EAAMC,GACxC,IAAKD,EACH,MAAM,IAAIE,eAAe,6DAG3B,OAAOD,GAAyB,iBAATA,GAAqC,mBAATA,EAA8BD,EAAPC,EAmB5E,IAA6B8C,EACvBgF,EAAQC,EAoPVC,GAAoB,EAAIR,EAA2B,SAAGE,EAAatH,mBAAoBsH,EAAaO,wBAAyBP,EAAapH,iBAAtH,EAJJ,WAClB,OAAO,QAIL4H,GAtPyBpF,EAsPHkF,EAnPjBD,EAAQD,EAAS,SAAUK,GAGhC,SAASC,IAGP,OAFA1I,EAAgBsB,KAAMoH,GAEftI,EAA2BkB,KAAMmH,EAAiBlH,MAAMD,KAAME,YA2LvE,OApNJ,SAAmBC,EAAUC,GAC3B,GAA0B,mBAAfA,GAA4C,OAAfA,EACtC,MAAM,IAAIvB,UAAU,kEAAoEuB,GAG1FD,EAASE,UAAYC,OAAOC,OAAOH,GAAcA,EAAWC,UAAW,CACrEG,YAAa,CACXC,MAAON,EACPO,YAAY,EACZC,UAAU,EACVC,cAAc,KAGdR,IAAYE,OAAOO,eAAiBP,OAAOO,eAAeV,EAAUC,GAAcD,EAASW,UAAYV,GAOzGW,CAAUqG,EAAeD,GAQzBC,EAAc/G,UAAUe,sBAAwB,SAA+BC,GAC7E,QAAQ,EAAIoF,EAA4B,SAAGzG,KAAKH,MAAOwB,IAGzD+F,EAAc/G,UAAUgH,yBAA2B,SAAkCC,EAAOC,GAC1F,IAAKA,EACH,OAAO,KAGT,OAAQD,EAAME,MACZ,KAAKb,EAAiBc,UAAUC,OAChC,KAAKf,EAAiBc,UAAUE,SAC9B,MAAO,CACLC,UAAWL,GAGf,KAAKZ,EAAiBc,UAAUI,MAC9B,MAAO,CACLC,QAASP,GAIf,MAAM,IAAIhI,MAAM,IAAM+H,EAAME,KAAO,uGAGrCJ,EAAc/G,UAAU0H,yBAA2B,SAAkCC,GACnF,IAAIC,EAEAX,EAAQU,EAAKV,MACbY,EAAoBF,EAAKE,kBACzBC,EAAgBH,EAAKG,cACrBZ,EAAiBS,EAAKT,eAC1B,OAAO5B,EAAS,GAAIuC,IAAoBD,EAAY,IAAcX,EAAME,MAAQ,GAAGY,OAAOF,EAAkBZ,EAAME,OAAS,GAAI,CAAC7B,EAAS,GAAIwC,EAAenI,KAAKqH,yBAAyBC,EAAOC,MAAoBU,KAGvNb,EAAc/G,UAAUgI,sBAAwB,SAA+BC,GAC7E,IAAIC,EAAWC,EAEXlB,EAAQgB,EAAMhB,MACdmB,EAAWH,EAAMG,SACjBN,EAAgBG,EAAMH,cACtBZ,EAAiBe,EAAMf,eAE3B,OAAQD,EAAME,MACZ,KAAKb,EAAiBc,UAAUiB,MAC9B,OAAO/C,EAAS,GAAI8C,IAAWF,EAAY,IAAcjB,EAAME,MAAQD,EAAgBgB,EAAUI,gBAAkBhD,EAAS,GAAIwC,GAAgBI,IAElJ,KAAK5B,EAAiBc,UAAUmB,KAC9B,OAAOjD,EAAS,GAAI8C,EAAU,CAC5BI,eAAgBlD,EAAS,GAAIwC,KAGjC,KAAKxB,EAAiBc,UAAUqB,KAC9B,OAAOnD,EAAS,GAAI8C,EAAU,CAC5BM,eAAgBpD,EAAS,GAAIwC,KAInC,OAAOxC,EAAS,GAAI8C,IAAWD,EAAY,IAAclB,EAAME,MAAQ7B,EAAS,GAAIwC,GAAgBK,KAGtGpB,EAAc/G,UAAU2I,4BAA8B,SAAqCd,EAAmBO,GAC5G,IAAIQ,EAAoBtD,EAAS,GAAI8C,GAOrC,OALAnI,OAAOoE,KAAKwD,GAAmBgB,SAAQ,SAAUC,GAC/C,IAAIC,EAEJH,EAAoBtD,EAAS,GAAIsD,IAAoBG,EAAY,IAAcD,GAAkBjB,EAAkBiB,GAAiBC,OAE/HH,GAGT7B,EAAc/G,UAAUgJ,sBAAwB,SAA+B/B,EAAOC,GAmBpF,OAAO,GAGTH,EAAc/G,UAAUiJ,mBAAqB,SAA4BjG,EAAUoF,GACjF,IAAIc,EAASvJ,KAETkI,EAAoB,GAyCxB,OAvCA7B,EAAiB,QAAEmD,SAASN,QAAQ7F,GAAU,SAAUiE,GACtD,GAAKA,GAAUA,EAAMzH,MAArB,CAIA,IAAI4J,EAAenC,EAAMzH,MACrB0H,EAAiBkC,EAAapG,SAC9BqG,EAAa7C,EAAyB4C,EAAc,CAAC,aAErDtB,GAAgB,EAAIzB,EAAaiD,mCAAmCD,GAIxE,OAFAH,EAAOF,sBAAsB/B,EAAOC,GAE5BD,EAAME,MACZ,KAAKb,EAAiBc,UAAUmC,KAChC,KAAKjD,EAAiBc,UAAUoC,KAChC,KAAKlD,EAAiBc,UAAUE,SAChC,KAAKhB,EAAiBc,UAAUC,OAChC,KAAKf,EAAiBc,UAAUI,MAC9BK,EAAoBqB,EAAOxB,yBAAyB,CAClDT,MAAOA,EACPY,kBAAmBA,EACnBC,cAAeA,EACfZ,eAAgBA,IAElB,MAEF,QACEkB,EAAWc,EAAOlB,sBAAsB,CACtCf,MAAOA,EACPmB,SAAUA,EACVN,cAAeA,EACfZ,eAAgBA,SAMxBkB,EAAWzI,KAAKgJ,4BAA4Bd,EAAmBO,IAIjErB,EAAc/G,UAAUwB,OAAS,WAC/B,IAAIiI,EAAS9J,KAAKH,MACdwD,EAAWyG,EAAOzG,SAClBxD,EAAQgH,EAAyBiD,EAAQ,CAAC,aAE1CrB,EAAW9C,EAAS,GAAI9F,GAM5B,OAJIwD,IACFoF,EAAWzI,KAAKsJ,mBAAmBjG,EAAUoF,IAGxCpC,EAAiB,QAAEzI,cAAckE,EAAW2G,IAGrDzC,EAAaoB,EAAe,KAAM,CAAC,CACjCnC,IAAK,YAuBL8E,IAAK,SAAatM,GAChBqE,EAAUrE,UAAYA,MAInB2J,EAjMe,CAkMtBf,EAAiB,QAAEvE,WAAYgF,EAAOkD,UAAY,CAClDC,KAAM1D,EAAqB,QAAE2D,OAC7BrB,eAAgBtC,EAAqB,QAAE2D,OACvC7G,SAAUkD,EAAqB,QAAE4D,UAAU,CAAC5D,EAAqB,QAAE6D,QAAQ7D,EAAqB,QAAE8D,MAAO9D,EAAqB,QAAE8D,OAChIC,aAAc/D,EAAqB,QAAEgE,OACrCC,MAAOjE,EAAqB,QAAEkE,KAC9BC,wBAAyBnE,EAAqB,QAAEkE,KAChD1B,eAAgBxC,EAAqB,QAAE2D,OACvCS,KAAMpE,EAAqB,QAAE6D,QAAQ7D,EAAqB,QAAE2D,QAC5DU,KAAMrE,EAAqB,QAAE6D,QAAQ7D,EAAqB,QAAE2D,QAC5DW,SAAUtE,EAAqB,QAAE6D,QAAQ7D,EAAqB,QAAE2D,QAChEY,oBAAqBvE,EAAqB,QAAEwE,KAC5CC,OAAQzE,EAAqB,QAAE6D,QAAQ7D,EAAqB,QAAE2D,QAC9DvG,MAAO4C,EAAqB,QAAE6D,QAAQ7D,EAAqB,QAAE2D,QAC7DxG,MAAO6C,EAAqB,QAAEgE,OAC9B5B,gBAAiBpC,EAAqB,QAAE2D,OACxCe,cAAe1E,EAAqB,QAAEgE,QACrCzD,EAAO3D,aAAe,CACvBqH,OAAO,EACPE,yBAAyB,GACxB5D,EAAO9F,KAAOc,EAAUd,KAAM8F,EAAO7F,OAAS,WAC/C,IAAIiK,EAAcpJ,EAAUb,SAmB5B,OAjBKiK,IAEHA,GAAc,EAAIxE,EAAapH,kBAAkB,CAC/C6L,QAAS,GACTtC,eAAgB,GAChB6B,yBAAyB,EACzB3B,eAAgB,GAChBqC,SAAU,GACVC,SAAU,GACVC,aAAc,GACdC,WAAY,GACZC,UAAW,GACX9H,MAAO,GACPiF,gBAAiB,MAIduC,GACNnE,GASLG,EAAauE,aAAevE,EAAajG,OACzC9B,EAAQuG,OAASwB,EACjB/H,EAAiB,QAAI+H,G,qBCvXrBhI,EAAOC,QAAU,CAAC,OAAS,+BAA+B,WAAa,mCAAmC,OAAS,+BAA+B,IAAM,4BAA4B,YAAc,oCAAoC,aAAe,qCAAqC,UAAY,kCAAkC,UAAY,oC,kCCCpV,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,IAAIuM,EAAUC,MAAMD,QAChBE,EAAUtL,OAAOoE,KACjBmH,EAAUvL,OAAOD,UAAUyE,eAC3BgH,EAAoC,oBAAZC,QAsE5B7M,EAAOC,QAAU,SAAuB6M,EAAGC,GACzC,IACE,OAtEJ,SAASC,EAAMF,EAAGC,GAEhB,GAAID,IAAMC,EAAG,OAAO,EAEpB,GAAID,GAAKC,GAAiB,iBAALD,GAA6B,iBAALC,EAAe,CAC1D,IAEInG,EACAlB,EACAK,EAJAkH,EAAOT,EAAQM,GACfI,EAAOV,EAAQO,GAKnB,GAAIE,GAAQC,EAAM,CAEhB,IADAxH,EAASoH,EAAEpH,SACGqH,EAAErH,OAAQ,OAAO,EAE/B,IAAKkB,EAAIlB,EAAgB,GAARkB,KACf,IAAKoG,EAAMF,EAAElG,GAAImG,EAAEnG,IAAK,OAAO,EAGjC,OAAO,EAGT,GAAIqG,GAAQC,EAAM,OAAO,EACzB,IAAIC,EAAQL,aAAahI,KACrBsI,EAAQL,aAAajI,KACzB,GAAIqI,GAASC,EAAO,OAAO,EAC3B,GAAID,GAASC,EAAO,OAAON,EAAE9H,WAAa+H,EAAE/H,UAC5C,IAAIqI,EAAUP,aAAaQ,OACvBC,EAAUR,aAAaO,OAC3B,GAAID,GAAWE,EAAS,OAAO,EAC/B,GAAIF,GAAWE,EAAS,OAAOT,EAAEU,YAAcT,EAAES,WACjD,IAAIhI,EAAOkH,EAAQI,GAEnB,IADApH,EAASF,EAAKE,UACCgH,EAAQK,GAAGrH,OAAQ,OAAO,EAEzC,IAAKkB,EAAIlB,EAAgB,GAARkB,KACf,IAAK+F,EAAQ7M,KAAKiN,EAAGvH,EAAKoB,IAAK,OAAO,EAMxC,GAAIgG,GAAkBE,aAAaD,SAAWE,aAAaF,QAAS,OAAOC,IAAMC,EAEjF,IAAKnG,EAAIlB,EAAgB,GAARkB,KAGf,KAAY,YAFZb,EAAMP,EAAKoB,KAEakG,EAAEW,UAQnBT,EAAMF,EAAE/G,GAAMgH,EAAEhH,KAAO,OAAO,EAMvC,OAAO,EAGT,OAAO+G,GAAMA,GAAKC,GAAMA,EAMfC,CAAMF,EAAGC,GAChB,MAAOW,GACP,GAAIA,EAAMC,SAAWD,EAAMC,QAAQC,MAAM,sBAAyC,aAAlBF,EAAMG,OAOpE,OADAC,QAAQC,KAAK,mEAAoEL,EAAM5K,KAAM4K,EAAMC,UAC5F,EAIT,MAAMD,K,+NC9GV,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAERzN,EAAQsG,YAAa,EACCtG,EAAQ+N,gBAAkB,CAC9CtE,KAAM,iBACNE,KAAM,iBACNJ,MAAO,mBAHT,IAKIjB,EAAYtI,EAAQsI,UAAY,CAClC0F,KAAM,OACNvE,KAAM,OACNwE,KAAM,OACNtE,KAAM,OACNc,KAAM,OACNC,KAAM,OACNlC,SAAU,WACVD,OAAQ,SACRG,MAAO,QACPa,MAAO,SAiBL2E,GAfkBlO,EAAQmO,gBAAkBhN,OAAOoE,KAAK+C,GAAW7H,KAAI,SAAUoC,GACnF,OAAOyF,EAAUzF,MAEE7C,EAAQoO,eAAiB,CAC5CC,QAAS,UACTC,SAAU,UACVC,KAAM,OACNC,UAAW,aACXC,WAAY,YACZC,UAAW,WACXC,KAAM,OACNC,SAAU,WACVC,IAAK,MACLC,IAAK,OAEa9O,EAAQkO,cAAgB,CAC1Ca,UAAW,YACXC,QAAS,UACT,MAAS,YACTC,gBAAiB,kBACjBC,YAAa,cACb,aAAc,YACdC,SAAU,WACVC,SAAU,aAEOpP,EAAQqP,aAAe,CACxCC,cAAe,eACfC,MAAO,QACPC,0BAA2B,0BAC3BC,uBAAwB,sBACxBC,eAAgB,iBAEC1P,EAAQ2P,aAAexO,OAAOoE,KAAK2I,GAAe0B,QAAO,SAAUnI,EAAK3B,GAEzF,OADA2B,EAAIyG,EAAcpI,IAAQA,EACnB2B,IACN,IACqBzH,EAAQ6P,kBAAoB,CAACvH,EAAUE,SAAUF,EAAUC,OAAQD,EAAUI,OAC9E1I,EAAQ8P,iBAAmB,qB,sBCnElD,cAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER,EAAQ,QAER9P,EAAQsG,YAAa,EACrBtG,EAAQ8N,KAAO9N,EAAQ+P,sBAAwB/P,EAAQC,mBAAqBD,EAAQG,iBAAmBH,EAAQ8H,wBAA0B9H,EAAQwK,uCAAoCxI,EAErL,IAAIgO,EAA4B,mBAAXC,QAAoD,iBAApBA,OAAOC,SAAwB,SAAUzI,GAC5F,cAAcA,GACZ,SAAUA,GACZ,OAAOA,GAAyB,mBAAXwI,QAAyBxI,EAAIpG,cAAgB4O,QAAUxI,IAAQwI,OAAO/O,UAAY,gBAAkBuG,GAGvHjB,EAAWrF,OAAOsF,QAAU,SAAUC,GACxC,IAAK,IAAIC,EAAI,EAAGA,EAAI5F,UAAU0E,OAAQkB,IAAK,CACzC,IAAIC,EAAS7F,UAAU4F,GAEvB,IAAK,IAAIb,KAAOc,EACVzF,OAAOD,UAAUyE,eAAe9F,KAAK+G,EAAQd,KAC/CY,EAAOZ,GAAOc,EAAOd,IAK3B,OAAOY,GAKLQ,EAAUC,EAFD,EAAQ,SAMjBgJ,EAAiBhJ,EAFD,EAAQ,SAIxBK,EAAmB,EAAQ,QAE/B,SAASL,EAAuBM,GAC9B,OAAOA,GAAOA,EAAInB,WAAamB,EAAM,CACnC,QAAWA,GAIf,IAoKM2I,EApKF7E,EAA0B,SAAiC8E,GAC7D,IAAIC,IAASvP,UAAU0E,OAAS,QAAsBzD,IAAjBjB,UAAU,KAAmBA,UAAU,GAE5E,OAAe,IAAXuP,EACKC,OAAOF,GAGTE,OAAOF,GAAKG,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,UAAUA,QAAQ,KAAM,WAG1HC,EAAwB,SAA+BC,GACzD,IAAIC,EAAiBC,EAAqBF,EAAWlJ,EAAiBc,UAAUiB,OAC5EsH,EAAoBD,EAAqBF,EAAWlJ,EAAiB6H,aAAaK,gBAEtF,GAAImB,GAAqBF,EAEvB,OAAOE,EAAkBL,QAAQ,OAAO,WACtC,OAAOG,KAIX,IAAIG,EAAwBF,EAAqBF,EAAWlJ,EAAiB6H,aAAaC,eAC1F,OAAOqB,GAAkBG,QAAyB9O,GAGhD+O,EAAyB,SAAgCL,GAC3D,OAAOE,EAAqBF,EAAWlJ,EAAiB6H,aAAaI,yBAA2B,cAG9FuB,EAA6B,SAAoCC,EAASP,GAC5E,OAAOA,EAAUQ,QAAO,SAAUxQ,GAChC,YAAiC,IAAnBA,EAAMuQ,MACnBxQ,KAAI,SAAUC,GACf,OAAOA,EAAMuQ,MACZrB,QAAO,SAAUuB,EAAUC,GAC5B,OAAO5K,EAAS,GAAI2K,EAAUC,KAC7B,KAGDC,EAA0B,SAAiCC,EAAmBZ,GAChF,OAAOA,EAAUQ,QAAO,SAAUxQ,GAChC,YAAyD,IAA3CA,EAAM8G,EAAiBc,UAAU0F,SAC9CvN,KAAI,SAAUC,GACf,OAAOA,EAAM8G,EAAiBc,UAAU0F,SACvCuD,UAAU3B,QAAO,SAAU4B,EAAkBC,GAC9C,IAAKD,EAAiB/L,OAGpB,IAFA,IAAIF,EAAOpE,OAAOoE,KAAKkM,GAEd9K,EAAI,EAAGA,EAAIpB,EAAKE,OAAQkB,IAAK,CACpC,IACI+K,EADenM,EAAKoB,GACiBgL,cAEzC,IAA0D,IAAtDL,EAAkB9O,QAAQkP,IAAiCD,EAAIC,GACjE,OAAOF,EAAiBvI,OAAOwI,GAKrC,OAAOD,IACN,KAGDI,EAAuB,SAA8BC,EAASP,EAAmBZ,GAEnF,IAAIoB,EAAmB,GACvB,OAAOpB,EAAUQ,QAAO,SAAUxQ,GAChC,QAAI8L,MAAMD,QAAQ7L,EAAMmR,WAIM,IAAnBnR,EAAMmR,IACf/D,EAAK,WAAa+D,EAAU,mDAAwD7B,EAAQtP,EAAMmR,IAAY,MAGzG,MACNpR,KAAI,SAAUC,GACf,OAAOA,EAAMmR,MACZN,UAAU3B,QAAO,SAAUmC,EAAcC,GAC1C,IAAIC,EAAmB,GACvBD,EAAad,QAAO,SAAUO,GAI5B,IAHA,IAAIS,OAAsB,EACtB3M,EAAOpE,OAAOoE,KAAKkM,GAEd9K,EAAI,EAAGA,EAAIpB,EAAKE,OAAQkB,IAAK,CACpC,IAAIwL,EAAe5M,EAAKoB,GACpB+K,EAAwBS,EAAaR,eAEiB,IAAtDL,EAAkB9O,QAAQkP,IAAmCQ,IAAwB1K,EAAiB4G,eAAeS,KAAkD,cAA3C4C,EAAIS,GAAqBP,eAAoCD,IAA0BlK,EAAiB4G,eAAeS,KAAoD,eAA7C4C,EAAIC,GAAuBC,gBACvRO,EAAsBR,IAIyB,IAA7CJ,EAAkB9O,QAAQ2P,IAAyBA,IAAiB3K,EAAiB4G,eAAeK,YAAc0D,IAAiB3K,EAAiB4G,eAAeE,UAAY6D,IAAiB3K,EAAiB4G,eAAeM,YAClOwD,EAAsBC,GAI1B,IAAKD,IAAwBT,EAAIS,GAC/B,OAAO,EAGT,IAAI5Q,EAAQmQ,EAAIS,GAAqBP,cAUrC,OARKG,EAAiBI,KACpBJ,EAAiBI,GAAuB,IAGrCD,EAAiBC,KACpBD,EAAiBC,GAAuB,KAGrCJ,EAAiBI,GAAqB5Q,KACzC2Q,EAAiBC,GAAqB5Q,IAAS,GACxC,MAIRiQ,UAAUxH,SAAQ,SAAU0H,GAC7B,OAAOM,EAAa3P,KAAKqP,MAK3B,IAFA,IAAIlM,EAAOpE,OAAOoE,KAAK0M,GAEdtL,EAAI,EAAGA,EAAIpB,EAAKE,OAAQkB,IAAK,CACpC,IAAIwL,EAAe5M,EAAKoB,GACpByL,GAAW,EAAIjC,EAAwB,SAAG,GAAI2B,EAAiBK,GAAeF,EAAiBE,IACnGL,EAAiBK,GAAgBC,EAGnC,OAAOL,IACN,IAAIR,WAGLX,EAAuB,SAA8BF,EAAW2B,GAClE,IAAK,IAAI1L,EAAI+J,EAAUjL,OAAS,EAAGkB,GAAK,EAAGA,IAAK,CAC9C,IAAIjG,EAAQgQ,EAAU/J,GAEtB,GAAIjG,EAAMiF,eAAe0M,GACvB,OAAO3R,EAAM2R,GAIjB,OAAO,MAqBLC,GACElC,EAAQvL,KAAK0N,MACV,SAAUC,GACf,IAAIC,EAAc5N,KAAK0N,MAEnBE,EAAcrC,EAAQ,IACxBA,EAAQqC,EACRD,EAASC,IAETC,YAAW,WACTJ,EAAYE,KACX,KAKLG,EAAc,SAAqBC,GACrC,OAAOC,aAAaD,IAGlB7C,EAA0C,oBAAXxR,OAAyBA,OAAOwR,uBAAyBxR,OAAOuU,6BAA+BvU,OAAOwU,0BAA4BT,EAAcU,EAAOjD,uBAAyBuC,EAC/MW,EAAyC,oBAAX1U,OAAyBA,OAAO0U,sBAAwB1U,OAAO2U,4BAA8B3U,OAAO4U,yBAA2BR,EAAcK,EAAOC,sBAAwBN,EAE1M7E,EAAO,SAAcsF,GACvB,OAAOvF,SAAmC,mBAAjBA,QAAQC,MAAuBD,QAAQC,KAAKsF,IAGnEC,EAAkB,KAmBlBC,EAAmB,SAA0BC,EAAUC,GACzD,IAAIxH,EAAUuH,EAASvH,QACnBtC,EAAiB6J,EAAS7J,eAC1BE,EAAiB2J,EAAS3J,eAC1BqC,EAAWsH,EAAStH,SACpBC,EAAWqH,EAASrH,SACpBC,EAAeoH,EAASpH,aACxBR,EAAsB4H,EAAS5H,oBAC/BS,EAAamH,EAASnH,WACtBC,EAAYkH,EAASlH,UACrB9H,EAAQgP,EAAShP,MACjBiF,EAAkB+J,EAAS/J,gBAC/BiK,EAAiBjM,EAAiBc,UAAUmB,KAAMC,GAClD+J,EAAiBjM,EAAiBc,UAAUqB,KAAMC,GAClD8J,EAAYnP,EAAOiF,GACnB,IAAImK,EAAa,CACf3H,QAAS4H,EAAWpM,EAAiBc,UAAU0F,KAAMhC,GACrDC,SAAU2H,EAAWpM,EAAiBc,UAAUmC,KAAMwB,GACtDC,SAAU0H,EAAWpM,EAAiBc,UAAUoC,KAAMwB,GACtDC,aAAcyH,EAAWpM,EAAiBc,UAAUE,SAAU2D,GAC9DC,WAAYwH,EAAWpM,EAAiBc,UAAUC,OAAQ6D,GAC1DC,UAAWuH,EAAWpM,EAAiBc,UAAUI,MAAO2D,IAEtDwH,EAAY,GACZC,EAAc,GAClB3S,OAAOoE,KAAKoO,GAAY5J,SAAQ,SAAUkH,GACxC,IAAI8C,EAAsBJ,EAAW1C,GACjC+C,EAAUD,EAAoBC,QAC9BC,EAAUF,EAAoBE,QAE9BD,EAAQvO,SACVoO,EAAU5C,GAAW+C,GAGnBC,EAAQxO,SACVqO,EAAY7C,GAAW0C,EAAW1C,GAASgD,YAG/CT,GAAMA,IACN7H,EAAoB4H,EAAUM,EAAWC,IAGvCI,EAAe,SAAsBC,GACvC,OAAO3H,MAAMD,QAAQ4H,GAAiBA,EAAcC,KAAK,IAAMD,GAG7DT,EAAc,SAAqBnP,EAAO8P,QACvB,IAAV9P,GAAyB/F,SAAS+F,QAAUA,IACrD/F,SAAS+F,MAAQ2P,EAAa3P,IAGhCkP,EAAiBjM,EAAiBc,UAAUiB,MAAO8K,IAGjDZ,EAAmB,SAA0B5B,EAASwC,GACxD,IAAIC,EAAa9V,SAAS+V,qBAAqB1C,GAAS,GAExD,GAAKyC,EAAL,CASA,IALA,IAAIE,EAAwBF,EAAWG,aAAajN,EAAiBsI,kBACjE4E,EAAmBF,EAAwBA,EAAsBG,MAAM,KAAO,GAC9EC,EAAqB,GAAG3L,OAAOyL,GAC/BG,EAAgB1T,OAAOoE,KAAK8O,GAEvB1N,EAAI,EAAGA,EAAIkO,EAAcpP,OAAQkB,IAAK,CAC7C,IAAImO,EAAYD,EAAclO,GAC1BrF,EAAQ+S,EAAWS,IAAc,GAEjCR,EAAWG,aAAaK,KAAexT,GACzCgT,EAAWS,aAAaD,EAAWxT,IAGQ,IAAzCoT,EAAiBlS,QAAQsS,IAC3BJ,EAAiBtS,KAAK0S,GAGxB,IAAIE,EAAcJ,EAAmBpS,QAAQsS,IAExB,IAAjBE,GACFJ,EAAmBnS,OAAOuS,EAAa,GAI3C,IAAK,IAAIC,EAAKL,EAAmBnP,OAAS,EAAGwP,GAAM,EAAGA,IACpDX,EAAWY,gBAAgBN,EAAmBK,IAG5CP,EAAiBjP,SAAWmP,EAAmBnP,OACjD6O,EAAWY,gBAAgB1N,EAAiBsI,kBACnCwE,EAAWG,aAAajN,EAAiBsI,oBAAsB+E,EAAcT,KAAK,MAC3FE,EAAWS,aAAavN,EAAiBsI,iBAAkB+E,EAAcT,KAAK,QAI9ER,EAAa,SAAoBvL,EAAM8M,GACzC,IAAIC,EAAc5W,SAAS6W,MAAQ7W,SAAS8W,cAAc9N,EAAiBc,UAAU2F,MACjFsH,EAAWH,EAAYI,iBAAiBnN,EAAO,IAAMb,EAAiBsI,iBAAmB,KACzFmE,EAAUzH,MAAMtL,UAAUuU,MAAM5V,KAAK0V,GACrCvB,EAAU,GACV0B,OAAgB,EA0CpB,OAxCIP,GAAQA,EAAK1P,QACf0P,EAAKpL,SAAQ,SAAU0H,GACrB,IAAIkE,EAAanX,SAASC,cAAc4J,GAExC,IAAK,IAAIyM,KAAarD,EACpB,GAAIA,EAAI9L,eAAemP,GACrB,GAAIA,IAActN,EAAiB4G,eAAeK,WAChDkH,EAAWlN,UAAYgJ,EAAIhJ,eACtB,GAAIqM,IAActN,EAAiB4G,eAAeE,SACnDqH,EAAWC,WACbD,EAAWC,WAAWjN,QAAU8I,EAAI9I,QAEpCgN,EAAWE,YAAYrX,SAASsX,eAAerE,EAAI9I,cAEhD,CACL,IAAIrH,OAAkC,IAAnBmQ,EAAIqD,GAA6B,GAAKrD,EAAIqD,GAC7Da,EAAWZ,aAAaD,EAAWxT,GAKzCqU,EAAWZ,aAAavN,EAAiBsI,iBAAkB,QAEvDmE,EAAQ8B,MAAK,SAAUC,EAAazT,GAEtC,OADAmT,EAAgBnT,EACToT,EAAWM,YAAYD,MAE9B/B,EAAQxR,OAAOiT,EAAe,GAE9B1B,EAAQ5R,KAAKuT,MAKnB1B,EAAQlK,SAAQ,SAAU0H,GACxB,OAAOA,EAAIyE,WAAWC,YAAY1E,MAEpCuC,EAAQjK,SAAQ,SAAU0H,GACxB,OAAO2D,EAAYS,YAAYpE,MAE1B,CACLwC,QAASA,EACTD,QAASA,IAIToC,EAAoC,SAA2C/B,GACjF,OAAOlT,OAAOoE,KAAK8O,GAAYzE,QAAO,SAAUS,EAAKvK,GACnD,IAAIuQ,OAAkC,IAApBhC,EAAWvO,GAAuBA,EAAM,KAAQuO,EAAWvO,GAAO,IAAO,GAAKA,EAChG,OAAOuK,EAAMA,EAAM,IAAMgG,EAAOA,IAC/B,KAuBDC,EAAuC,SAA8CjC,GACvF,IAAIkC,EAAYxV,UAAU0E,OAAS,QAAsBzD,IAAjBjB,UAAU,GAAmBA,UAAU,GAAK,GACpF,OAAOI,OAAOoE,KAAK8O,GAAYzE,QAAO,SAAUnI,EAAK3B,GAEnD,OADA2B,EAAID,EAAiB0G,cAAcpI,IAAQA,GAAOuO,EAAWvO,GACtD2B,IACN8O,IA6CDC,EAAmB,SAA0BnO,EAAM8M,EAAM7E,GAC3D,OAAQjI,GACN,KAAKb,EAAiBc,UAAUiB,MAC9B,MAAO,CACLkN,YAAa,WACX,OAvCuElS,EAuC5B4Q,EAAK5Q,MAvC8B8P,EAuCvBc,EAAK3L,iBAnCnDkN,EAAa,CAC5B5Q,IAAKvB,IACOiD,EAAiBsI,mBAAoB,EAC/CpP,EAAQ4V,EAAqCjC,EADQqC,GAElD,CAACxP,EAAiB,QAAEzI,cAAc+I,EAAiBc,UAAUiB,MAAO7I,EAAO6D,IARhD,IAA6CA,EAAO8P,EAClFqC,EAMAhW,GAkCE6M,SAAU,WACR,OA9EkB,SAA+BlF,EAAM9D,EAAO8P,EAAY/D,GAClF,IAAIqG,EAAkBP,EAAkC/B,GACpDuC,EAAiB1C,EAAa3P,GAClC,OAAOoS,EAAkB,IAAMtO,EAAO,IAAMb,EAAiBsI,iBAAmB,WAAe6G,EAAkB,IAAMpL,EAAwBqL,EAAgBtG,GAAU,KAAOjI,EAAO,IAAM,IAAMA,EAAO,IAAMb,EAAiBsI,iBAAmB,WAAevE,EAAwBqL,EAAgBtG,GAAU,KAAOjI,EAAO,IA2EpTwO,CAAsBxO,EAAM8M,EAAK5Q,MAAO4Q,EAAK3L,gBAAiB8G,KAI3E,KAAK9I,EAAiBuG,gBAAgBtE,KACtC,KAAKjC,EAAiBuG,gBAAgBpE,KACpC,MAAO,CACL8M,YAAa,WACX,OAAOH,EAAqCnB,IAE9C5H,SAAU,WACR,OAAO6I,EAAkCjB,KAI/C,QACE,MAAO,CACLsB,YAAa,WACX,OAjDyB,SAAsCpO,EAAM8M,GAC7E,OAAOA,EAAK1U,KAAI,SAAUgR,EAAK9K,GAC7B,IAAImQ,EAEAC,IAAaD,EAAa,CAC5BhR,IAAKa,IACOa,EAAiBsI,mBAAoB,EAAMgH,GAazD,OAZA3V,OAAOoE,KAAKkM,GAAK1H,SAAQ,SAAU+K,GACjC,IAAIkC,EAAkBxP,EAAiB0G,cAAc4G,IAAcA,EAEnE,GAAIkC,IAAoBxP,EAAiB4G,eAAeK,YAAcuI,IAAoBxP,EAAiB4G,eAAeE,SAAU,CAClI,IAAI2I,EAAUxF,EAAIhJ,WAAagJ,EAAI9I,QACnCoO,EAAUG,wBAA0B,CAClCC,OAAQF,QAGVF,EAAUC,GAAmBvF,EAAIqD,MAG9B5N,EAAiB,QAAEzI,cAAc4J,EAAM0O,MA8BjCK,CAA6B/O,EAAM8M,IAE5C5H,SAAU,WACR,OA7FiB,SAA8BlF,EAAM8M,EAAM7E,GACnE,OAAO6E,EAAKvF,QAAO,SAAUS,EAAKoB,GAChC,IAAI4F,EAAgBlW,OAAOoE,KAAKkM,GAAKP,QAAO,SAAU4D,GACpD,QAASA,IAActN,EAAiB4G,eAAeK,YAAcqG,IAActN,EAAiB4G,eAAeE,aAClHsB,QAAO,SAAUxE,EAAQ0J,GAC1B,IAAIuB,OAAiC,IAAnB5E,EAAIqD,GAA6BA,EAAYA,EAAY,KAAQvJ,EAAwBkG,EAAIqD,GAAYxE,GAAU,IACrI,OAAOlF,EAASA,EAAS,IAAMiL,EAAOA,IACrC,IACCiB,EAAa7F,EAAIhJ,WAAagJ,EAAI9I,SAAW,GAC7C4O,GAAsE,IAAtD/P,EAAiBqI,kBAAkBrN,QAAQ6F,GAC/D,OAAOgI,EAAM,IAAMhI,EAAO,IAAMb,EAAiBsI,iBAAmB,WAAeuH,GAAiBE,EAAgB,KAAO,IAAMD,EAAa,KAAOjP,EAAO,OAC3J,IAkFYmP,CAAqBnP,EAAM8M,EAAM7E,OAmClDtQ,EAAQwK,kCA1GgC,SAA2C9J,GACjF,IAAI+W,EAAiB1W,UAAU0E,OAAS,QAAsBzD,IAAjBjB,UAAU,GAAmBA,UAAU,GAAK,GACzF,OAAOI,OAAOoE,KAAK7E,GAAOkP,QAAO,SAAUnI,EAAK3B,GAE9C,OADA2B,EAAID,EAAiBmI,aAAa7J,IAAQA,GAAOpF,EAAMoF,GAChD2B,IACNgQ,IAsGLzX,EAAQ8H,wBApTsB,SAAiCyL,GACzDF,GACFJ,EAAqBI,GAGnBE,EAASlI,MACXgI,EAAkBtD,GAAsB,WACtCuD,EAAiBC,GAAU,WACzBF,EAAkB,YAItBC,EAAiBC,GACjBF,EAAkB,OAwStBrT,EAAQG,iBA/Be,SAA0B0I,GAC/C,IAAImD,EAAUnD,EAAKmD,QACftC,EAAiBb,EAAKa,eACtB4G,EAASzH,EAAKyH,OACd1G,EAAiBf,EAAKe,eACtBqC,EAAWpD,EAAKoD,SAChBC,EAAWrD,EAAKqD,SAChBC,EAAetD,EAAKsD,aACpBC,EAAavD,EAAKuD,WAClBC,EAAYxD,EAAKwD,UACjBqL,EAAa7O,EAAKtE,MAClBA,OAAuBvC,IAAf0V,EAA2B,GAAKA,EACxClO,EAAkBX,EAAKW,gBAC3B,MAAO,CACLsB,KAAM0L,EAAiBhP,EAAiBc,UAAU0F,KAAMhC,EAASsE,GACjE5G,eAAgB8M,EAAiBhP,EAAiBuG,gBAAgBtE,KAAMC,EAAgB4G,GACxF1G,eAAgB4M,EAAiBhP,EAAiBuG,gBAAgBpE,KAAMC,EAAgB0G,GACxF9E,KAAMgL,EAAiBhP,EAAiBc,UAAUmC,KAAMwB,EAAUqE,GAClE7E,KAAM+K,EAAiBhP,EAAiBc,UAAUoC,KAAMwB,EAAUoE,GAClE5E,SAAU8K,EAAiBhP,EAAiBc,UAAUE,SAAU2D,EAAcmE,GAC9EzE,OAAQ2K,EAAiBhP,EAAiBc,UAAUC,OAAQ6D,EAAYkE,GACxE9L,MAAOgS,EAAiBhP,EAAiBc,UAAUI,MAAO2D,EAAWiE,GACrE/L,MAAOiS,EAAiBhP,EAAiBc,UAAUiB,MAAO,CACxDhF,MAAOA,EACPiF,gBAAiBA,GAChB8G,KAOPtQ,EAAQC,mBArWiB,SAA4ByQ,GACnD,MAAO,CACL1E,QAASqF,EAAwB,CAAC7J,EAAiB4G,eAAeG,MAAOmC,GACzEhH,eAAgBsH,EAA2BxJ,EAAiBuG,gBAAgBtE,KAAMiH,GAClFrF,MAAOuF,EAAqBF,EAAWlJ,EAAiB6H,aAAaE,OACrEe,OAAQM,EAAqBF,EAAWlJ,EAAiB6H,aAAaG,2BACtE5F,eAAgBoH,EAA2BxJ,EAAiBuG,gBAAgBpE,KAAM+G,GAClFzE,SAAU2F,EAAqBpK,EAAiBc,UAAUmC,KAAM,CAACjD,EAAiB4G,eAAeS,IAAKrH,EAAiB4G,eAAeG,MAAOmC,GAC7IxE,SAAU0F,EAAqBpK,EAAiBc,UAAUoC,KAAM,CAAClD,EAAiB4G,eAAeO,KAAMnH,EAAiB4G,eAAeC,QAAS7G,EAAiB4G,eAAeI,UAAWhH,EAAiB4G,eAAeQ,SAAUpH,EAAiB4G,eAAeM,WAAYgC,GACjRvE,aAAcyF,EAAqBpK,EAAiBc,UAAUE,SAAU,CAAChB,EAAiB4G,eAAeK,YAAaiC,GACtH/E,oBAAqBoF,EAAuBL,GAC5CtE,WAAYwF,EAAqBpK,EAAiBc,UAAUC,OAAQ,CAACf,EAAiB4G,eAAeU,IAAKtH,EAAiB4G,eAAeK,YAAaiC,GACvJrE,UAAWuF,EAAqBpK,EAAiBc,UAAUI,MAAO,CAAClB,EAAiB4G,eAAeE,UAAWoC,GAC9GnM,MAAOkM,EAAsBC,GAC7BlH,gBAAiBwH,EAA2BxJ,EAAiBuG,gBAAgBxE,MAAOmH,KAwVxF1Q,EAAQ+P,sBAAwBA,EAChC/P,EAAQ8N,KAAOA,I,8HC5jBf,SAAS6J,EAAT,GAA4D,IAA7CC,EAA4C,EAA5CA,YAAaC,EAA+B,EAA/BA,KAAMpM,EAAyB,EAAzBA,KAAMqM,EAAmB,EAAnBA,SAAUvT,EAAS,EAATA,MAChD,OACE,kBAAC,cAAD,CACEJ,MAAO4T,EACPrV,OAAQ,SAAA0B,GACN,IAAM4T,EACJJ,GAAexT,EAAKC,KAAKC,aAAasT,YACxC,OACE,kBAAC,IAAD,CACEhO,eAAgB,CACdiO,QAEFtT,MAAOA,EACPuH,cAAa,QAAU1H,EAAKC,KAAKC,aAAaC,MAC9CkH,KAAM,CACJ,CACE5I,KAAK,cACLoU,QAASe,GAEX,CACE3F,SAAS,WACT4E,QAAS1S,GAEX,CACE8N,SAAS,iBACT4E,QAASe,GAEX,CACE3F,SAAS,UACT4E,QAAQ,WAEV,CACEpU,KAAK,eACLoU,QAAQ,WAEV,CACEpU,KAAK,kBACLoU,QAAS7S,EAAKC,KAAKC,aAAa2T,QAElC,CACEpV,KAAK,gBACLoU,QAAS1S,GAEX,CACE1B,KAAK,sBACLoU,QAASe,IAGV/O,OACC6O,EAASrS,OAAS,EACd,CACE5C,KAAK,WACLoU,QAASa,EAAS1D,KAAT,OAEX,IAELnL,OAAOwC,MAtDlB,SA8DJkM,EAAI3T,aAAe,CACjB6T,KAAK,KACLpM,KAAM,GACNqM,SAAU,IAWGH,MAEf,IAAMI,EAAY,c,mBCrFlB,IAAIG,EAEJA,EAAI,WACF,OAAOrX,KADL,GAIJ,IAEEqX,EAAIA,GAAK,IAAIC,SAAS,cAAb,GACT,MAAOC,GAEe,iBAAX7Z,SAAqB2Z,EAAI3Z,QAMtCwB,EAAOC,QAAUkY","file":"09eeceda51943af82d1f25d906e3163a9a2519fb-f21e2e3f5ad742a9fef1.js","sourcesContent":["/*!\n Copyright (c) 2015 Jed Watson.\n Based on code that is Copyright 2013-2015, Facebook, Inc.\n All rights reserved.\n*/\n\n/* global define */\n(function () {\n 'use strict';\n\n var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n var ExecutionEnvironment = {\n canUseDOM: canUseDOM,\n canUseWorkers: typeof Worker !== 'undefined',\n canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n canUseViewport: canUseDOM && !!window.screen\n };\n\n if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n define(function () {\n return ExecutionEnvironment;\n });\n } else if (typeof module !== 'undefined' && module.exports) {\n module.exports = ExecutionEnvironment;\n } else {\n window.ExecutionEnvironment = ExecutionEnvironment;\n }\n})();","'use strict';\n\nrequire(\"core-js/modules/es6.array.index-of\");\n\nrequire(\"core-js/modules/es6.array.map\");\n\nrequire(\"core-js/modules/es6.function.name\");\n\nrequire(\"core-js/modules/es6.object.set-prototype-of\");\n\nrequire(\"core-js/modules/es6.object.create\");\n\nfunction _interopDefault(ex) {\n return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;\n}\n\nvar React = require('react');\n\nvar React__default = _interopDefault(React);\n\nvar ExecutionEnvironment = _interopDefault(require('exenv'));\n\nvar shallowEqual = _interopDefault(require('shallowequal'));\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n\n var mountedInstances = [];\n var state = void 0;\n\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n\n var SideEffect = function (_Component) {\n _inherits(SideEffect, _Component);\n\n function SideEffect() {\n _classCallCheck(this, SideEffect);\n\n return _possibleConstructorReturn(this, _Component.apply(this, arguments));\n } // Try to use displayName of wrapped component\n\n\n SideEffect.peek = function peek() {\n return state;\n }; // Expose canUseDOM so tests can monkeypatch it\n\n\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n\n SideEffect.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !shallowEqual(nextProps, this.props);\n };\n\n SideEffect.prototype.componentWillMount = function componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n\n SideEffect.prototype.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n\n SideEffect.prototype.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n\n SideEffect.prototype.render = function render() {\n return React__default.createElement(WrappedComponent, this.props);\n };\n\n return SideEffect;\n }(React.Component);\n\n SideEffect.displayName = 'SideEffect(' + getDisplayName(WrappedComponent) + ')';\n SideEffect.canUseDOM = ExecutionEnvironment.canUseDOM;\n return SideEffect;\n };\n}\n\nmodule.exports = withSideEffect;","import { Link } from 'gatsby';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport headerStyles from './Header.module.css';\n\nclass Header extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n showNav: false\n };\n }\n toggleNav = () => {\n this.setState({\n showNav: !this.state.showNav\n });\n };\n\n render() {\n const { showNav } = this.state;\n return (\n
\n
\n \n {this.props.siteTitle}\n \n
\n
\n ☰\n
\n\n \n
\n );\n }\n}\n\nHeader.propTypes = {\n siteTitle: PropTypes.string\n};\n\nHeader.defaultProps = {\n siteTitle: ''\n};\n\nexport default Header;\n","import Header from './Header'\n\nexport default Header\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { StaticQuery, graphql } from 'gatsby'\n\nimport Header from './Header'\nimport '../global-styles.css'\n\nconst Layout = ({ children }) => (\n (\n <>\n
\n\n \n {children}\n \n \n )}\n />\n)\n\nLayout.propTypes = {\n children: PropTypes.node.isRequired,\n}\n\nexport default Layout\n","var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n require('./_redefine')(DateProto, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? $toString.call(this) : INVALID_DATE;\n });\n}\n","require(\"core-js/modules/es6.function.bind\");\n\nrequire(\"core-js/modules/web.dom.iterable\");\n\nrequire(\"core-js/modules/es6.array.iterator\");\n\nrequire(\"core-js/modules/es6.object.to-string\");\n\nrequire(\"core-js/modules/es6.object.keys\");\n\n//\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n\n if (ret !== void 0) {\n return !!ret;\n }\n\n if (objA === objB) {\n return true;\n }\n\n if (typeof objA !== \"object\" || !objA || typeof objB !== \"object\" || !objB) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB); // Test for A's keys different from B.\n\n for (var idx = 0; idx < keysA.length; idx++) {\n var key = keysA[idx];\n\n if (!bHasOwnProperty(key)) {\n return false;\n }\n\n var valueA = objA[key];\n var valueB = objB[key];\n ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n\n if (ret === false || ret === void 0 && valueA !== valueB) {\n return false;\n }\n }\n\n return true;\n};","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n","require(\"core-js/modules/es6.array.is-array\");\n\nrequire(\"core-js/modules/es6.array.some\");\n\nrequire(\"core-js/modules/web.dom.iterable\");\n\nrequire(\"core-js/modules/es6.array.iterator\");\n\nrequire(\"core-js/modules/es6.object.to-string\");\n\nrequire(\"core-js/modules/es6.object.keys\");\n\nrequire(\"core-js/modules/es6.array.for-each\");\n\nrequire(\"core-js/modules/es6.object.set-prototype-of\");\n\nrequire(\"core-js/modules/es6.object.create\");\n\nrequire(\"core-js/modules/es6.array.index-of\");\n\nrequire(\"core-js/modules/es6.object.define-property\");\n\nrequire(\"core-js/modules/es6.object.assign\");\n\nexports.__esModule = true;\nexports.Helmet = undefined;\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require(\"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactSideEffect = require(\"react-side-effect\");\n\nvar _reactSideEffect2 = _interopRequireDefault(_reactSideEffect);\n\nvar _reactFastCompare = require(\"react-fast-compare\");\n\nvar _reactFastCompare2 = _interopRequireDefault(_reactFastCompare);\n\nvar _HelmetUtils = require(\"./HelmetUtils.js\");\n\nvar _HelmetConstants = require(\"./HelmetConstants.js\");\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n _inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n _classCallCheck(this, HelmetWrapper);\n\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !(0, _reactFastCompare2[\"default\"])(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.SCRIPT:\n case _HelmetConstants.TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case _HelmetConstants.TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error(\"<\" + child.type + \" /> elements are self-closing and can not contain children. Refer to our API for more information.\");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _extends2;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n return _extends({}, arrayTypeChildren, (_extends2 = {}, _extends2[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _extends2));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _extends3, _extends4;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.TITLE:\n return _extends({}, newProps, (_extends3 = {}, _extends3[child.type] = nestedChildren, _extends3.titleAttributes = _extends({}, newChildProps), _extends3));\n\n case _HelmetConstants.TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case _HelmetConstants.TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_extends4 = {}, _extends4[child.type] = _extends({}, newChildProps), _extends4));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _extends5;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_extends5 = {}, _extends5[arrayChildName] = arrayTypeChildren[arrayChildName], _extends5));\n });\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!_HelmetConstants.VALID_TAG_NAMES.some(function (name) {\n return child.type === name;\n })) {\n if (typeof child.type === \"function\") {\n return (0, _HelmetUtils.warn)(\"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.\");\n }\n\n return (0, _HelmetUtils.warn)(\"Only elements types \" + _HelmetConstants.VALID_TAG_NAMES.join(\", \") + \" are allowed. Helmet does not support rendering <\" + child.type + \"> elements. Refer to our API for more information.\");\n }\n\n if (nestedChildren && typeof nestedChildren !== \"string\" && (!Array.isArray(nestedChildren) || nestedChildren.some(function (nestedChild) {\n return typeof nestedChild !== \"string\";\n }))) {\n throw new Error(\"Helmet expects a string as a child of <\" + child.type + \">. Did you forget to wrap your children in braces? ( <\" + child.type + \">{``} ) Refer to our API for more information.\");\n }\n }\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n\n _react2[\"default\"].Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = _objectWithoutProperties(_child$props, [\"children\"]);\n\n var newChildProps = (0, _HelmetUtils.convertReactPropstoHtmlAttributes)(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.LINK:\n case _HelmetConstants.TAG_NAMES.META:\n case _HelmetConstants.TAG_NAMES.NOSCRIPT:\n case _HelmetConstants.TAG_NAMES.SCRIPT:\n case _HelmetConstants.TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = _objectWithoutProperties(_props, [\"children\"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return _react2[\"default\"].createElement(Component, newProps);\n };\n\n _createClass(HelmetWrapper, null, [{\n key: \"canUseDOM\",\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {\"target\": \"_blank\", \"href\": \"http://mysite.com/\"}\n * @param {Object} bodyAttributes: {\"className\": \"root\"}\n * @param {String} defaultTitle: \"Default Title\"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {\"lang\": \"en\", \"amp\": undefined}\n * @param {Array} link: [{\"rel\": \"canonical\", \"href\": \"http://mysite.com/example\"}]\n * @param {Array} meta: [{\"name\": \"description\", \"content\": \"Test description\"}]\n * @param {Array} noscript: [{\"innerHTML\": \" console.log(newState)\"\n * @param {Array} script: [{\"type\": \"text/javascript\", \"src\": \"http://mysite.com/js/test.js\"}]\n * @param {Array} style: [{\"type\": \"text/css\", \"cssText\": \"div { display: block; color: blue; }\"}]\n * @param {String} title: \"Title\"\n * @param {Object} titleAttributes: {\"itemprop\": \"name\"}\n * @param {String} titleTemplate: \"MySite.com - %s\"\n */\n set: function set(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n\n return HelmetWrapper;\n }(_react2[\"default\"].Component), _class.propTypes = {\n base: _propTypes2[\"default\"].object,\n bodyAttributes: _propTypes2[\"default\"].object,\n children: _propTypes2[\"default\"].oneOfType([_propTypes2[\"default\"].arrayOf(_propTypes2[\"default\"].node), _propTypes2[\"default\"].node]),\n defaultTitle: _propTypes2[\"default\"].string,\n defer: _propTypes2[\"default\"].bool,\n encodeSpecialCharacters: _propTypes2[\"default\"].bool,\n htmlAttributes: _propTypes2[\"default\"].object,\n link: _propTypes2[\"default\"].arrayOf(_propTypes2[\"default\"].object),\n meta: _propTypes2[\"default\"].arrayOf(_propTypes2[\"default\"].object),\n noscript: _propTypes2[\"default\"].arrayOf(_propTypes2[\"default\"].object),\n onChangeClientState: _propTypes2[\"default\"].func,\n script: _propTypes2[\"default\"].arrayOf(_propTypes2[\"default\"].object),\n style: _propTypes2[\"default\"].arrayOf(_propTypes2[\"default\"].object),\n title: _propTypes2[\"default\"].string,\n titleAttributes: _propTypes2[\"default\"].object,\n titleTemplate: _propTypes2[\"default\"].string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = (0, _HelmetUtils.mapStateOnServer)({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: \"\",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = (0, _reactSideEffect2[\"default\"])(_HelmetUtils.reducePropsToState, _HelmetUtils.handleClientStateChange, _HelmetUtils.mapStateOnServer)(NullComponent);\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\nexports.Helmet = HelmetExport;\nexports[\"default\"] = HelmetExport;","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"Header-module--header--1Op28\",\"logo__link\":\"Header-module--logo__link--1Pt5A\",\"toggle\":\"Header-module--toggle--3ZlCy\",\"nav\":\"Header-module--nav--10wjH\",\"nav__mobile\":\"Header-module--nav__mobile--3IJWS\",\"nav__desktop\":\"Header-module--nav__desktop--GITIO\",\"nav__item\":\"Header-module--nav__item--2VcX9\",\"nav__link\":\"Header-module--nav__link--3n2Pi\"};","'use strict';\n\nrequire(\"core-js/modules/es6.function.name\");\n\nrequire(\"core-js/modules/es6.regexp.match\");\n\nrequire(\"core-js/modules/es6.regexp.to-string\");\n\nrequire(\"core-js/modules/es6.date.to-string\");\n\nrequire(\"core-js/modules/es6.regexp.constructor\");\n\nrequire(\"core-js/modules/web.dom.iterable\");\n\nrequire(\"core-js/modules/es6.array.iterator\");\n\nrequire(\"core-js/modules/es6.object.to-string\");\n\nrequire(\"core-js/modules/es6.object.keys\");\n\nrequire(\"core-js/modules/es6.array.is-array\");\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\nvar hasElementType = typeof Element !== 'undefined';\n\nfunction equal(a, b) {\n // fast-deep-equal index.js 2.0.1\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n var arrA = isArray(a),\n arrB = isArray(b),\n i,\n length,\n key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n\n for (i = length; i-- !== 0;) {\n if (!equal(a[i], b[i])) return false;\n }\n\n return true;\n }\n\n if (arrA != arrB) return false;\n var dateA = a instanceof Date,\n dateB = b instanceof Date;\n if (dateA != dateB) return false;\n if (dateA && dateB) return a.getTime() == b.getTime();\n var regexpA = a instanceof RegExp,\n regexpB = b instanceof RegExp;\n if (regexpA != regexpB) return false;\n if (regexpA && regexpB) return a.toString() == b.toString();\n var keys = keyList(a);\n length = keys.length;\n if (length !== keyList(b).length) return false;\n\n for (i = length; i-- !== 0;) {\n if (!hasProp.call(b, keys[i])) return false;\n } // end fast-deep-equal\n // start react-fast-compare\n // custom handling for DOM elements\n\n\n if (hasElementType && a instanceof Element && b instanceof Element) return a === b; // custom handling for React\n\n for (i = length; i-- !== 0;) {\n key = keys[i];\n\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of a react element\n continue;\n } else {\n // all other properties should be traversed as usual\n if (!equal(a[key], b[key])) return false;\n }\n } // end react-fast-compare\n // fast-deep-equal index.js 2.0.1\n\n\n return true;\n }\n\n return a !== a && b !== b;\n} // end fast-deep-equal\n\n\nmodule.exports = function exportedEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if (error.message && error.message.match(/stack|recursion/i) || error.number === -2146828260) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('Warning: react-fast-compare does not handle circular references.', error.name, error.message);\n return false;\n } // some other error. we should definitely know about these\n\n\n throw error;\n }\n};","require(\"core-js/modules/es6.array.reduce\");\n\nrequire(\"core-js/modules/web.dom.iterable\");\n\nrequire(\"core-js/modules/es6.array.iterator\");\n\nrequire(\"core-js/modules/es6.object.to-string\");\n\nrequire(\"core-js/modules/es6.object.keys\");\n\nrequire(\"core-js/modules/es6.array.map\");\n\nexports.__esModule = true;\nvar ATTRIBUTE_NAMES = exports.ATTRIBUTE_NAMES = {\n BODY: \"bodyAttributes\",\n HTML: \"htmlAttributes\",\n TITLE: \"titleAttributes\"\n};\nvar TAG_NAMES = exports.TAG_NAMES = {\n BASE: \"base\",\n BODY: \"body\",\n HEAD: \"head\",\n HTML: \"html\",\n LINK: \"link\",\n META: \"meta\",\n NOSCRIPT: \"noscript\",\n SCRIPT: \"script\",\n STYLE: \"style\",\n TITLE: \"title\"\n};\nvar VALID_TAG_NAMES = exports.VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\nvar TAG_PROPERTIES = exports.TAG_PROPERTIES = {\n CHARSET: \"charset\",\n CSS_TEXT: \"cssText\",\n HREF: \"href\",\n HTTPEQUIV: \"http-equiv\",\n INNER_HTML: \"innerHTML\",\n ITEM_PROP: \"itemprop\",\n NAME: \"name\",\n PROPERTY: \"property\",\n REL: \"rel\",\n SRC: \"src\"\n};\nvar REACT_TAG_MAP = exports.REACT_TAG_MAP = {\n accesskey: \"accessKey\",\n charset: \"charSet\",\n \"class\": \"className\",\n contenteditable: \"contentEditable\",\n contextmenu: \"contextMenu\",\n \"http-equiv\": \"httpEquiv\",\n itemprop: \"itemProp\",\n tabindex: \"tabIndex\"\n};\nvar HELMET_PROPS = exports.HELMET_PROPS = {\n DEFAULT_TITLE: \"defaultTitle\",\n DEFER: \"defer\",\n ENCODE_SPECIAL_CHARACTERS: \"encodeSpecialCharacters\",\n ON_CHANGE_CLIENT_STATE: \"onChangeClientState\",\n TITLE_TEMPLATE: \"titleTemplate\"\n};\nvar HTML_TAG_MAP = exports.HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\nvar SELF_CLOSING_TAGS = exports.SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\nvar HELMET_ATTRIBUTE = exports.HELMET_ATTRIBUTE = \"data-react-helmet\";","require(\"core-js/modules/es6.array.some\");\n\nrequire(\"core-js/modules/es6.regexp.split\");\n\nrequire(\"core-js/modules/es6.date.now\");\n\nrequire(\"core-js/modules/es6.array.for-each\");\n\nrequire(\"core-js/modules/es6.array.is-array\");\n\nrequire(\"core-js/modules/es6.array.index-of\");\n\nrequire(\"core-js/modules/web.dom.iterable\");\n\nrequire(\"core-js/modules/es6.array.iterator\");\n\nrequire(\"core-js/modules/es6.object.to-string\");\n\nrequire(\"core-js/modules/es6.object.keys\");\n\nrequire(\"core-js/modules/es6.array.filter\");\n\nrequire(\"core-js/modules/es6.array.map\");\n\nrequire(\"core-js/modules/es6.array.reduce\");\n\nrequire(\"core-js/modules/es6.regexp.replace\");\n\nrequire(\"core-js/modules/es6.object.assign\");\n\nrequire(\"core-js/modules/es7.symbol.async-iterator\");\n\nrequire(\"core-js/modules/es6.symbol\");\n\nexports.__esModule = true;\nexports.warn = exports.requestAnimationFrame = exports.reducePropsToState = exports.mapStateOnServer = exports.handleClientStateChange = exports.convertReactPropstoHtmlAttributes = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _objectAssign = require(\"object-assign\");\n\nvar _objectAssign2 = _interopRequireDefault(_objectAssign);\n\nvar _HelmetConstants = require(\"./HelmetConstants.js\");\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, \"&\").replace(//g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, _HelmetConstants.TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.DEFAULT_TITLE);\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== \"undefined\";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[_HelmetConstants.TAG_NAMES.BASE] !== \"undefined\";\n }).map(function (props) {\n return props[_HelmetConstants.TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n\n if (typeof props[tagName] !== \"undefined\") {\n warn(\"Helmet: \" + tagName + \" should be of type \\\"Array\\\". Instead found type \\\"\" + _typeof(props[tagName]) + \"\\\"\");\n }\n\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase(); // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === _HelmetConstants.TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === \"canonical\") && !(lowerCaseAttributeKey === _HelmetConstants.TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === \"stylesheet\")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n } // Special case for innerHTML which doesn't work lowercased\n\n\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || attributeKey === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT || attributeKey === _HelmetConstants.TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n }); // Update seen tags with tags from this instance\n\n var keys = Object.keys(instanceSeenTags);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = (0, _objectAssign2[\"default\"])({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([_HelmetConstants.TAG_PROPERTIES.HREF], propsList),\n bodyAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.LINK, [_HelmetConstants.TAG_PROPERTIES.REL, _HelmetConstants.TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.META, [_HelmetConstants.TAG_PROPERTIES.NAME, _HelmetConstants.TAG_PROPERTIES.CHARSET, _HelmetConstants.TAG_PROPERTIES.HTTPEQUIV, _HelmetConstants.TAG_PROPERTIES.PROPERTY, _HelmetConstants.TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.NOSCRIPT, [_HelmetConstants.TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.SCRIPT, [_HelmetConstants.TAG_PROPERTIES.SRC, _HelmetConstants.TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.STYLE, [_HelmetConstants.TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== \"undefined\" ? window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : global.requestAnimationFrame || rafPolyfill;\nvar cancelAnimationFrame = typeof window !== \"undefined\" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : global.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === \"function\" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n updateAttributes(_HelmetConstants.TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(_HelmetConstants.TAG_NAMES.HTML, htmlAttributes);\n updateTitle(title, titleAttributes);\n var tagUpdates = {\n baseTag: updateTags(_HelmetConstants.TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(_HelmetConstants.TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(_HelmetConstants.TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(_HelmetConstants.TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(_HelmetConstants.TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(_HelmetConstants.TAG_NAMES.STYLE, styleTags)\n };\n var addedTags = {};\n var removedTags = {};\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n cb && cb();\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join(\"\") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== \"undefined\" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(_HelmetConstants.TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(_HelmetConstants.HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(\",\") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || \"\";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(_HelmetConstants.HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(_HelmetConstants.HELMET_ATTRIBUTE) !== attributeKeys.join(\",\")) {\n elementTag.setAttribute(_HelmetConstants.HELMET_ATTRIBUTE, attributeKeys.join(\",\"));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(_HelmetConstants.TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + \"[\" + _HelmetConstants.HELMET_ATTRIBUTE + \"]\");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === \"undefined\" ? \"\" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(_HelmetConstants.HELMET_ATTRIBUTE, \"true\"); // Remove a duplicate tag from domTagstoRemove, so it isn't cleared.\n\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== \"undefined\" ? key + \"=\\\"\" + attributes[key] + \"\\\"\" : \"\" + key;\n return str ? str + \" \" + attr : attr;\n }, \"\");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeString + \">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"\" : \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"\";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || attribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === \"undefined\" ? attribute : attribute + \"=\\\"\" + encodeSpecialCharacters(tag[attribute], encode) + \"\\\"\";\n return string ? string + \" \" + attr : attr;\n }, \"\");\n var tagContent = tag.innerHTML || tag.cssText || \"\";\n var isSelfClosing = _HelmetConstants.SELF_CLOSING_TAGS.indexOf(type) === -1;\n return str + \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeHtml + (isSelfClosing ? \"/>\" : \">\" + tagContent + \"\");\n }, \"\");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[_HelmetConstants.REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(props).reduce(function (obj, key) {\n obj[_HelmetConstants.HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps; // assigning into an array to define toString function on it\n\n\n var initProps = (_initProps = {\n key: title\n }, _initProps[_HelmetConstants.HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n return [_react2[\"default\"].createElement(_HelmetConstants.TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[_HelmetConstants.HELMET_ATTRIBUTE] = true, _mappedTag);\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = _HelmetConstants.REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || mappedAttribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = {\n __html: content\n };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n return _react2[\"default\"].createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case _HelmetConstants.TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n\n case _HelmetConstants.ATTRIBUTE_NAMES.BODY:\n case _HelmetConstants.ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? \"\" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(_HelmetConstants.TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(_HelmetConstants.ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(_HelmetConstants.ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(_HelmetConstants.TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(_HelmetConstants.TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(_HelmetConstants.TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(_HelmetConstants.TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(_HelmetConstants.TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(_HelmetConstants.TAG_NAMES.TITLE, {\n title: title,\n titleAttributes: titleAttributes\n }, encode)\n };\n};\n\nexports.convertReactPropstoHtmlAttributes = convertReactPropstoHtmlAttributes;\nexports.handleClientStateChange = handleClientStateChange;\nexports.mapStateOnServer = mapStateOnServer;\nexports.reducePropsToState = reducePropsToState;\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.warn = warn;","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Helmet from 'react-helmet'\nimport { StaticQuery, graphql } from 'gatsby'\n\nfunction SEO({ description, lang, meta, keywords, title }) {\n return (\n {\n const metaDescription =\n description || data.site.siteMetadata.description\n return (\n 0\n ? {\n name: `keywords`,\n content: keywords.join(`, `),\n }\n : []\n )\n .concat(meta)}\n />\n )\n }}\n />\n )\n}\n\nSEO.defaultProps = {\n lang: `en`,\n meta: [],\n keywords: [],\n}\n\nSEO.propTypes = {\n description: PropTypes.string,\n lang: PropTypes.string,\n meta: PropTypes.array,\n keywords: PropTypes.arrayOf(PropTypes.string),\n title: PropTypes.string.isRequired,\n}\n\nexport default SEO\n\nconst detailsQuery = graphql`\n query DefaultSEOQuery {\n site {\n siteMetadata {\n title\n description\n author\n }\n }\n }\n`\n","var g; // This works in non-strict mode\n\ng = function () {\n return this;\n}();\n\ntry {\n // This works if eval is allowed (see CSP)\n g = g || new Function(\"return this\")();\n} catch (e) {\n // This works if the window reference is available\n if (typeof window === \"object\") g = window;\n} // g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\n\nmodule.exports = g;"],"sourceRoot":""} \ No newline at end of file diff --git a/2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js b/2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js new file mode 100644 index 0000000..d11fafe --- /dev/null +++ b/2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"1eCP":function(e,t,r){"use strict"},"3nLz":function(e,t,r){"use strict";r("t+fG")("fixed",(function(e){return function(){return e(this,"tt","","")}}))},"9eSz":function(e,t,r){"use strict";r("rzGZ"),r("Dq+y"),r("8npG"),r("YbXK"),r("eMsz"),r("zTTH"),r("3nLz");var i=r("TqRt");t.__esModule=!0,t.default=void 0;var a,n=i(r("PJYZ")),s=i(r("VbXa")),o=i(r("8OQS")),d=i(r("pVnL")),l=i(r("q1tI")),u=i(r("17x9")),c=function(e){var t=(0,d.default)({},e),r=t.resolutions,i=t.sizes,a=t.critical;return r&&(t.fixed=r,delete t.resolutions),i&&(t.fluid=i,delete t.sizes),a&&(t.loading="eager"),t.fluid&&(t.fluid=E([].concat(t.fluid))),t.fixed&&(t.fixed=E([].concat(t.fixed))),t},f=function(e){var t=e.media;return!!t&&(v&&!!window.matchMedia(t).matches)},p=function(e){var t=e.fluid,r=e.fixed;return g(t||r).src},g=function(e){if(v&&function(e){return!!e&&Array.isArray(e)&&e.some((function(e){return void 0!==e.media}))}(e)){var t=e.findIndex(f);if(-1!==t)return e[t];var r=e.findIndex((function(e){return void 0===e.media}));if(-1!==r)return e[r]}return e[0]},h=Object.create({}),m=function(e){var t=c(e),r=p(t);return h[r]||!1},b="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype,v="undefined"!=typeof window,y=v&&window.IntersectionObserver,S=new WeakMap;function w(e){return e.map((function(e){var t=e.src,r=e.srcSet,i=e.srcSetWebp,a=e.media,n=e.sizes;return l.default.createElement(l.default.Fragment,{key:t},i&&l.default.createElement("source",{type:"image/webp",media:a,srcSet:i,sizes:n}),l.default.createElement("source",{media:a,srcSet:r,sizes:n}))}))}function E(e){var t=[],r=[];return e.forEach((function(e){return(e.media?t:r).push(e)})),[].concat(t,r)}function L(e){return e.map((function(e){var t=e.src,r=e.media,i=e.tracedSVG;return l.default.createElement("source",{key:t,media:r,srcSet:i})}))}function I(e){return e.map((function(e){var t=e.src,r=e.media,i=e.base64;return l.default.createElement("source",{key:t,media:r,srcSet:i})}))}function R(e,t){var r=e.srcSet,i=e.srcSetWebp,a=e.media,n=e.sizes;return""}var O=function(e,t){var r=(void 0===a&&"undefined"!=typeof window&&window.IntersectionObserver&&(a=new window.IntersectionObserver((function(e){e.forEach((function(e){if(S.has(e.target)){var t=S.get(e.target);(e.isIntersecting||e.intersectionRatio>0)&&(a.unobserve(e.target),S.delete(e.target),t())}}))}),{rootMargin:"200px"})),a);return r&&(r.observe(e),S.set(e,t)),function(){r.unobserve(e),S.delete(e)}},z=function(e){var t=e.src?'src="'+e.src+'" ':'src="" ',r=e.sizes?'sizes="'+e.sizes+'" ':"",i=e.srcSet?'srcset="'+e.srcSet+'" ':"",a=e.title?'title="'+e.title+'" ':"",n=e.alt?'alt="'+e.alt+'" ':'alt="" ',s=e.width?'width="'+e.width+'" ':"",o=e.height?'height="'+e.height+'" ':"",d=e.crossOrigin?'crossorigin="'+e.crossOrigin+'" ':"",l=e.loading?'loading="'+e.loading+'" ':"",u=e.draggable?'draggable="'+e.draggable+'" ':"";return""+e.imageVariants.map((function(e){return(e.srcSetWebp?R(e,!0):"")+R(e)})).join("")+"'},V=l.default.forwardRef((function(e,t){var r=e.src,i=e.imageVariants,a=e.generateSources,n=e.spreadProps,s=e.ariaHidden,o=l.default.createElement(k,(0,d.default)({ref:t,src:r},n,{ariaHidden:s}));return i.length>1?l.default.createElement("picture",null,a(i),o):o})),k=l.default.forwardRef((function(e,t){var r=e.sizes,i=e.srcSet,a=e.src,n=e.style,s=e.onLoad,u=e.onError,c=e.loading,f=e.draggable,p=e.ariaHidden,g=(0,o.default)(e,["sizes","srcSet","src","style","onLoad","onError","loading","draggable","ariaHidden"]);return l.default.createElement("img",(0,d.default)({"aria-hidden":p,sizes:r,srcSet:i,src:a},g,{onLoad:s,onError:u,ref:t,loading:c,draggable:f,style:(0,d.default)({position:"absolute",top:0,left:0,width:"100%",height:"100%",objectFit:"cover",objectPosition:"center"},n)}))}));k.propTypes={style:u.default.object,onError:u.default.func,onLoad:u.default.func};var C=function(e){function t(t){var r;(r=e.call(this,t)||this).seenBefore=v&&m(t),r.isCritical="eager"===t.loading||t.critical,r.addNoScript=!(r.isCritical&&!t.fadeIn),r.useIOSupport=!b&&y&&!r.isCritical&&!r.seenBefore;var i=r.isCritical||v&&(b||!r.useIOSupport);return r.state={isVisible:i,imgLoaded:!1,imgCached:!1,fadeIn:!r.seenBefore&&t.fadeIn},r.imageRef=l.default.createRef(),r.placeholderRef=t.placeholderRef||l.default.createRef(),r.handleImageLoaded=r.handleImageLoaded.bind((0,n.default)(r)),r.handleRef=r.handleRef.bind((0,n.default)(r)),r}(0,s.default)(t,e);var r=t.prototype;return r.componentDidMount=function(){if(this.state.isVisible&&"function"==typeof this.props.onStartLoad&&this.props.onStartLoad({wasCached:m(this.props)}),this.isCritical){var e=this.imageRef.current;e&&e.complete&&this.handleImageLoaded()}},r.componentWillUnmount=function(){this.cleanUpListeners&&this.cleanUpListeners()},r.handleRef=function(e){var t=this;this.useIOSupport&&e&&(this.cleanUpListeners=O(e,(function(){var e=m(t.props);t.state.isVisible||"function"!=typeof t.props.onStartLoad||t.props.onStartLoad({wasCached:e}),t.setState({isVisible:!0},(function(){t.setState({imgLoaded:e,imgCached:!(!t.imageRef.current||!t.imageRef.current.currentSrc)})}))})))},r.handleImageLoaded=function(){var e,t,r;e=this.props,t=c(e),r=p(t),h[r]=!0,this.setState({imgLoaded:!0}),this.props.onLoad&&this.props.onLoad()},r.render=function(){var e=c(this.props),t=e.title,r=e.alt,i=e.className,a=e.style,n=void 0===a?{}:a,s=e.imgStyle,o=void 0===s?{}:s,u=e.placeholderStyle,f=void 0===u?{}:u,p=e.placeholderClassName,h=e.fluid,m=e.fixed,b=e.backgroundColor,v=e.durationFadeIn,y=e.Tag,S=e.itemProp,E=e.loading,R=e.draggable,O=!1===this.state.fadeIn||this.state.imgLoaded,C=!0===this.state.fadeIn&&!this.state.imgCached,x=(0,d.default)({opacity:O?1:0,transition:C?"opacity "+v+"ms":"none"},o),_="boolean"==typeof b?"lightgray":b,P={transitionDelay:v+"ms"},T=(0,d.default)({opacity:this.state.imgLoaded?0:1},C&&P,{},o,{},f),N={title:t,alt:this.state.isVisible?"":r,style:T,className:p,itemProp:S};if(h){var W=h,j=g(h);return l.default.createElement(y,{className:(i||"")+" gatsby-image-wrapper",style:(0,d.default)({position:"relative",overflow:"hidden"},n),ref:this.handleRef,key:"fluid-"+JSON.stringify(j.srcSet)},l.default.createElement(y,{"aria-hidden":!0,style:{width:"100%",paddingBottom:100/j.aspectRatio+"%"}}),_&&l.default.createElement(y,{"aria-hidden":!0,title:t,style:(0,d.default)({backgroundColor:_,position:"absolute",top:0,bottom:0,opacity:this.state.imgLoaded?0:1,right:0,left:0},C&&P)}),j.base64&&l.default.createElement(V,{ariaHidden:!0,ref:this.placeholderRef,src:j.base64,spreadProps:N,imageVariants:W,generateSources:I}),j.tracedSVG&&l.default.createElement(V,{ariaHidden:!0,ref:this.placeholderRef,src:j.tracedSVG,spreadProps:N,imageVariants:W,generateSources:L}),this.state.isVisible&&l.default.createElement("picture",null,w(W),l.default.createElement(k,{alt:r,title:t,sizes:j.sizes,src:j.src,crossOrigin:this.props.crossOrigin,srcSet:j.srcSet,style:x,ref:this.imageRef,onLoad:this.handleImageLoaded,onError:this.props.onError,itemProp:S,loading:E,draggable:R})),this.addNoScript&&l.default.createElement("noscript",{dangerouslySetInnerHTML:{__html:z((0,d.default)({alt:r,title:t,loading:E},j,{imageVariants:W}))}}))}if(m){var q=m,M=g(m),H=(0,d.default)({position:"relative",overflow:"hidden",display:"inline-block",width:M.width,height:M.height},n);return"inherit"===n.display&&delete H.display,l.default.createElement(y,{className:(i||"")+" gatsby-image-wrapper",style:H,ref:this.handleRef,key:"fixed-"+JSON.stringify(M.srcSet)},_&&l.default.createElement(y,{"aria-hidden":!0,title:t,style:(0,d.default)({backgroundColor:_,width:M.width,opacity:this.state.imgLoaded?0:1,height:M.height},C&&P)}),M.base64&&l.default.createElement(V,{ariaHidden:!0,ref:this.placeholderRef,src:M.base64,spreadProps:N,imageVariants:q,generateSources:I}),M.tracedSVG&&l.default.createElement(V,{ariaHidden:!0,ref:this.placeholderRef,src:M.tracedSVG,spreadProps:N,imageVariants:q,generateSources:L}),this.state.isVisible&&l.default.createElement("picture",null,w(q),l.default.createElement(k,{alt:r,title:t,width:M.width,height:M.height,sizes:M.sizes,src:M.src,crossOrigin:this.props.crossOrigin,srcSet:M.srcSet,style:x,ref:this.imageRef,onLoad:this.handleImageLoaded,onError:this.props.onError,itemProp:S,loading:E,draggable:R})),this.addNoScript&&l.default.createElement("noscript",{dangerouslySetInnerHTML:{__html:z((0,d.default)({alt:r,title:t,loading:E},M,{imageVariants:q}))}}))}return null},t}(l.default.Component);C.defaultProps={fadeIn:!0,durationFadeIn:500,alt:"",Tag:"div",loading:"lazy"};var x=u.default.shape({width:u.default.number.isRequired,height:u.default.number.isRequired,src:u.default.string.isRequired,srcSet:u.default.string.isRequired,base64:u.default.string,tracedSVG:u.default.string,srcWebp:u.default.string,srcSetWebp:u.default.string,media:u.default.string}),_=u.default.shape({aspectRatio:u.default.number.isRequired,src:u.default.string.isRequired,srcSet:u.default.string.isRequired,sizes:u.default.string.isRequired,base64:u.default.string,tracedSVG:u.default.string,srcWebp:u.default.string,srcSetWebp:u.default.string,media:u.default.string});C.propTypes={resolutions:x,sizes:_,fixed:u.default.oneOfType([x,u.default.arrayOf(x)]),fluid:u.default.oneOfType([_,u.default.arrayOf(_)]),fadeIn:u.default.bool,durationFadeIn:u.default.number,title:u.default.string,alt:u.default.string,className:u.default.oneOfType([u.default.string,u.default.object]),critical:u.default.bool,crossOrigin:u.default.oneOfType([u.default.string,u.default.bool]),style:u.default.object,imgStyle:u.default.object,placeholderStyle:u.default.object,placeholderClassName:u.default.string,backgroundColor:u.default.oneOfType([u.default.string,u.default.bool]),onLoad:u.default.func,onError:u.default.func,onStartLoad:u.default.func,Tag:u.default.string,itemProp:u.default.string,loading:u.default.oneOf(["auto","lazy","eager"]),draggable:u.default.bool};var P=C;t.default=P},SGlo:function(e,t,r){"use strict";var i=r("rj/q"),a=r("N+BI").getWeak,n=r("1a8y"),s=r("BjK0"),o=r("xa9o"),d=r("yde8"),l=r("Wadk"),u=r("qDzq"),c=r("O1i0"),f=l(5),p=l(6),g=0,h=function(e){return e._l||(e._l=new m)},m=function(){this.a=[]},b=function(e,t){return f(e.a,(function(e){return e[0]===t}))};m.prototype={get:function(e){var t=b(this,e);if(t)return t[1]},has:function(e){return!!b(this,e)},set:function(e,t){var r=b(this,e);r?r[1]=t:this.a.push([e,t])},delete:function(e){var t=p(this.a,(function(t){return t[0]===e}));return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,r,n){var l=e((function(e,i){o(e,l,t,"_i"),e._t=t,e._i=g++,e._l=void 0,null!=i&&d(i,r,e[n],e)}));return i(l.prototype,{delete:function(e){if(!s(e))return!1;var r=a(e);return!0===r?h(c(this,t)).delete(e):r&&u(r,this._i)&&delete r[this._i]},has:function(e){if(!s(e))return!1;var r=a(e);return!0===r?h(c(this,t)).has(e):r&&u(r,this._i)}}),l},def:function(e,t,r){var i=a(n(t),!0);return!0===i?h(e).set(t,r):i[e._i]=r,e},ufstore:h}},eMsz:function(e,t,r){"use strict";var i,a=r("emib"),n=r("Wadk")(0),s=r("IYdN"),o=r("N+BI"),d=r("k5Iv"),l=r("SGlo"),u=r("BjK0"),c=r("O1i0"),f=r("O1i0"),p=!a.ActiveXObject&&"ActiveXObject"in a,g=o.getWeak,h=Object.isExtensible,m=l.ufstore,b=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},v={get:function(e){if(u(e)){var t=g(e);return!0===t?m(c(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return l.def(c(this,"WeakMap"),e,t)}},y=e.exports=r("94Pd")("WeakMap",b,v,l,!0,!0);f&&p&&(d((i=l.getConstructor(b,"WeakMap")).prototype,v),o.NEED=!0,n(["delete","has","get","set"],(function(e){var t=y.prototype,r=t[e];s(t,e,(function(t,a){if(u(t)&&!h(t)){this._f||(this._f=new i);var n=this._f[e](t,a);return"set"==e?this:n}return r.call(this,t,a)}))})))},"t+fG":function(e,t,r){var i=r("P8UN"),a=r("96qb"),n=r("ap2Z"),s=/"/g,o=function(e,t,r,i){var a=String(n(e)),o="<"+t;return""!==r&&(o+=" "+r+'="'+String(i).replace(s,""")+'"'),o+">"+a+""};e.exports=function(e,t){var r={};r[e]=t(o),i(i.P+i.F*a((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3})),"String",r)}},zTTH:function(e,t,r){"use strict";var i=r("P8UN"),a=r("Wadk")(6),n="findIndex",s=!0;n in[]&&Array(1)[n]((function(){s=!1})),i(i.P+i.F*s,"Array",{findIndex:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}}),r("Dq1/")(n)}}]); +//# sourceMappingURL=2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js.map \ No newline at end of file diff --git a/2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js.map b/2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js.map new file mode 100644 index 0000000..0960847 --- /dev/null +++ b/2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/gatsby/node_modules/core-js/modules/es6.string.fixed.js","webpack:///./node_modules/gatsby-image/index.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/_collection-weak.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/es6.weak-map.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/_string-html.js","webpack:///./node_modules/gatsby/node_modules/core-js/modules/es6.array.find-index.js"],"names":["createHTML","this","_interopRequireDefault","require","exports","__esModule","default","io","_assertThisInitialized2","_inheritsLoose2","_objectWithoutPropertiesLoose2","_extends2","_react","_propTypes","convertProps","props","convertedProps","resolutions","sizes","critical","fixed","fluid","loading","groupByMedia","concat","matchesMedia","_ref","media","isBrowser","window","matchMedia","matches","getImageSrcKey","_ref2","getCurrentSrcData","src","currentData","Array","isArray","some","image","hasArtDirectionSupport","foundMedia","findIndex","noMedia","imageCache","Object","create","inImageCache","hasNativeLazyLoadSupport","HTMLImageElement","prototype","hasIOSupport","IntersectionObserver","listeners","WeakMap","generateImageSources","imageVariants","map","_ref3","srcSet","srcSetWebp","createElement","Fragment","key","type","withMedia","without","forEach","variant","push","generateTracedSVGSources","_ref4","tracedSVG","generateBase64Sources","_ref5","base64","generateNoscriptSource","_ref6","isWebp","listenToIntersections","el","cb","observer","entries","entry","has","target","get","isIntersecting","intersectionRatio","unobserve","delete","rootMargin","observe","set","noscriptImg","title","alt","width","height","crossOrigin","draggable","join","Placeholder","forwardRef","ref","generateSources","spreadProps","ariaHidden","baseImage","Img","length","style","onLoad","onError","otherProps","position","top","left","objectFit","objectPosition","propTypes","object","func","Image","_React$Component","_this","call","seenBefore","isCritical","addNoScript","fadeIn","useIOSupport","isVisible","state","imgLoaded","imgCached","imageRef","createRef","placeholderRef","handleImageLoaded","bind","handleRef","_proto","componentDidMount","onStartLoad","wasCached","img","current","complete","componentWillUnmount","cleanUpListeners","_this2","imageInCache","setState","currentSrc","render","_convertProps","className","_convertProps$style","_convertProps$imgStyl","imgStyle","_convertProps$placeho","placeholderStyle","placeholderClassName","backgroundColor","durationFadeIn","Tag","itemProp","shouldReveal","shouldFadeIn","imageStyle","opacity","transition","bgColor","delayHideStyle","transitionDelay","imagePlaceholderStyle","placeholderImageProps","overflow","JSON","stringify","paddingBottom","aspectRatio","bottom","right","dangerouslySetInnerHTML","__html","_imageVariants","_image","divStyle","display","Component","defaultProps","fixedObject","shape","number","isRequired","string","srcWebp","fluidObject","oneOfType","arrayOf","bool","oneOf","_default","redefineAll","getWeak","anObject","isObject","anInstance","forOf","createArrayMethod","$has","validate","arrayFind","arrayFindIndex","id","uncaughtFrozenStore","that","_l","UncaughtFrozenStore","a","findUncaughtFrozen","store","it","value","index","splice","module","getConstructor","wrapper","NAME","IS_MAP","ADDER","C","iterable","_t","_i","undefined","data","def","ufstore","InternalMap","global","each","redefine","meta","assign","weak","NATIVE_WEAK_MAP","IS_IE11","ActiveXObject","isExtensible","arguments","methods","$WeakMap","NEED","proto","method","b","_f","result","$export","fails","defined","quot","tag","attribute","S","String","p1","replace","exec","O","P","F","test","toLowerCase","split","$find","KEY","forced","callbackfn"],"mappings":"kIAEA,EAAQ,OAAR,CAA0B,SAAS,SAAUA,GAC3C,OAAO,WACL,OAAOA,EAAWC,KAAM,KAAM,GAAI,S,0GCFtC,IAAIC,EAAyBC,EAAQ,QAErCC,EAAQC,YAAa,EACrBD,EAAQE,aAAU,EAElB,IAmJIC,EAnJAC,EAA0BN,EAAuBC,EAAQ,SAEzDM,EAAkBP,EAAuBC,EAAQ,SAEjDO,EAAiCR,EAAuBC,EAAQ,SAEhEQ,EAAYT,EAAuBC,EAAQ,SAE3CS,EAASV,EAAuBC,EAAQ,SAExCU,EAAaX,EAAuBC,EAAQ,SAe5CW,EAAe,SAAsBC,GACvC,IAAIC,GAAiB,EAAIL,EAAUL,SAAS,GAAIS,GAC5CE,EAAcD,EAAeC,YAC7BC,EAAQF,EAAeE,MACvBC,EAAWH,EAAeG,SA0B9B,OAxBIF,IACFD,EAAeI,MAAQH,SAChBD,EAAeC,aAGpBC,IACFF,EAAeK,MAAQH,SAChBF,EAAeE,OAGpBC,IAEFH,EAAeM,QAAU,SAIvBN,EAAeK,QACjBL,EAAeK,MAAQE,EAAa,GAAGC,OAAOR,EAAeK,SAG3DL,EAAeI,QACjBJ,EAAeI,MAAQG,EAAa,GAAGC,OAAOR,EAAeI,SAGxDJ,GAsBLS,EAAe,SAAsBC,GACvC,IAAIC,EAAQD,EAAKC,MACjB,QAAOA,IAAQC,KAAeC,OAAOC,WAAWH,GAAOI,UAUrDC,EAAiB,SAAwBC,GAC3C,IAAIZ,EAAQY,EAAMZ,MACdD,EAAQa,EAAMb,MAElB,OADmBc,EAARb,GAAqDD,GACpDe,KASVD,EAAoB,SAA2BE,GACjD,GAAIR,GAtCuB,SAAgCQ,GAC3D,QAASA,GAAeC,MAAMC,QAAQF,IAAgBA,EAAYG,MAAK,SAAUC,GAC/E,YAA8B,IAAhBA,EAAMb,SAoCLc,CAAuBL,GAAc,CAEpD,IAAIM,EAAaN,EAAYO,UAAUlB,GAEvC,IAAoB,IAAhBiB,EACF,OAAON,EAAYM,GAIrB,IAAIE,EAAUR,EAAYO,WAAU,SAAUH,GAC5C,YAA8B,IAAhBA,EAAMb,SAGtB,IAAiB,IAAbiB,EACF,OAAOR,EAAYQ,GAKvB,OAAOR,EAAY,IAKjBS,EAAaC,OAAOC,OAAO,IAE3BC,EAAe,SAAsBjC,GACvC,IAAIC,EAAiBF,EAAaC,GAE9BoB,EAAMH,EAAehB,GACzB,OAAO6B,EAAWV,KAAQ,GAWxBc,EAAuD,oBAArBC,kBAAoC,YAAaA,iBAAiBC,UACpGvB,EAA8B,oBAAXC,OACnBuB,EAAexB,GAAaC,OAAOwB,qBAEnCC,EAAY,IAAIC,QAwBpB,SAASC,EAAqBC,GAC5B,OAAOA,EAAcC,KAAI,SAAUC,GACjC,IAAIxB,EAAMwB,EAAMxB,IACZyB,EAASD,EAAMC,OACfC,EAAaF,EAAME,WACnBlC,EAAQgC,EAAMhC,MACdT,EAAQyC,EAAMzC,MAClB,OAAoBN,EAAON,QAAQwD,cAAclD,EAAON,QAAQyD,SAAU,CACxEC,IAAK7B,GACJ0B,GAA2BjD,EAAON,QAAQwD,cAAc,SAAU,CACnEG,KAAM,aACNtC,MAAOA,EACPiC,OAAQC,EACR3C,MAAOA,IACQN,EAAON,QAAQwD,cAAc,SAAU,CACtDnC,MAAOA,EACPiC,OAAQA,EACR1C,MAAOA,QAOb,SAASK,EAAakC,GACpB,IAAIS,EAAY,GACZC,EAAU,GASd,OARAV,EAAcW,SAAQ,SAAUC,GAC9B,OAAQA,EAAQ1C,MAAQuC,EAAYC,GAASG,KAAKD,MAO7C,GAAG7C,OAAO0C,EAAWC,GAG9B,SAASI,EAAyBd,GAChC,OAAOA,EAAcC,KAAI,SAAUc,GACjC,IAAIrC,EAAMqC,EAAMrC,IACZR,EAAQ6C,EAAM7C,MACd8C,EAAYD,EAAMC,UACtB,OAAoB7D,EAAON,QAAQwD,cAAc,SAAU,CACzDE,IAAK7B,EACLR,MAAOA,EACPiC,OAAQa,OAKd,SAASC,EAAsBjB,GAC7B,OAAOA,EAAcC,KAAI,SAAUiB,GACjC,IAAIxC,EAAMwC,EAAMxC,IACZR,EAAQgD,EAAMhD,MACdiD,EAASD,EAAMC,OACnB,OAAoBhE,EAAON,QAAQwD,cAAc,SAAU,CACzDE,IAAK7B,EACLR,MAAOA,EACPiC,OAAQgB,OAKd,SAASC,EAAuBC,EAAOC,GACrC,IAAInB,EAASkB,EAAMlB,OACfC,EAAaiB,EAAMjB,WACnBlC,EAAQmD,EAAMnD,MACdT,EAAQ4D,EAAM5D,MAKlB,MAAO,YAFQ6D,EAAS,qBAAuB,KAD/BpD,EAAQ,UAAaA,EAAQ,KAAQ,IAGV,YAJjCoD,EAASlB,EAAaD,GAI+B,MAD/C1C,EAAQ,UAAaA,EAAQ,KAAQ,IAC8B,KASrF,IAAI8D,EAAwB,SAA+BC,EAAIC,GAC7D,IAAIC,QAxGc,IAAP5E,GAAwC,oBAAXsB,QAA0BA,OAAOwB,uBACvE9C,EAAK,IAAIsB,OAAOwB,sBAAqB,SAAU+B,GAC7CA,EAAQhB,SAAQ,SAAUiB,GACxB,GAAI/B,EAAUgC,IAAID,EAAME,QAAS,CAC/B,IAAIL,EAAK5B,EAAUkC,IAAIH,EAAME,SAEzBF,EAAMI,gBAAkBJ,EAAMK,kBAAoB,KACpDnF,EAAGoF,UAAUN,EAAME,QACnBjC,EAAUsC,OAAOP,EAAME,QACvBL,WAIL,CACDW,WAAY,WAITtF,GA6FP,OALI4E,IACFA,EAASW,QAAQb,GACjB3B,EAAUyC,IAAId,EAAIC,IAGb,WACLC,EAASQ,UAAUV,GACnB3B,EAAUsC,OAAOX,KAIjBe,EAAc,SAAqBjF,GAGrC,IAAIoB,EAAMpB,EAAMoB,IAAM,QAAWpB,EAAMoB,IAAM,KAAQ,UAEjDjB,EAAQH,EAAMG,MAAQ,UAAaH,EAAMG,MAAQ,KAAQ,GACzD0C,EAAS7C,EAAM6C,OAAS,WAAc7C,EAAM6C,OAAS,KAAQ,GAC7DqC,EAAQlF,EAAMkF,MAAQ,UAAalF,EAAMkF,MAAQ,KAAQ,GACzDC,EAAMnF,EAAMmF,IAAM,QAAWnF,EAAMmF,IAAM,KAAQ,UAEjDC,EAAQpF,EAAMoF,MAAQ,UAAapF,EAAMoF,MAAQ,KAAQ,GACzDC,EAASrF,EAAMqF,OAAS,WAAcrF,EAAMqF,OAAS,KAAQ,GAC7DC,EAActF,EAAMsF,YAAc,gBAAmBtF,EAAMsF,YAAc,KAAQ,GACjF/E,EAAUP,EAAMO,QAAU,YAAeP,EAAMO,QAAU,KAAQ,GACjEgF,EAAYvF,EAAMuF,UAAY,cAAiBvF,EAAMuF,UAAY,KAAQ,GAE7E,MAAO,YAD+BvF,EAAM0C,cAlCvBC,KAAI,SAAUW,GACjC,OAAQA,EAAQR,WAAagB,EAAuBR,GAAS,GAAQ,IAAMQ,EAAuBR,MACjGkC,KAAK,IAiCuB,QAAUjF,EAAU6E,EAAQC,EAASlF,EAAQ0C,EAASzB,EAAM+D,EAAMD,EAAQI,EAAcC,EAAY,+HAMjIE,EAAc5F,EAAON,QAAQmG,YAAW,SAAU1F,EAAO2F,GAC3D,IAAIvE,EAAMpB,EAAMoB,IACZsB,EAAgB1C,EAAM0C,cACtBkD,EAAkB5F,EAAM4F,gBACxBC,EAAc7F,EAAM6F,YACpBC,EAAa9F,EAAM8F,WAEnBC,EAAyBlG,EAAON,QAAQwD,cAAciD,GAAK,EAAIpG,EAAUL,SAAS,CACpFoG,IAAKA,EACLvE,IAAKA,GACJyE,EAAa,CACdC,WAAYA,KAGd,OAAOpD,EAAcuD,OAAS,EAAiBpG,EAAON,QAAQwD,cAAc,UAAW,KAAM6C,EAAgBlD,GAAgBqD,GAAaA,KAGxIC,EAAMnG,EAAON,QAAQmG,YAAW,SAAU1F,EAAO2F,GACnD,IAAIxF,EAAQH,EAAMG,MACd0C,EAAS7C,EAAM6C,OACfzB,EAAMpB,EAAMoB,IACZ8E,EAAQlG,EAAMkG,MACdC,EAASnG,EAAMmG,OACfC,EAAUpG,EAAMoG,QAChB7F,EAAUP,EAAMO,QAChBgF,EAAYvF,EAAMuF,UAClBO,EAAa9F,EAAM8F,WACnBO,GAAa,EAAI1G,EAA+BJ,SAASS,EAAO,CAAC,QAAS,SAAU,MAAO,QAAS,SAAU,UAAW,UAAW,YAAa,eACrJ,OAAoBH,EAAON,QAAQwD,cAAc,OAAO,EAAInD,EAAUL,SAAS,CAC7E,cAAeuG,EACf3F,MAAOA,EACP0C,OAAQA,EACRzB,IAAKA,GACJiF,EAAY,CACbF,OAAQA,EACRC,QAASA,EACTT,IAAKA,EACLpF,QAASA,EACTgF,UAAWA,EACXW,OAAO,EAAItG,EAAUL,SAAS,CAC5B+G,SAAU,WACVC,IAAK,EACLC,KAAM,EACNpB,MAAO,OACPC,OAAQ,OACRoB,UAAW,QACXC,eAAgB,UACfR,SAIPF,EAAIW,UAAY,CACdT,MAAOpG,EAAWP,QAAQqH,OAC1BR,QAAStG,EAAWP,QAAQsH,KAC5BV,OAAQrG,EAAWP,QAAQsH,MAG7B,IAAIC,EAAqB,SAAUC,GAGjC,SAASD,EAAM9G,GACb,IAAIgH,GAEJA,EAAQD,EAAiBE,KAAK/H,KAAMc,IAAUd,MAGxCgI,WAAarG,GAAaoB,EAAajC,GAC7CgH,EAAMG,WAA+B,UAAlBnH,EAAMO,SAAuBP,EAAMI,SACtD4G,EAAMI,cAAgBJ,EAAMG,aAAenH,EAAMqH,QACjDL,EAAMM,cAAgBpF,GAA4BG,IAAiB2E,EAAMG,aAAeH,EAAME,WAC9F,IAAIK,EAAYP,EAAMG,YAActG,IAAcqB,IAA6B8E,EAAMM,cAWrF,OAVAN,EAAMQ,MAAQ,CACZD,UAAWA,EACXE,WAAW,EACXC,WAAW,EACXL,QAASL,EAAME,YAAclH,EAAMqH,QAErCL,EAAMW,SAAW9H,EAAON,QAAQqI,YAChCZ,EAAMa,eAAiB7H,EAAM6H,gBAAkBhI,EAAON,QAAQqI,YAC9DZ,EAAMc,kBAAoBd,EAAMc,kBAAkBC,MAAK,EAAItI,EAAwBF,SAASyH,IAC5FA,EAAMgB,UAAYhB,EAAMgB,UAAUD,MAAK,EAAItI,EAAwBF,SAASyH,IACrEA,GAvBT,EAAItH,EAAgBH,SAASuH,EAAOC,GA0BpC,IAAIkB,EAASnB,EAAM1E,UAkQnB,OAhQA6F,EAAOC,kBAAoB,WAOzB,GANIhJ,KAAKsI,MAAMD,WAA+C,mBAA3BrI,KAAKc,MAAMmI,aAC5CjJ,KAAKc,MAAMmI,YAAY,CACrBC,UAAWnG,EAAa/C,KAAKc,SAI7Bd,KAAKiI,WAAY,CACnB,IAAIkB,EAAMnJ,KAAKyI,SAASW,QAEpBD,GAAOA,EAAIE,UACbrJ,KAAK4I,sBAKXG,EAAOO,qBAAuB,WACxBtJ,KAAKuJ,kBACPvJ,KAAKuJ,oBAKTR,EAAOD,UAAY,SAAmBrC,GACpC,IAAI+C,EAASxJ,KAETA,KAAKoI,cAAgB3B,IACvBzG,KAAKuJ,iBAAmBxE,EAAsB0B,GAAK,WACjD,IAAIgD,EAAe1G,EAAayG,EAAO1I,OAElC0I,EAAOlB,MAAMD,WAAiD,mBAA7BmB,EAAO1I,MAAMmI,aACjDO,EAAO1I,MAAMmI,YAAY,CACvBC,UAAWO,IAQfD,EAAOE,SAAS,CACdrB,WAAW,IACV,WACDmB,EAAOE,SAAS,CACdnB,UAAWkB,EAKXjB,aAAcgB,EAAOf,SAASW,UAAWI,EAAOf,SAASW,QAAQO,sBAO3EZ,EAAOH,kBAAoB,WAxSD,IAA+B9H,EACrDC,EAEAmB,EAHqDpB,EAySjCd,KAAKc,MAxSzBC,EAAiBF,EAAaC,GAE9BoB,EAAMH,EAAehB,GACzB6B,EAAWV,IAAO,EAsShBlC,KAAK0J,SAAS,CACZnB,WAAW,IAGTvI,KAAKc,MAAMmG,QACbjH,KAAKc,MAAMmG,UAIf8B,EAAOa,OAAS,WACd,IAAIC,EAAgBhJ,EAAab,KAAKc,OAClCkF,EAAQ6D,EAAc7D,MACtBC,EAAM4D,EAAc5D,IACpB6D,EAAYD,EAAcC,UAC1BC,EAAsBF,EAAc7C,MACpCA,OAAgC,IAAxB+C,EAAiC,GAAKA,EAC9CC,EAAwBH,EAAcI,SACtCA,OAAqC,IAA1BD,EAAmC,GAAKA,EACnDE,EAAwBL,EAAcM,iBACtCA,OAA6C,IAA1BD,EAAmC,GAAKA,EAC3DE,EAAuBP,EAAcO,qBACrChJ,EAAQyI,EAAczI,MACtBD,EAAQ0I,EAAc1I,MACtBkJ,EAAkBR,EAAcQ,gBAChCC,EAAiBT,EAAcS,eAC/BC,EAAMV,EAAcU,IACpBC,EAAWX,EAAcW,SACzBnJ,EAAUwI,EAAcxI,QACxBgF,EAAYwD,EAAcxD,UAE1BoE,GAAqC,IAAtBzK,KAAKsI,MAAMH,QAAoBnI,KAAKsI,MAAMC,UACzDmC,GAAqC,IAAtB1K,KAAKsI,MAAMH,SAAoBnI,KAAKsI,MAAME,UACzDmC,GAAa,EAAIjK,EAAUL,SAAS,CACtCuK,QAASH,EAAe,EAAI,EAC5BI,WAAYH,EAAe,WAAaJ,EAAiB,KAAO,QAC/DL,GACCa,EAAqC,kBAApBT,EAAgC,YAAcA,EAC/DU,EAAiB,CACnBC,gBAAiBV,EAAiB,MAEhCW,GAAwB,EAAIvK,EAAUL,SAAS,CACjDuK,QAAS5K,KAAKsI,MAAMC,UAAY,EAAI,GACnCmC,GAAgBK,EAAgB,GAAId,EAAU,GAAIE,GACjDe,EAAwB,CAC1BlF,MAAOA,EACPC,IAAMjG,KAAKsI,MAAMD,UAAkB,GAANpC,EAC7Be,MAAOiE,EACPnB,UAAWM,EACXI,SAAUA,GAGZ,GAAIpJ,EAAO,CACT,IAAIoC,EAAgBpC,EAChBmB,EAAQN,EAAkBb,GAC9B,OAAoBT,EAAON,QAAQwD,cAAc0G,EAAK,CACpDT,WAAYA,GAAwB,IAAM,wBAC1C9C,OAAO,EAAItG,EAAUL,SAAS,CAC5B+G,SAAU,WACV+D,SAAU,UACTnE,GACHP,IAAKzG,KAAK8I,UACV/E,IAAK,SAAWqH,KAAKC,UAAU9I,EAAMoB,SACvBhD,EAAON,QAAQwD,cAAc0G,EAAK,CAChD,eAAe,EACfvD,MAAO,CACLd,MAAO,OACPoF,cAAe,IAAM/I,EAAMgJ,YAAc,OAEzCT,GAAwBnK,EAAON,QAAQwD,cAAc0G,EAAK,CAC5D,eAAe,EACfvE,MAAOA,EACPgB,OAAO,EAAItG,EAAUL,SAAS,CAC5BgK,gBAAiBS,EACjB1D,SAAU,WACVC,IAAK,EACLmE,OAAQ,EACRZ,QAAU5K,KAAKsI,MAAMC,UAAgB,EAAJ,EACjCkD,MAAO,EACPnE,KAAM,GACLoD,GAAgBK,KACjBxI,EAAMoC,QAAuBhE,EAAON,QAAQwD,cAAc0C,EAAa,CACzEK,YAAY,EACZH,IAAKzG,KAAK2I,eACVzG,IAAKK,EAAMoC,OACXgC,YAAauE,EACb1H,cAAeA,EACfkD,gBAAiBjC,IACflC,EAAMiC,WAA0B7D,EAAON,QAAQwD,cAAc0C,EAAa,CAC5EK,YAAY,EACZH,IAAKzG,KAAK2I,eACVzG,IAAKK,EAAMiC,UACXmC,YAAauE,EACb1H,cAAeA,EACfkD,gBAAiBpC,IACftE,KAAKsI,MAAMD,WAA0B1H,EAAON,QAAQwD,cAAc,UAAW,KAAMN,EAAqBC,GAA6B7C,EAAON,QAAQwD,cAAciD,EAAK,CACzKb,IAAKA,EACLD,MAAOA,EACP/E,MAAOsB,EAAMtB,MACbiB,IAAKK,EAAML,IACXkE,YAAapG,KAAKc,MAAMsF,YACxBzC,OAAQpB,EAAMoB,OACdqD,MAAO2D,EACPlE,IAAKzG,KAAKyI,SACVxB,OAAQjH,KAAK4I,kBACb1B,QAASlH,KAAKc,MAAMoG,QACpBsD,SAAUA,EACVnJ,QAASA,EACTgF,UAAWA,KACRrG,KAAKkI,aAA4BvH,EAAON,QAAQwD,cAAc,WAAY,CAC7E6H,wBAAyB,CACvBC,OAAQ5F,GAAY,EAAIrF,EAAUL,SAAS,CACzC4F,IAAKA,EACLD,MAAOA,EACP3E,QAASA,GACRkB,EAAO,CACRiB,cAAeA,SAMvB,GAAIrC,EAAO,CACT,IAAIyK,EAAiBzK,EAEjB0K,EAAS5J,EAAkBd,GAE3B2K,GAAW,EAAIpL,EAAUL,SAAS,CACpC+G,SAAU,WACV+D,SAAU,SACVY,QAAS,eACT7F,MAAO2F,EAAO3F,MACdC,OAAQ0F,EAAO1F,QACda,GAMH,MAJsB,YAAlBA,EAAM+E,gBACDD,EAASC,QAGEpL,EAAON,QAAQwD,cAAc0G,EAAK,CACpDT,WAAYA,GAAwB,IAAM,wBAC1C9C,MAAO8E,EACPrF,IAAKzG,KAAK8I,UACV/E,IAAK,SAAWqH,KAAKC,UAAUQ,EAAOlI,SACrCmH,GAAwBnK,EAAON,QAAQwD,cAAc0G,EAAK,CAC3D,eAAe,EACfvE,MAAOA,EACPgB,OAAO,EAAItG,EAAUL,SAAS,CAC5BgK,gBAAiBS,EACjB5E,MAAO2F,EAAO3F,MACd0E,QAAU5K,KAAKsI,MAAMC,UAAgB,EAAJ,EACjCpC,OAAQ0F,EAAO1F,QACduE,GAAgBK,KACjBc,EAAOlH,QAAuBhE,EAAON,QAAQwD,cAAc0C,EAAa,CAC1EK,YAAY,EACZH,IAAKzG,KAAK2I,eACVzG,IAAK2J,EAAOlH,OACZgC,YAAauE,EACb1H,cAAeoI,EACflF,gBAAiBjC,IACfoH,EAAOrH,WAA0B7D,EAAON,QAAQwD,cAAc0C,EAAa,CAC7EK,YAAY,EACZH,IAAKzG,KAAK2I,eACVzG,IAAK2J,EAAOrH,UACZmC,YAAauE,EACb1H,cAAeoI,EACflF,gBAAiBpC,IACftE,KAAKsI,MAAMD,WAA0B1H,EAAON,QAAQwD,cAAc,UAAW,KAAMN,EAAqBqI,GAA8BjL,EAAON,QAAQwD,cAAciD,EAAK,CAC1Kb,IAAKA,EACLD,MAAOA,EACPE,MAAO2F,EAAO3F,MACdC,OAAQ0F,EAAO1F,OACflF,MAAO4K,EAAO5K,MACdiB,IAAK2J,EAAO3J,IACZkE,YAAapG,KAAKc,MAAMsF,YACxBzC,OAAQkI,EAAOlI,OACfqD,MAAO2D,EACPlE,IAAKzG,KAAKyI,SACVxB,OAAQjH,KAAK4I,kBACb1B,QAASlH,KAAKc,MAAMoG,QACpBsD,SAAUA,EACVnJ,QAASA,EACTgF,UAAWA,KACRrG,KAAKkI,aAA4BvH,EAAON,QAAQwD,cAAc,WAAY,CAC7E6H,wBAAyB,CACvBC,OAAQ5F,GAAY,EAAIrF,EAAUL,SAAS,CACzC4F,IAAKA,EACLD,MAAOA,EACP3E,QAASA,GACRwK,EAAQ,CACTrI,cAAeoI,SAMvB,OAAO,MAGFhE,EA7RgB,CA8RvBjH,EAAON,QAAQ2L,WAEjBpE,EAAMqE,aAAe,CACnB9D,QAAQ,EACRmC,eAAgB,IAChBrE,IAAK,GACLsE,IAAK,MAGLlJ,QAAS,QAGX,IAAI6K,EAActL,EAAWP,QAAQ8L,MAAM,CACzCjG,MAAOtF,EAAWP,QAAQ+L,OAAOC,WACjClG,OAAQvF,EAAWP,QAAQ+L,OAAOC,WAClCnK,IAAKtB,EAAWP,QAAQiM,OAAOD,WAC/B1I,OAAQ/C,EAAWP,QAAQiM,OAAOD,WAClC1H,OAAQ/D,EAAWP,QAAQiM,OAC3B9H,UAAW5D,EAAWP,QAAQiM,OAC9BC,QAAS3L,EAAWP,QAAQiM,OAC5B1I,WAAYhD,EAAWP,QAAQiM,OAC/B5K,MAAOd,EAAWP,QAAQiM,SAGxBE,EAAc5L,EAAWP,QAAQ8L,MAAM,CACzCZ,YAAa3K,EAAWP,QAAQ+L,OAAOC,WACvCnK,IAAKtB,EAAWP,QAAQiM,OAAOD,WAC/B1I,OAAQ/C,EAAWP,QAAQiM,OAAOD,WAClCpL,MAAOL,EAAWP,QAAQiM,OAAOD,WACjC1H,OAAQ/D,EAAWP,QAAQiM,OAC3B9H,UAAW5D,EAAWP,QAAQiM,OAC9BC,QAAS3L,EAAWP,QAAQiM,OAC5B1I,WAAYhD,EAAWP,QAAQiM,OAC/B5K,MAAOd,EAAWP,QAAQiM,SAO5B1E,EAAMH,UAAY,CAChBzG,YAAakL,EACbjL,MAAOuL,EACPrL,MAAOP,EAAWP,QAAQoM,UAAU,CAACP,EAAatL,EAAWP,QAAQqM,QAAQR,KAC7E9K,MAAOR,EAAWP,QAAQoM,UAAU,CAACD,EAAa5L,EAAWP,QAAQqM,QAAQF,KAC7ErE,OAAQvH,EAAWP,QAAQsM,KAC3BrC,eAAgB1J,EAAWP,QAAQ+L,OACnCpG,MAAOpF,EAAWP,QAAQiM,OAC1BrG,IAAKrF,EAAWP,QAAQiM,OACxBxC,UAAWlJ,EAAWP,QAAQoM,UAAU,CAAC7L,EAAWP,QAAQiM,OAAQ1L,EAAWP,QAAQqH,SAEvFxG,SAAUN,EAAWP,QAAQsM,KAC7BvG,YAAaxF,EAAWP,QAAQoM,UAAU,CAAC7L,EAAWP,QAAQiM,OAAQ1L,EAAWP,QAAQsM,OACzF3F,MAAOpG,EAAWP,QAAQqH,OAC1BuC,SAAUrJ,EAAWP,QAAQqH,OAC7ByC,iBAAkBvJ,EAAWP,QAAQqH,OACrC0C,qBAAsBxJ,EAAWP,QAAQiM,OACzCjC,gBAAiBzJ,EAAWP,QAAQoM,UAAU,CAAC7L,EAAWP,QAAQiM,OAAQ1L,EAAWP,QAAQsM,OAC7F1F,OAAQrG,EAAWP,QAAQsH,KAC3BT,QAAStG,EAAWP,QAAQsH,KAC5BsB,YAAarI,EAAWP,QAAQsH,KAChC4C,IAAK3J,EAAWP,QAAQiM,OACxB9B,SAAU5J,EAAWP,QAAQiM,OAC7BjL,QAAST,EAAWP,QAAQuM,MAAM,CAAC,OAAQ,OAAQ,UACnDvG,UAAWzF,EAAWP,QAAQsM,MAEhC,IAAIE,EAAWjF,EACfzH,EAAQE,QAAUwM,G,kCClsBlB,IAAIC,EAAc,EAAQ,QACtBC,EAAU,EAAQ,QAAWA,QAC7BC,EAAW,EAAQ,QACnBC,EAAW,EAAQ,QACnBC,EAAa,EAAQ,QACrBC,EAAQ,EAAQ,QAChBC,EAAoB,EAAQ,QAC5BC,EAAO,EAAQ,QACfC,EAAW,EAAQ,QACnBC,EAAYH,EAAkB,GAC9BI,EAAiBJ,EAAkB,GACnCK,EAAK,EAGLC,EAAsB,SAAUC,GAClC,OAAOA,EAAKC,KAAOD,EAAKC,GAAK,IAAIC,IAE/BA,EAAsB,WACxB7N,KAAK8N,EAAI,IAEPC,EAAqB,SAAUC,EAAOjK,GACxC,OAAOwJ,EAAUS,EAAMF,GAAG,SAAUG,GAClC,OAAOA,EAAG,KAAOlK,MAGrB8J,EAAoB3K,UAAY,CAC9BqC,IAAK,SAAUxB,GACb,IAAIqB,EAAQ2I,EAAmB/N,KAAM+D,GACrC,GAAIqB,EAAO,OAAOA,EAAM,IAE1BC,IAAK,SAAUtB,GACb,QAASgK,EAAmB/N,KAAM+D,IAEpC+B,IAAK,SAAU/B,EAAKmK,GAClB,IAAI9I,EAAQ2I,EAAmB/N,KAAM+D,GACjCqB,EAAOA,EAAM,GAAK8I,EACjBlO,KAAK8N,EAAEzJ,KAAK,CAACN,EAAKmK,KAEzB,OAAU,SAAUnK,GAClB,IAAIoK,EAAQX,EAAexN,KAAK8N,GAAG,SAAUG,GAC3C,OAAOA,EAAG,KAAOlK,KAGnB,OADKoK,GAAOnO,KAAK8N,EAAEM,OAAOD,EAAO,MACvBA,IAIdE,EAAOlO,QAAU,CACfmO,eAAgB,SAAUC,EAASC,EAAMC,EAAQC,GAC/C,IAAIC,EAAIJ,GAAQ,SAAUZ,EAAMiB,GAC9B1B,EAAWS,EAAMgB,EAAGH,EAAM,MAC1Bb,EAAKkB,GAAKL,EACVb,EAAKmB,GAAKrB,IACVE,EAAKC,QAAKmB,EACMA,MAAZH,GAAuBzB,EAAMyB,EAAUH,EAAQd,EAAKe,GAAQf,MAoBlE,OAlBAb,EAAY6B,EAAEzL,UAAW,CAGvB,OAAU,SAAUa,GAClB,IAAKkJ,EAASlJ,GAAM,OAAO,EAC3B,IAAIiL,EAAOjC,EAAQhJ,GACnB,OAAa,IAATiL,EAAsBtB,EAAoBJ,EAAStN,KAAMwO,IAAe,OAAEzK,GACvEiL,GAAQ3B,EAAK2B,EAAMhP,KAAK8O,YAAcE,EAAKhP,KAAK8O,KAIzDzJ,IAAK,SAAatB,GAChB,IAAKkJ,EAASlJ,GAAM,OAAO,EAC3B,IAAIiL,EAAOjC,EAAQhJ,GACnB,OAAa,IAATiL,EAAsBtB,EAAoBJ,EAAStN,KAAMwO,IAAOnJ,IAAItB,GACjEiL,GAAQ3B,EAAK2B,EAAMhP,KAAK8O,OAG5BH,GAETM,IAAK,SAAUtB,EAAM5J,EAAKmK,GACxB,IAAIc,EAAOjC,EAAQC,EAASjJ,IAAM,GAGlC,OAFa,IAATiL,EAAetB,EAAoBC,GAAM7H,IAAI/B,EAAKmK,GACjDc,EAAKrB,EAAKmB,IAAMZ,EACdP,GAETuB,QAASxB,I,kCClFX,IAcIyB,EAdAC,EAAS,EAAQ,QACjBC,EAAO,EAAQ,OAAR,CAA4B,GACnCC,EAAW,EAAQ,QACnBC,EAAO,EAAQ,QACfC,EAAS,EAAQ,QACjBC,EAAO,EAAQ,QACfxC,EAAW,EAAQ,QACnBK,EAAW,EAAQ,QACnBoC,EAAkB,EAAQ,QAC1BC,GAAWP,EAAOQ,eAAiB,kBAAmBR,EAEtDrC,EAAUwC,EAAKxC,QACf8C,EAAehN,OAAOgN,aACtBnC,EAAsB+B,EAAKP,QAG3BX,EAAU,SAAUhJ,GACtB,OAAO,WACL,OAAOA,EAAIvF,KAAM8P,UAAU/I,OAAS,EAAI+I,UAAU,QAAKf,KAIvDgB,EAAU,CAEZxK,IAAK,SAAaxB,GAChB,GAAIkJ,EAASlJ,GAAM,CACjB,IAAIiL,EAAOjC,EAAQhJ,GACnB,OAAa,IAATiL,EAAsBtB,EAAoBJ,EAAStN,KAjB9C,YAiB+DuF,IAAIxB,GACrEiL,EAAOA,EAAKhP,KAAK8O,SAAMC,IAIlCjJ,IAAK,SAAa/B,EAAKmK,GACrB,OAAOuB,EAAKR,IAAI3B,EAAStN,KAvBd,WAuB+B+D,EAAKmK,KAK/C8B,EAAW3B,EAAOlO,QAAU,EAAQ,OAAR,CA5BjB,UA4BoDoO,EAASwB,EAASN,GAAM,GAAM,GAG7FC,GAAmBC,IAErBH,GADAL,EAAcM,EAAKnB,eAAeC,EAhCrB,YAiCMrL,UAAW6M,GAC9BR,EAAKU,MAAO,EACZZ,EAAK,CAAC,SAAU,MAAO,MAAO,QAAQ,SAAUtL,GAC9C,IAAImM,EAAQF,EAAS9M,UACjBiN,EAASD,EAAMnM,GACnBuL,EAASY,EAAOnM,GAAK,SAAU+J,EAAGsC,GAEhC,GAAInD,EAASa,KAAO+B,EAAa/B,GAAI,CAC9B9N,KAAKqQ,KAAIrQ,KAAKqQ,GAAK,IAAIlB,GAC5B,IAAImB,EAAStQ,KAAKqQ,GAAGtM,GAAK+J,EAAGsC,GAC7B,MAAc,OAAPrM,EAAe/D,KAAOsQ,EAE7B,OAAOH,EAAOpI,KAAK/H,KAAM8N,EAAGsC,W,uBCxDpC,IAAIG,EAAU,EAAQ,QAClBC,EAAQ,EAAQ,QAChBC,EAAU,EAAQ,QAClBC,EAAO,KAEP3Q,EAAa,SAAUuM,EAAQqE,EAAKC,EAAW1C,GACjD,IAAI2C,EAAIC,OAAOL,EAAQnE,IACnByE,EAAK,IAAMJ,EAEf,MADkB,KAAdC,IAAkBG,GAAM,IAAMH,EAAY,KAAOE,OAAO5C,GAAO8C,QAAQN,EAAM,UAAY,KACtFK,EAAK,IAAMF,EAAI,KAAOF,EAAM,KAErCtC,EAAOlO,QAAU,SAAUqO,EAAMyC,GAC/B,IAAIC,EAAI,GACRA,EAAE1C,GAAQyC,EAAKlR,GACfwQ,EAAQA,EAAQY,EAAIZ,EAAQa,EAAIZ,GAAM,WACpC,IAAIa,EAAO,GAAG7C,GAAM,KACpB,OAAO6C,IAASA,EAAKC,eAAiBD,EAAKE,MAAM,KAAKxK,OAAS,KAC7D,SAAUmK,K,kCCfhB,IAAIX,EAAU,EAAQ,QAClBiB,EAAQ,EAAQ,OAAR,CAA4B,GACpCC,EAAM,YACNC,GAAS,EAETD,IAAO,IAAIrP,MAAM,GAAGqP,IAAK,WAAcC,GAAS,KACpDnB,EAAQA,EAAQY,EAAIZ,EAAQa,EAAIM,EAAQ,QAAS,CAC/ChP,UAAW,SAAmBiP,GAC5B,OAAOH,EAAMxR,KAAM2R,EAAY7B,UAAU/I,OAAS,EAAI+I,UAAU,QAAKf,MAGzE,EAAQ,OAAR,CAAiC0C","file":"2778dba880b27ac03d88a3ddd7add8b9f7440055-91ce4ca41a921669755f.js","sourcesContent":["'use strict';\n// B.2.3.6 String.prototype.fixed()\nrequire('./_string-html')('fixed', function (createHTML) {\n return function fixed() {\n return createHTML(this, 'tt', '', '');\n };\n});\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar logDeprecationNotice = function logDeprecationNotice(prop, replacement) {\n if (process.env.NODE_ENV === \"production\") {\n return;\n }\n\n console.log(\"\\n The \\\"\" + prop + \"\\\" prop is now deprecated and will be removed in the next major version\\n of \\\"gatsby-image\\\".\\n \");\n\n if (replacement) {\n console.log(\"Please use \" + replacement + \" instead of \\\"\" + prop + \"\\\".\");\n }\n}; // Handle legacy props during their deprecation phase\n\n\nvar convertProps = function convertProps(props) {\n var convertedProps = (0, _extends2.default)({}, props);\n var resolutions = convertedProps.resolutions,\n sizes = convertedProps.sizes,\n critical = convertedProps.critical;\n\n if (resolutions) {\n convertedProps.fixed = resolutions;\n delete convertedProps.resolutions;\n }\n\n if (sizes) {\n convertedProps.fluid = sizes;\n delete convertedProps.sizes;\n }\n\n if (critical) {\n logDeprecationNotice(\"critical\", \"the native \\\"loading\\\" attribute\");\n convertedProps.loading = \"eager\";\n } // convert fluid & fixed to arrays so we only have to work with arrays\n\n\n if (convertedProps.fluid) {\n convertedProps.fluid = groupByMedia([].concat(convertedProps.fluid));\n }\n\n if (convertedProps.fixed) {\n convertedProps.fixed = groupByMedia([].concat(convertedProps.fixed));\n }\n\n return convertedProps;\n};\n/**\n * Checks if fluid or fixed are art-direction arrays.\n *\n * @param currentData {{media?: string}[]} The props to check for images.\n * @return {boolean}\n */\n\n\nvar hasArtDirectionSupport = function hasArtDirectionSupport(currentData) {\n return !!currentData && Array.isArray(currentData) && currentData.some(function (image) {\n return typeof image.media !== \"undefined\";\n });\n};\n/**\n * Tries to detect if a media query matches the current viewport.\n * @property media {{media?: string}} A media query string.\n * @return {boolean}\n */\n\n\nvar matchesMedia = function matchesMedia(_ref) {\n var media = _ref.media;\n return media ? isBrowser && !!window.matchMedia(media).matches : false;\n};\n/**\n * Find the source of an image to use as a key in the image cache.\n * Use `the first image in either `fixed` or `fluid`\n * @param {{fluid: {src: string, media?: string}[], fixed: {src: string, media?: string}[]}} args\n * @return {string}\n */\n\n\nvar getImageSrcKey = function getImageSrcKey(_ref2) {\n var fluid = _ref2.fluid,\n fixed = _ref2.fixed;\n var data = fluid ? getCurrentSrcData(fluid) : getCurrentSrcData(fixed);\n return data.src;\n};\n/**\n * Returns the current src - Preferably with art-direction support.\n * @param currentData {{media?: string}[]} The fluid or fixed image array.\n * @return {{src: string, media?: string}}\n */\n\n\nvar getCurrentSrcData = function getCurrentSrcData(currentData) {\n if (isBrowser && hasArtDirectionSupport(currentData)) {\n // Do we have an image for the current Viewport?\n var foundMedia = currentData.findIndex(matchesMedia);\n\n if (foundMedia !== -1) {\n return currentData[foundMedia];\n } // No media matches, select first element without a media condition\n\n\n var noMedia = currentData.findIndex(function (image) {\n return typeof image.media === \"undefined\";\n });\n\n if (noMedia !== -1) {\n return currentData[noMedia];\n }\n } // Else return the first image.\n\n\n return currentData[0];\n}; // Cache if we've seen an image before so we don't bother with\n// lazy-loading & fading in on subsequent mounts.\n\n\nvar imageCache = Object.create({});\n\nvar inImageCache = function inImageCache(props) {\n var convertedProps = convertProps(props); // Find src\n\n var src = getImageSrcKey(convertedProps);\n return imageCache[src] || false;\n};\n\nvar activateCacheForImage = function activateCacheForImage(props) {\n var convertedProps = convertProps(props); // Find src\n\n var src = getImageSrcKey(convertedProps);\n imageCache[src] = true;\n}; // Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\n\n\nvar hasNativeLazyLoadSupport = typeof HTMLImageElement !== \"undefined\" && \"loading\" in HTMLImageElement.prototype;\nvar isBrowser = typeof window !== \"undefined\";\nvar hasIOSupport = isBrowser && window.IntersectionObserver;\nvar io;\nvar listeners = new WeakMap();\n\nfunction getIO() {\n if (typeof io === \"undefined\" && typeof window !== \"undefined\" && window.IntersectionObserver) {\n io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (listeners.has(entry.target)) {\n var cb = listeners.get(entry.target); // Edge doesn't currently support isIntersecting, so also test for an intersectionRatio > 0\n\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(entry.target);\n listeners.delete(entry.target);\n cb();\n }\n }\n });\n }, {\n rootMargin: \"200px\"\n });\n }\n\n return io;\n}\n\nfunction generateImageSources(imageVariants) {\n return imageVariants.map(function (_ref3) {\n var src = _ref3.src,\n srcSet = _ref3.srcSet,\n srcSetWebp = _ref3.srcSetWebp,\n media = _ref3.media,\n sizes = _ref3.sizes;\n return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {\n key: src\n }, srcSetWebp && /*#__PURE__*/_react.default.createElement(\"source\", {\n type: \"image/webp\",\n media: media,\n srcSet: srcSetWebp,\n sizes: sizes\n }), /*#__PURE__*/_react.default.createElement(\"source\", {\n media: media,\n srcSet: srcSet,\n sizes: sizes\n }));\n });\n} // Return an array ordered by elements having a media prop, does not use\n// native sort, as a stable sort is not guaranteed by all browsers/versions\n\n\nfunction groupByMedia(imageVariants) {\n var withMedia = [];\n var without = [];\n imageVariants.forEach(function (variant) {\n return (variant.media ? withMedia : without).push(variant);\n });\n\n if (without.length > 1 && process.env.NODE_ENV !== \"production\") {\n console.warn(\"We've found \" + without.length + \" sources without a media property. They might be ignored by the browser, see: https://www.gatsbyjs.org/packages/gatsby-image/#art-directing-multiple-images\");\n }\n\n return [].concat(withMedia, without);\n}\n\nfunction generateTracedSVGSources(imageVariants) {\n return imageVariants.map(function (_ref4) {\n var src = _ref4.src,\n media = _ref4.media,\n tracedSVG = _ref4.tracedSVG;\n return /*#__PURE__*/_react.default.createElement(\"source\", {\n key: src,\n media: media,\n srcSet: tracedSVG\n });\n });\n}\n\nfunction generateBase64Sources(imageVariants) {\n return imageVariants.map(function (_ref5) {\n var src = _ref5.src,\n media = _ref5.media,\n base64 = _ref5.base64;\n return /*#__PURE__*/_react.default.createElement(\"source\", {\n key: src,\n media: media,\n srcSet: base64\n });\n });\n}\n\nfunction generateNoscriptSource(_ref6, isWebp) {\n var srcSet = _ref6.srcSet,\n srcSetWebp = _ref6.srcSetWebp,\n media = _ref6.media,\n sizes = _ref6.sizes;\n var src = isWebp ? srcSetWebp : srcSet;\n var mediaAttr = media ? \"media=\\\"\" + media + \"\\\" \" : \"\";\n var typeAttr = isWebp ? \"type='image/webp' \" : \"\";\n var sizesAttr = sizes ? \"sizes=\\\"\" + sizes + \"\\\" \" : \"\";\n return \"\";\n}\n\nfunction generateNoscriptSources(imageVariants) {\n return imageVariants.map(function (variant) {\n return (variant.srcSetWebp ? generateNoscriptSource(variant, true) : \"\") + generateNoscriptSource(variant);\n }).join(\"\");\n}\n\nvar listenToIntersections = function listenToIntersections(el, cb) {\n var observer = getIO();\n\n if (observer) {\n observer.observe(el);\n listeners.set(el, cb);\n }\n\n return function () {\n observer.unobserve(el);\n listeners.delete(el);\n };\n};\n\nvar noscriptImg = function noscriptImg(props) {\n // Check if prop exists before adding each attribute to the string output below to prevent\n // HTML validation issues caused by empty values like width=\"\" and height=\"\"\n var src = props.src ? \"src=\\\"\" + props.src + \"\\\" \" : \"src=\\\"\\\" \"; // required attribute\n\n var sizes = props.sizes ? \"sizes=\\\"\" + props.sizes + \"\\\" \" : \"\";\n var srcSet = props.srcSet ? \"srcset=\\\"\" + props.srcSet + \"\\\" \" : \"\";\n var title = props.title ? \"title=\\\"\" + props.title + \"\\\" \" : \"\";\n var alt = props.alt ? \"alt=\\\"\" + props.alt + \"\\\" \" : \"alt=\\\"\\\" \"; // required attribute\n\n var width = props.width ? \"width=\\\"\" + props.width + \"\\\" \" : \"\";\n var height = props.height ? \"height=\\\"\" + props.height + \"\\\" \" : \"\";\n var crossOrigin = props.crossOrigin ? \"crossorigin=\\\"\" + props.crossOrigin + \"\\\" \" : \"\";\n var loading = props.loading ? \"loading=\\\"\" + props.loading + \"\\\" \" : \"\";\n var draggable = props.draggable ? \"draggable=\\\"\" + props.draggable + \"\\\" \" : \"\";\n var sources = generateNoscriptSources(props.imageVariants);\n return \"\" + sources + \"\";\n}; // Earlier versions of gatsby-image during the 2.x cycle did not wrap\n// the `Img` component in a `picture` element. This maintains compatibility\n// until a breaking change can be introduced in the next major release\n\n\nvar Placeholder = _react.default.forwardRef(function (props, ref) {\n var src = props.src,\n imageVariants = props.imageVariants,\n generateSources = props.generateSources,\n spreadProps = props.spreadProps,\n ariaHidden = props.ariaHidden;\n\n var baseImage = /*#__PURE__*/_react.default.createElement(Img, (0, _extends2.default)({\n ref: ref,\n src: src\n }, spreadProps, {\n ariaHidden: ariaHidden\n }));\n\n return imageVariants.length > 1 ? /*#__PURE__*/_react.default.createElement(\"picture\", null, generateSources(imageVariants), baseImage) : baseImage;\n});\n\nvar Img = _react.default.forwardRef(function (props, ref) {\n var sizes = props.sizes,\n srcSet = props.srcSet,\n src = props.src,\n style = props.style,\n onLoad = props.onLoad,\n onError = props.onError,\n loading = props.loading,\n draggable = props.draggable,\n ariaHidden = props.ariaHidden,\n otherProps = (0, _objectWithoutPropertiesLoose2.default)(props, [\"sizes\", \"srcSet\", \"src\", \"style\", \"onLoad\", \"onError\", \"loading\", \"draggable\", \"ariaHidden\"]);\n return /*#__PURE__*/_react.default.createElement(\"img\", (0, _extends2.default)({\n \"aria-hidden\": ariaHidden,\n sizes: sizes,\n srcSet: srcSet,\n src: src\n }, otherProps, {\n onLoad: onLoad,\n onError: onError,\n ref: ref,\n loading: loading,\n draggable: draggable,\n style: (0, _extends2.default)({\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center\"\n }, style)\n }));\n});\n\nImg.propTypes = {\n style: _propTypes.default.object,\n onError: _propTypes.default.func,\n onLoad: _propTypes.default.func\n};\n\nvar Image = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(Image, _React$Component);\n\n function Image(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // If this image has already been loaded before then we can assume it's\n // already in the browser cache so it's cheap to just show directly.\n\n _this.seenBefore = isBrowser && inImageCache(props);\n _this.isCritical = props.loading === \"eager\" || props.critical;\n _this.addNoScript = !(_this.isCritical && !props.fadeIn);\n _this.useIOSupport = !hasNativeLazyLoadSupport && hasIOSupport && !_this.isCritical && !_this.seenBefore;\n var isVisible = _this.isCritical || isBrowser && (hasNativeLazyLoadSupport || !_this.useIOSupport);\n _this.state = {\n isVisible: isVisible,\n imgLoaded: false,\n imgCached: false,\n fadeIn: !_this.seenBefore && props.fadeIn\n };\n _this.imageRef = _react.default.createRef();\n _this.placeholderRef = props.placeholderRef || _react.default.createRef();\n _this.handleImageLoaded = _this.handleImageLoaded.bind((0, _assertThisInitialized2.default)(_this));\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = Image.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n if (this.state.isVisible && typeof this.props.onStartLoad === \"function\") {\n this.props.onStartLoad({\n wasCached: inImageCache(this.props)\n });\n }\n\n if (this.isCritical) {\n var img = this.imageRef.current;\n\n if (img && img.complete) {\n this.handleImageLoaded();\n }\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.cleanUpListeners) {\n this.cleanUpListeners();\n }\n } // Specific to IntersectionObserver based lazy-load support\n ;\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.useIOSupport && ref) {\n this.cleanUpListeners = listenToIntersections(ref, function () {\n var imageInCache = inImageCache(_this2.props);\n\n if (!_this2.state.isVisible && typeof _this2.props.onStartLoad === \"function\") {\n _this2.props.onStartLoad({\n wasCached: imageInCache\n });\n } // imgCached and imgLoaded must update after isVisible,\n // Once isVisible is true, imageRef becomes accessible, which imgCached needs access to.\n // imgLoaded and imgCached are in a 2nd setState call to be changed together,\n // avoiding initiating unnecessary animation frames from style changes.\n\n\n _this2.setState({\n isVisible: true\n }, function () {\n _this2.setState({\n imgLoaded: imageInCache,\n // `currentSrc` should be a string, but can be `undefined` in IE,\n // !! operator validates the value is not undefined/null/\"\"\n // for lazyloaded components this might be null\n // TODO fix imgCached behaviour as it's now false when it's lazyloaded\n imgCached: !!(_this2.imageRef.current && _this2.imageRef.current.currentSrc)\n });\n });\n });\n }\n };\n\n _proto.handleImageLoaded = function handleImageLoaded() {\n activateCacheForImage(this.props);\n this.setState({\n imgLoaded: true\n });\n\n if (this.props.onLoad) {\n this.props.onLoad();\n }\n };\n\n _proto.render = function render() {\n var _convertProps = convertProps(this.props),\n title = _convertProps.title,\n alt = _convertProps.alt,\n className = _convertProps.className,\n _convertProps$style = _convertProps.style,\n style = _convertProps$style === void 0 ? {} : _convertProps$style,\n _convertProps$imgStyl = _convertProps.imgStyle,\n imgStyle = _convertProps$imgStyl === void 0 ? {} : _convertProps$imgStyl,\n _convertProps$placeho = _convertProps.placeholderStyle,\n placeholderStyle = _convertProps$placeho === void 0 ? {} : _convertProps$placeho,\n placeholderClassName = _convertProps.placeholderClassName,\n fluid = _convertProps.fluid,\n fixed = _convertProps.fixed,\n backgroundColor = _convertProps.backgroundColor,\n durationFadeIn = _convertProps.durationFadeIn,\n Tag = _convertProps.Tag,\n itemProp = _convertProps.itemProp,\n loading = _convertProps.loading,\n draggable = _convertProps.draggable;\n\n var shouldReveal = this.state.fadeIn === false || this.state.imgLoaded;\n var shouldFadeIn = this.state.fadeIn === true && !this.state.imgCached;\n var imageStyle = (0, _extends2.default)({\n opacity: shouldReveal ? 1 : 0,\n transition: shouldFadeIn ? \"opacity \" + durationFadeIn + \"ms\" : \"none\"\n }, imgStyle);\n var bgColor = typeof backgroundColor === \"boolean\" ? \"lightgray\" : backgroundColor;\n var delayHideStyle = {\n transitionDelay: durationFadeIn + \"ms\"\n };\n var imagePlaceholderStyle = (0, _extends2.default)({\n opacity: this.state.imgLoaded ? 0 : 1\n }, shouldFadeIn && delayHideStyle, {}, imgStyle, {}, placeholderStyle);\n var placeholderImageProps = {\n title: title,\n alt: !this.state.isVisible ? alt : \"\",\n style: imagePlaceholderStyle,\n className: placeholderClassName,\n itemProp: itemProp\n };\n\n if (fluid) {\n var imageVariants = fluid;\n var image = getCurrentSrcData(fluid);\n return /*#__PURE__*/_react.default.createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: (0, _extends2.default)({\n position: \"relative\",\n overflow: \"hidden\"\n }, style),\n ref: this.handleRef,\n key: \"fluid-\" + JSON.stringify(image.srcSet)\n }, /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n style: {\n width: \"100%\",\n paddingBottom: 100 / image.aspectRatio + \"%\"\n }\n }), bgColor && /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n title: title,\n style: (0, _extends2.default)({\n backgroundColor: bgColor,\n position: \"absolute\",\n top: 0,\n bottom: 0,\n opacity: !this.state.imgLoaded ? 1 : 0,\n right: 0,\n left: 0\n }, shouldFadeIn && delayHideStyle)\n }), image.base64 && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateBase64Sources\n }), image.tracedSVG && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && /*#__PURE__*/_react.default.createElement(\"picture\", null, generateImageSources(imageVariants), /*#__PURE__*/_react.default.createElement(Img, {\n alt: alt,\n title: title,\n sizes: image.sizes,\n src: image.src,\n crossOrigin: this.props.crossOrigin,\n srcSet: image.srcSet,\n style: imageStyle,\n ref: this.imageRef,\n onLoad: this.handleImageLoaded,\n onError: this.props.onError,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && /*#__PURE__*/_react.default.createElement(\"noscript\", {\n dangerouslySetInnerHTML: {\n __html: noscriptImg((0, _extends2.default)({\n alt: alt,\n title: title,\n loading: loading\n }, image, {\n imageVariants: imageVariants\n }))\n }\n }));\n }\n\n if (fixed) {\n var _imageVariants = fixed;\n\n var _image = getCurrentSrcData(fixed);\n\n var divStyle = (0, _extends2.default)({\n position: \"relative\",\n overflow: \"hidden\",\n display: \"inline-block\",\n width: _image.width,\n height: _image.height\n }, style);\n\n if (style.display === \"inherit\") {\n delete divStyle.display;\n }\n\n return /*#__PURE__*/_react.default.createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: divStyle,\n ref: this.handleRef,\n key: \"fixed-\" + JSON.stringify(_image.srcSet)\n }, bgColor && /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n title: title,\n style: (0, _extends2.default)({\n backgroundColor: bgColor,\n width: _image.width,\n opacity: !this.state.imgLoaded ? 1 : 0,\n height: _image.height\n }, shouldFadeIn && delayHideStyle)\n }), _image.base64 && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: _image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: _imageVariants,\n generateSources: generateBase64Sources\n }), _image.tracedSVG && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: _image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: _imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && /*#__PURE__*/_react.default.createElement(\"picture\", null, generateImageSources(_imageVariants), /*#__PURE__*/_react.default.createElement(Img, {\n alt: alt,\n title: title,\n width: _image.width,\n height: _image.height,\n sizes: _image.sizes,\n src: _image.src,\n crossOrigin: this.props.crossOrigin,\n srcSet: _image.srcSet,\n style: imageStyle,\n ref: this.imageRef,\n onLoad: this.handleImageLoaded,\n onError: this.props.onError,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && /*#__PURE__*/_react.default.createElement(\"noscript\", {\n dangerouslySetInnerHTML: {\n __html: noscriptImg((0, _extends2.default)({\n alt: alt,\n title: title,\n loading: loading\n }, _image, {\n imageVariants: _imageVariants\n }))\n }\n }));\n }\n\n return null;\n };\n\n return Image;\n}(_react.default.Component);\n\nImage.defaultProps = {\n fadeIn: true,\n durationFadeIn: 500,\n alt: \"\",\n Tag: \"div\",\n // We set it to `lazy` by default because it's best to default to a performant\n // setting and let the user \"opt out\" to `eager`\n loading: \"lazy\"\n};\n\nvar fixedObject = _propTypes.default.shape({\n width: _propTypes.default.number.isRequired,\n height: _propTypes.default.number.isRequired,\n src: _propTypes.default.string.isRequired,\n srcSet: _propTypes.default.string.isRequired,\n base64: _propTypes.default.string,\n tracedSVG: _propTypes.default.string,\n srcWebp: _propTypes.default.string,\n srcSetWebp: _propTypes.default.string,\n media: _propTypes.default.string\n});\n\nvar fluidObject = _propTypes.default.shape({\n aspectRatio: _propTypes.default.number.isRequired,\n src: _propTypes.default.string.isRequired,\n srcSet: _propTypes.default.string.isRequired,\n sizes: _propTypes.default.string.isRequired,\n base64: _propTypes.default.string,\n tracedSVG: _propTypes.default.string,\n srcWebp: _propTypes.default.string,\n srcSetWebp: _propTypes.default.string,\n media: _propTypes.default.string\n}); // If you modify these propTypes, please don't forget to update following files as well:\n// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image/index.d.ts\n// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image/README.md#gatsby-image-props\n// https://github.com/gatsbyjs/gatsby/blob/master/docs/docs/gatsby-image.md#gatsby-image-props\n\n\nImage.propTypes = {\n resolutions: fixedObject,\n sizes: fluidObject,\n fixed: _propTypes.default.oneOfType([fixedObject, _propTypes.default.arrayOf(fixedObject)]),\n fluid: _propTypes.default.oneOfType([fluidObject, _propTypes.default.arrayOf(fluidObject)]),\n fadeIn: _propTypes.default.bool,\n durationFadeIn: _propTypes.default.number,\n title: _propTypes.default.string,\n alt: _propTypes.default.string,\n className: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]),\n // Support Glamor's css prop.\n critical: _propTypes.default.bool,\n crossOrigin: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),\n style: _propTypes.default.object,\n imgStyle: _propTypes.default.object,\n placeholderStyle: _propTypes.default.object,\n placeholderClassName: _propTypes.default.string,\n backgroundColor: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),\n onLoad: _propTypes.default.func,\n onError: _propTypes.default.func,\n onStartLoad: _propTypes.default.func,\n Tag: _propTypes.default.string,\n itemProp: _propTypes.default.string,\n loading: _propTypes.default.oneOf([\"auto\", \"lazy\", \"eager\"]),\n draggable: _propTypes.default.bool\n};\nvar _default = Image;\nexports.default = _default;","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar global = require('./_global');\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar validate = require('./_validate-collection');\nvar NATIVE_WEAK_MAP = require('./_validate-collection');\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","var $export = require('./_export');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n var S = String(defined(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\nmodule.exports = function (NAME, exec) {\n var O = {};\n O[NAME] = exec(createHTML);\n $export($export.P + $export.F * fails(function () {\n var test = ''[NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n }), 'String', O);\n};\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..fcece6e --- /dev/null +++ b/404.html @@ -0,0 +1,67 @@ +404: Not found | Welcome to Alex's Midway

NOT FOUND

You just hit a route that doesn't exist... the sadness.

\ No newline at end of file diff --git a/404/index.html b/404/index.html new file mode 100644 index 0000000..5d11ff2 --- /dev/null +++ b/404/index.html @@ -0,0 +1,67 @@ +404: Not found | Welcome to Alex's Midway

NOT FOUND

You just hit a route that doesn't exist... the sadness.

\ No newline at end of file diff --git a/About/index.html b/About/index.html new file mode 100644 index 0000000..aecd491 --- /dev/null +++ b/About/index.html @@ -0,0 +1,67 @@ +About | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/2018\346\200\273\347\273\223\344\270\2162019\345\270\214\346\234\233/index.html" "b/Blog/2018\346\200\273\347\273\223\344\270\2162019\345\270\214\346\234\233/index.html" new file mode 100644 index 0000000..7257a02 --- /dev/null +++ "b/Blog/2018\346\200\273\347\273\223\344\270\2162019\345\270\214\346\234\233/index.html" @@ -0,0 +1,147 @@ +2018总结与2019希望 | Welcome to Alex's Midway

2018总结与2019希望

January 31, 2019


近期因为家里各种事情的耽误,一直没有时间完成这篇总结与希望。新的一年已经过完 1/12,这篇姗姗来迟的文章还没开始就有点过时了。

+ +

2018 年总结

+
+

如果要用一个词概括我的 2018,那么这个主题词是:“转型”

+
+

工作

+

2018 是转型大前端的第一年,经过 1 年的努力,从一开始 React Native 跨平台开发的狭窄领域,扩展到了 web 前端:

+
    +
  1. 基本上掌握了 React 全家桶的用法,有能力开发跨平台的 APP,可以完成不那么复杂的 web 应用
  2. +
  3. 了解了前端工程化的概念,使用并熟悉了相应的工具
  4. +
  5. 对 JavaScript 语言本身有了更深入的了解
  6. +
+

这一年,我认为自己迈过了中级前端的门槛,脑中建立了前端知识图谱,知道了如何学习未接触过的前端主题。

+

阅读

+

限于工作,今年各种技术类文章读的非常多(主要在掘金和 medium,可惜没有使用工具整合阅读数据,无法精确的跟踪和统计),没有多读几本书,有点遗憾。

+

2018 年读过的书有:

+
    +
  1. Secrets Of the JavaScript Ninja, 2nd Edition
  2. +
  3. JavaScript 高级程序设计 第三版
  4. +
  5. 精通 CSS 第二版
  6. +
  7. React indepth
  8. +
  9. 编码-隐匿在计算机软硬件背后的语言
  10. +
  11. 黑匣子思维
  12. +
  13. 中央帝国的财政密码
  14. +
  15. 叫魂
  16. +
  17. 源泉
  18. +
  19. 白鹿原
  20. +
  21. 10 人以下小团队管理手册
  22. +
  23. 刻意练习
  24. +
  25. 将夜
  26. +
+

印象最深的是 1 5 7,读完之后都有“原来 XXX 还可以这样”的感觉,以后还会反复看几遍。 +网络小说以及同类“爽文”以后要少看,费时且毫无价值。

+

代码

+

工作上完成了 3 个 APP,2 个 web 项目开发,业余时间完成了一些小练习:

+
    +
  1. freecodecamp 前 2 个 program
  2. +
  3. wesbos 的 JavaScript30,Intro Flexbox 课程
  4. +
  5. 参照 W3CSchool 的 tutorial,自己动手实现了 20+ 个 html 组件效果
  6. +
  7. HackerRank 上 30DaysOfCode, 10DaysOfJS, 以及 60% 的 DataStructure
  8. +
  9. LeetCode 刷了 40 道 easy 题目
  10. +
  11. 用 Gatsby.js 重写了博客
  12. +
+

没有用工具统计全部的代码量,工作相关的代码大约是 4 万行,算上自己的练习代码,估计今年的代码量在 5 万行左右。

+

2019 希望

+

新年还是要立一些 flag,争取总和完成率达到 90%

+
    +
  1. 逐步调整作息时间:11 点睡,6 点起
  2. +
  3. 全面体检 1 次
  4. +
  5. 换一份新工作,收入有所提升
  6. +
  7. 深入了解 JS 异步机制,能够自己实现 promise 和 rxjs
  8. +
  9. 能够独立搭建前端脚手架、部署 CI/CD 环境
  10. +
  11. (可选目标)关注 WebAssembly,写一个 demo
  12. +
  13. 学一门新开发语言,比如 python
  14. +
  15. LeetCode 刷题 150 道
  16. +
  17. 博客全年至少更新 24 篇文章
  18. +
  19. 尝试用英文写作,至少写 3 篇英文博客
  20. +
  21. 重新学习数学:完成网易公开课《MIT-线性代数》
  22. +
  23. 全年读书 12 本以上,其中英文书 3 本以上
  24. +
  25. 找到合适的个人数据管理工具,追踪阅读过的网络文章
  26. +
  27. (可选目标)英文词汇量达到 20000
  28. +
  29. (可选目标)减少 50% 手机使用时间,每天少于 1.5 小时
  30. +
  31. (可选目标,依赖 13)英文信息内容占比达到 50%
  32. +
\ No newline at end of file diff --git "a/Blog/2019\345\215\212\345\271\264\345\260\217\347\273\223/index.html" "b/Blog/2019\345\215\212\345\271\264\345\260\217\347\273\223/index.html" new file mode 100644 index 0000000..eac44ee --- /dev/null +++ "b/Blog/2019\345\215\212\345\271\264\345\260\217\347\273\223/index.html" @@ -0,0 +1,118 @@ +2019半年小结 | Welcome to Alex's Midway

2019半年小结

July 28, 2019


+
+

写在前面

+

这是今年的第十篇博客。距离上一次写博客已经过去四个月了。

+

4 月份入职了新公司做 web 前端,主要写移动端页面和管理后台。刚开始为了适应新公司技术栈和工作节奏加班成瘾,忘了写博客,所幸现在效率提高后又有了打理的时间。这几个月其实并没有闲着,也攒了一些工作记录,整理后会陆续发上来。

+

2019 年计划完成情况

+

下面是年初时定下的年度目标,如果每项目标等权,那么目前的完成率大约是 50%,按时间算大概落后计划 8%,也就是 1 个月的工作量。这些目标中有一些没有完成半数;有些内容过多,需要重新调整:

+
+
    +
  1. [ 100% ] 逐步调整作息时间:11 点睡,6 点起
  2. +
  3. [ 100% ] 全面体检 1 次
  4. +
  5. [ 100% ] 换一份新工作,收入有所提升
  6. +
  7. [ 0% ] 深入了解 JS 异步机制,能够自己实现 promise 和 rxjs
  8. +
  9. [ 0% ] 能够独立搭建前端脚手架、部署 CI/CD 环境
  10. +
  11. [ 100% ] (可选目标)关注 WebAssembly,写一个 demo
  12. +
  13. [ 100% ] 学一门新开发语言,比如 python
  14. +
  15. [ 80% ] LeetCode 刷题 150 道
  16. +
  17. [ 42% ] 博客全年至少更新 24 篇文章
  18. +
  19. [ 0% ] 尝试用英文写作,至少写 3 篇英文博客
  20. +
  21. [ 15% ] 重新学习数学:完成网易公开课《MIT-线性代数》
  22. +
  23. [ 25% ] 全年读书 12 本以上,其中英文书 3 本以上
  24. +
  25. [ 100% ] 找到合适的个人数据管理工具,追踪阅读过的网络文章
  26. +
  27. [ 75% ](可选目标)英文词汇量达到 20000
  28. +
  29. [ 0% ](可选目标)减少 50% 手机使用时间,每天少于 1.5 小时
  30. +
  31. [ 0% ](可选目标,依赖 13)英文信息内容占比达到 50%
  32. +
+
+
+

1-3 借着换工作的机会完成了,目前作息时间还在继续保持;

+

4 还没有开始;

+

5 还没有开始,有个机会可以在工作中练习;

+

6 超前完成,工作中已经用上了。仿照了网上的例子,把 openCC 语言库打包,做了一个浏览器的翻译服务;

+

7 工作里用到了 python,算是熟悉了语法,有时间考虑再做个小 demo 什么的,应该有机会;

+

8 已经完成了 120 题,easy 和 medium 难度的题目差不多刷了 2 遍。还剩 30 道 hard 题目没有完成,等 10 月份用 1-2 周时间集中突破。算法这个东西在学习阶段不太适合细水长流慢慢来,集中做比较有效率;

+

9 差的比较多,目前才完成了 2/5,不过今年完成 24 篇应该问题不大;

+

10 目前进度为 0,应该也可以完成;

+

11 进度滞后,总共有 35 节课,目前进度 1/7,有可能今年无法完成,修正目标为完成全部课程的 80%(顺便吐个槽,原来不是我蠢,所以学不好线性代数,真的是本科时候老师讲的太垃圾。MIT 的老爷子讲的太好了,从线性组合到线性方程组再到接下来矩阵的秩,每一步都有了意义,而且层层深入,说醍醐灌顶毫不为过,这是目前收获最大的单个目标);

+

12 今年到现在读完了 4 本书,也进度滞后,不过这个应该完成难度不大,准备追加一项写读书笔记的要求,年底前完成 3 篇读书笔记,计入博客文章数;

+

13 已完成,注册了一个 pocket 账号,打通了浏览器和手机端,现在碎片化阅读的内容基本都保存在 pocket 上。所有阅读过的文章链接可以导出为清单,自己写一个程序就可以统计阅读量了,正好是目标#16 想完成的;

+

14 完成度 70%-80%,现在词汇量测试基本稳定在 14000-16000 这个区间,年底前稳定在 80%的水平就可以了;

+

15 以目前工作情况和生活习惯来看,1.5 小时日均手机使用时间不可能达到,修正到 4 小时以内;

+

16 此项修正为写一个简单的桌面应用统计阅读量,数据比例不再限制;

+

以上...

\ No newline at end of file diff --git "a/Blog/2019\346\200\273\347\273\223\344\270\2162020\345\271\264\350\256\241\345\210\222/index.html" "b/Blog/2019\346\200\273\347\273\223\344\270\2162020\345\271\264\350\256\241\345\210\222/index.html" new file mode 100644 index 0000000..b8d2582 --- /dev/null +++ "b/Blog/2019\346\200\273\347\273\223\344\270\2162020\345\271\264\350\256\241\345\210\222/index.html" @@ -0,0 +1,73 @@ +2019总结与2020年计划 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/Android\346\250\241\346\213\237\345\231\250\350\256\277\351\227\256\346\234\254\345\234\260web\346\234\215\345\212\241\347\232\204url/index.html" "b/Blog/Android\346\250\241\346\213\237\345\231\250\350\256\277\351\227\256\346\234\254\345\234\260web\346\234\215\345\212\241\347\232\204url/index.html" new file mode 100644 index 0000000..f344e58 --- /dev/null +++ "b/Blog/Android\346\250\241\346\213\237\345\231\250\350\256\277\351\227\256\346\234\254\345\234\260web\346\234\215\345\212\241\347\232\204url/index.html" @@ -0,0 +1,92 @@ +Android模拟器访问本地web服务的url | Welcome to Alex's Midway

Android模拟器访问本地web服务的url

March 29, 2018


不会自己搭mock server的前端不是好前端。
+后台开发和前端开发不能完全实现同步,一直停下等后台是要出问题的。 +于是基于json-server搭了一个 API 本地测试服务器,却遇到了一个莫名其妙但极其简单的问题,简单记录一下,避免以后二次踩坑。

+
+

TL;DR

+

Android 模拟器访问本地服务器,把 url 设置成10.0.2.2或者本机 IP 地址
+Android 真机访问本地服务器,同一个局域网内,把 url 设置成本机 IP 地址

+
+
    +
  1. 踩坑
    +使用Android模拟器访问mock server的时候发现使用http://localhost:3000的默认配置怎么都取不到数据。 +查了无数遍http包头、API 返回的response,一无所获。 +过了老半天才恍然大悟,Android本来就是一个系统,自己也是有ip地址的,本机运行的时候应该设置成Android内置的地址http://10.0.2.2:3000
  2. +
  3. 进阶试验
    +然后想到了一个问题,Android模拟器和本机在同一个局域网内,那么url改成本机的 IP 地址,应该也是可以访问的。 +测试果然可行,这个方法适合Android真机调试。
  4. +
\ No newline at end of file diff --git "a/Blog/Android\351\224\256\347\233\230\351\201\256\346\214\241\351\227\256\351\242\230/index.html" "b/Blog/Android\351\224\256\347\233\230\351\201\256\346\214\241\351\227\256\351\242\230/index.html" new file mode 100644 index 0000000..05228df --- /dev/null +++ "b/Blog/Android\351\224\256\347\233\230\351\201\256\346\214\241\351\227\256\351\242\230/index.html" @@ -0,0 +1,84 @@ +Android键盘遮挡问题 | Welcome to Alex's Midway

Android键盘遮挡问题

March 14, 2018


有时候需要键盘遮挡住屏幕的一部分,有时候不需要,可以配置android\app\src\main\AndroidManifest.xml文件
+android:windowSoftInputMode="adjustResize"可以让键盘推起页面
+android:windowSoftInputMode="adjustPan"会遮住

+
<activity
+        android:name=".MainActivity"
+        android:label="@string/app_name"
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
+        android:windowSoftInputMode="adjustPan">        <intent-filter>
+            <action android:name="android.intent.action.MAIN" />
+            <category android:name="android.intent.category.LAUNCHER" />
+        </intent-filter>
+      </activity>
\ No newline at end of file diff --git a/Blog/BGP Hijacking/index.html b/Blog/BGP Hijacking/index.html new file mode 100644 index 0000000..1f531fa --- /dev/null +++ b/Blog/BGP Hijacking/index.html @@ -0,0 +1,73 @@ +BGP Hijacking | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/CDN\347\274\223\345\255\230\344\270\215\345\220\214\346\255\245\357\274\214\344\270\200\346\254\241\347\272\277\344\270\212\350\260\203\350\257\225\347\232\204\347\273\217\345\216\206/index.html" "b/Blog/CDN\347\274\223\345\255\230\344\270\215\345\220\214\346\255\245\357\274\214\344\270\200\346\254\241\347\272\277\344\270\212\350\260\203\350\257\225\347\232\204\347\273\217\345\216\206/index.html" new file mode 100644 index 0000000..edc6b07 --- /dev/null +++ "b/Blog/CDN\347\274\223\345\255\230\344\270\215\345\220\214\346\255\245\357\274\214\344\270\200\346\254\241\347\272\277\344\270\212\350\260\203\350\257\225\347\232\204\347\273\217\345\216\206/index.html" @@ -0,0 +1,144 @@ +CDN缓存不同步:一次线上调试的经历 | Welcome to Alex's Midway

CDN缓存不同步:一次线上调试的经历

August 31, 2019


写在前面

+

这是大概3个月之前的一次线上调试过程,最后排查到的原因很简单,但调试过程让我认识了所谓“线上环境复杂”是什么意思。

+

背景信息

+

这是入职后接手的第一个H5页面需求,也是比较重要内部项目,几乎所有公司部门都参与了此项目。项目完成后获得了公司的内部奖励,当然这是后话了。

+

我负责的部分算项目中比较简单的一块,2个web管理后台页面+5个H5前端页面。管理后台录入数据,然后H5页面拉接口展示,同时后台数据还可以被客户端直接使用。主要工作量在我的后台搭档那里,前端切图仔按设计出页面就可以了。

+

活很简单,慢悠悠的一周就做完了,然后自测、提测。PM说需要等下游客户端开发完毕后一起发布,于是等了快3周。

+

到了发布当天,却出现了莫名其妙的样式bug。

+

BUG排查过程

+

发布后搭档的手机发现有一个H5页面样式全崩了。而我手机上的显示却完全正常

+
    +
  1. +

    检查发布过程

    +

    gitlab里CI打包正常-->重新发布-->发现问题依旧

    +

    结论1:暂无

    +
  2. +
  3. +

    清理App缓存,再刷新页面

    +

    因为App里有页面缓存,加上之前做过预发布,我这里显示正常有可能是之前的缓存。那么首先清理掉缓存,确保页面文件都是新发布的。

    +

    清理后,搭档的手机显示仍然不对,我的手机显示也不对了。

    +

    结论2:应该是css文件有问题

    +
  4. +
  5. +

    PC端查看

    +

    这个页面是H5和PC端共用的,所以PC端也可以查看,这样调试成本稍微低一些。

    +

    首先,PC端也显示不正常-->用Chrome devtool看css文件是否有正确下载-->未见下载css文件

    +

    结论3:css文件没有下载

    +
  6. +
  7. +

    排查CI发布包文件

    +

    发现发布包html文件中没有引入css文件-->发现html文件因为代码格式化引发打包程序bug,未能正确打包css文件

    +

    结论4:css文件没有正确打包

    +
  8. +
  9. +

    PC端查看,发现css文件有错误

    +

    修复后重新发布,bug依然存在-->浏览器devtool在network里能看到对应的css文件-->打开css文件路径,查看css文件内容是否正确-->经过关键词搜索,发现缺失了几个样式

    +

    结论5:css文件有错误

    +
  10. +
  11. +

    下载gitlab打包文件,比对线上和发布包内的css文件

    +

    发现打包的css文件和线上css文件hash不同,似乎发布未生效。

    +

    结论6:发布的css文件与线上css文件不同步

    +
  12. +
  13. +

    偶然:另一名同事发现手机显示正常

    +

    另一名同事清理App缓存后显示正常-->我和搭档的手机显示仍然不对,PC端也不对

    +

    结论7:css文件在某些手机上正常下载??!!!

    +
  14. +
  15. +

    切换为同一网络条件

    +

    注意到搭档和我都连接的公司wifi,而另一名同事用的移动4G,难道是CDN缓存未同步?

    +

    让另一名同事连公司wifi,清理缓存-->刷新页面,样式bug复现

    +

    结论8:CDN缓存不同步??

    +
  16. +
  17. +

    增加vConsole,比较显示为正常的css文件和有问题的css文件

    +

    临时上线增加了vConsole的版本,在另一个同事手机上查看css文件版本-->正常显示的css文件hash和异常css文件hash不同-->前者和gitlab发布包内css文件hash相同,后者和上一个发布版本的css文件hash相同

    +

    结论9:确认CDN缓存不同步

    +
  18. +
  19. +

    修复上线

    +

    出问题的css文件做了小改动,刷新了文件hash,再次发布上线,bug立刻修复

    +
  20. +
+

整个调试排查时间约3个小时

+

原因分析

+

第一次bug是打包的失误,第二次bug复现应该算是典型的CDN缓存问题。

+

因为html文件使用相同名字,覆盖发布,可能会有缓存同步延迟,而css文件名是基于hash的,每次改动后文件名不同,不存在覆盖问题。

+

所以真正的bug源就是html页面文件没有同步,导致访问时没有请求到新版的css文件。第一次bug出现时,css文件没有下载可以理解,因为打包遗漏了,自然不会下载。但是第二次bug出现时,合理的组合应该是新html+无css或者新html+新css

+

为什么会出现 新html+旧css这样的组合,暂时没有合理的答案。因为当时着急发布,没有立即检查修复后的情况,现在已经无法还原场景了。哎。

+

总结

+

总之失误挺多的,经验不足也导致反应不够迅速,处置手段也比较具有侵入性。比如,老司机估计最多在第4步就判断出原因了,而我这只菜鸡在第6步才意识到。第9步也完全可以省去一次发布,用4G网络开个热点通过PC端调试即可。

+

技术进阶之路漫漫,我还要继续努力。

\ No newline at end of file diff --git "a/Blog/CST\344\270\216GMT\347\232\204\345\267\256\345\210\253/index.html" "b/Blog/CST\344\270\216GMT\347\232\204\345\267\256\345\210\253/index.html" new file mode 100644 index 0000000..19288da --- /dev/null +++ "b/Blog/CST\344\270\216GMT\347\232\204\345\267\256\345\210\253/index.html" @@ -0,0 +1,122 @@ +CST与GMT的差别 | Welcome to Alex's Midway

CST与GMT的差别

May 15, 2018


+

问题描述

+

今天偶然发现了一个问题,JAVA 后台返回的时间字符串解析后居然比原始数据差了 14 个小时
+后台时间字符串:Thu Feb 17 16:31:52 CST 2018
+前端解析时间: Sun Feb 18 2018 06:31:52 GMT

+

排查过程

+
    +
  1. 前端传的是时间戳,后台自己并没有处理,而且显示的时间与前端传的时间完全一致
  2. +
  3. 只有后台再发送给前端之后时间显示才出现问题,妥妥前端的锅
  4. +
+

再看一眼 2 个字符串的样子,很自然想到不一致来源于 CST 和 GMT 这两种不同标准

+

CST & GMT 冷知识

+

google 了一下,CST 可以代表以下几个时间:

+
    +
  • Central Standard Time (USA) UT-6:00
  • +
  • Central Standard Time (Australia) UT+9:30
  • +
  • China Standard Time UT+8:00
  • +
  • Cuba Standard Time UT-4:00
  • +
+

换句话说,CST 可以代表 4 个不同的时区,而 GMT 只代表格林尼治标准时间

+

那么很显然问题的原因找到了:

+
    +
  • JAVA认为CST代表的是China Standard Time +8
  • +
  • 而Javascript认为CST代表的是Central Standard Time (USA) -6
  • +
+

所以前端计算时才有了8-(-6)=14小时的时差

+

问题解决

+

写了个简单的方法处理了时差问题

+
const dateCstToGmt = dateString => {
+  let aDate = new Date(dateString);
+  const hour = aDate.getHours();
+  aDate.setHours(hour - 14);
+  return aDate;
+};
+

反思

+
    +
  • 最优方案:最好统一用时间戳,这样前后台解析都不会有错
  • +
  • 次优方案:如果一定要用时间字符串,那么用没有歧义的 GMT 时间比 CST 时间来得可靠
  • +
\ No newline at end of file diff --git a/Blog/Client-Side GraphQL/index.html b/Blog/Client-Side GraphQL/index.html new file mode 100644 index 0000000..cde6073 --- /dev/null +++ b/Blog/Client-Side GraphQL/index.html @@ -0,0 +1,73 @@ +Client-Side GraphQL | Welcome to Alex's Midway \ No newline at end of file diff --git a/Blog/Design Systems with Storybook/index.html b/Blog/Design Systems with Storybook/index.html new file mode 100644 index 0000000..f6f7ea6 --- /dev/null +++ b/Blog/Design Systems with Storybook/index.html @@ -0,0 +1,73 @@ +Design Systems with Storybook | Welcome to Alex's Midway \ No newline at end of file diff --git a/Blog/ES2015-ES2020/index.html b/Blog/ES2015-ES2020/index.html new file mode 100644 index 0000000..c96cc55 --- /dev/null +++ b/Blog/ES2015-ES2020/index.html @@ -0,0 +1,525 @@ +ES2015-ES2020 | Welcome to Alex's Midway

ES2015-ES2020

October 31, 2019


+
+

1. TC39 工作流程 - 标准一般每年6-7月发布

+
    +
  • Stage 0 (Strawperson 稻草人)
  • +
  • Stage 1 (Proposal 建议)
  • +
  • Stage 2 (Draft 草案)
  • +
  • Stage 3 (Candidate 候选)
  • +
  • Stage 4 (Finished 完成)
  • +
+
+

2. ES2015(ES6):常用特性

+
    +
  • class
  • +
  • ESM 模块化
  • +
  • 箭头函数,函数参数默认值
  • +
  • 模版字符串
  • +
  • 解构赋值,数组rest/spread操作符
  • +
  • 对象属性简写
  • +
  • Promise, Generator 和 Iterator
  • +
  • let 和 const, Map 和 Set
  • +
  • 新增基本类型Symbol
  • +
  • ...
  • +
+

全部特性点这里

+

2.1 模版字符串

+

常规用法

+
//字符串拼接
+let a = '风';
+let b = `${a},冷${a}, 冷${a}`;//'风,冷风,冷风吹'
+b = `
+${a}
+冷${a}
+冷${a}`;
+/*风
+**冷风
+**冷风吹
+*/
+
+

自定义模版函数
+普通用法 -> 大神的用法

+
+

2.2 解构赋值,rest/spread操作符

+
// 右侧为spread赋值,左侧为rest接受赋值 
+let a = [1,2,3,4];
+let b = [1,2,...a];
+let [c,,d,...e] = b;
+/*
+b: [1,2,1,2,3,4]
+c: 1
+d: 1
+e: [2,3,4]
+*/
+

2.3 Symbol / Iterator / Generator

+
    +
  • Iterator: 实现next( )方法,返回 { value: xxx, done: true / false}
  • +
  • Generator: 创建时返回iterator对象
  • +
  • 字符串、数组、Map和Set是内置了迭代器的对象,原型内置 [Symbol.iterator] 方法
  • +
+

可以自己实现或者覆盖已有的 [Symbol.iterator] 方法

+
+

3. ES2016(ES7)

+
    +
  • Array.prototype.includes
  • +
  • 指数运算符( ** )
  • +
+
let a = [1,NaN,null,undefined];
+
+a.indexOf(NaN);//-1
+a.includes(NaN);//true
+
+let b = 2**3; //8
+let c = Math.pow(2,3); //8
+
+

4. ES2017(ES8)

+
    +
  • async / await
  • +
  • String.prototype.{ padStart, padEnd }
  • +
  • Object.{ values, entries }
  • +
  • 函数参数列表结尾允许逗号
  • +
  • Object.getOwnPropertyDescriptors
  • +
  • 共享内存和原子操作:SharedArrayBuffer 和 Atomics
  • +
+

4.1 async / await

+
    +
  • 同步形式的代码处理异步操作
  • +
  • 结合ES2018异步迭代的改进后,可以在循环中处理async await
  • +
+
for await (const line of readLines(filePath)) {
+  console.log(line);
+}
+

4.2 String.prototype. { padStart, padEnd }

+
var str = 'hello';
+str.padStart(4);                // "hello"
+str.padStart(8);                // "   hello"
+str.padStart(8,'*');            // "***hello"
+str.padStart(8,'12345');        // "123hello"
+str.padStart(8, 'ab');          // "abahello"
+
+str.padEnd(4);                  // "hello"
+str.padEnd(8);                  // "hello   "
+str.padEnd(8,'*');              // "hello***"
+str.padEnd(8,'12345');          // "hello123"
+str.padEnd(8, 'ab');            // "helloaba"
+

4.3 Object.{ values, entries }

+
let val = { 'a':1, 'b':2, 'c':3 };
+
+Object.values(val);  // [1,2,3];
+
+Object.entries(val); // [ ['a',1], ['b',2], ['c',1] ]
+Object.entries(val).forEach( ([key,value])=>{
+	console.log(`key: ${key}, value: ${value}`);
+});
+// key: a, value: 1
+// key: b, value: 2
+// key: c, value: 3
+

4.4 函数参数列表结尾允许逗号

+
    +
  • 主要是为了改善git提交记录的可维护性
  • +
+
// 改进前
+function testTrailingComma(
+  param1,
+  param2 //增加参数必须改变此行
+){ ... }
+   
+// 改进后
+function testTrailingComma(
+  param1,
+  param2, //增加参数不再影响此行
+){ ... }
+

4.5 Object.getOwnPropertyDescriptors

+
let obj1 = { 'a': 1, test(){} };
+console.log(Object.getOwnPropertyDescriptors(obj1));
+/*{
+  a:{
+    configurable: true
+    enumerable: true
+    value: 1
+    writable: true
+  },
+  test:{
+    configurable: true
+    enumerable: true
+    value: ƒ test()
+    writable: true
+  }
+}*/
+

4.6 共享内存和原子操作

+
    +
  • SharedArrayBuffer 和 Atomics
  • +
  • SharedArrayBuffer: 共享二进制内存区域,以字节为单位
  • +
  • Atomics:提供一组静态方法来对SharedArrayBuffer进行原子操作
  • +
+
+

5. ES2018(ES9)

+
    +
  • 异步迭代
  • +
  • Promise.prototype.finally
  • +
  • 对象rest/spread操作符
  • +
  • 正则表达式改进:{ 命名捕获组, 反向断言,dotAll标记,Unicode转义 }
  • +
  • 模版字符串改进: 支持非转义
  • +
+

5.1 Promise.prototype.finally

+
    +
  • 类比 try ... catch ... finally
  • +
+
Promise.resolve(2)
+  .then((val)=>{})
+  .catch((err)=>{})
+  .finally(()=>{})
+

5.2 对象rest / spread操作符

+
//rest
+let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
+x; // 1
+y; // 2
+z; // { a: 3, b: 4 }
+
+//spread
+let n = { x, y, ...z };
+n; // { x: 1, y: 2, a: 3, b: 4 }
+

5.3 正则表达式改进-命名捕获组

+
//命名捕获组
+let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
+let result = re.exec('2019-11-01');
+
+// result.groups.year === '2019';
+// result.groups.month === '11';
+// result.groups.day === '01';
+
+// result[0] === '2019-11-01';
+// result[1] === '2019';
+// result[2] === '11';
+// result[3] === '01';
+

5.4 正则表达式改进-反向断言

+
let val = '$10.53';
+
+//正向断言
+let match = /(\$)(?=\d+(\.\d*))?/.exec(val); // match[0] -> $
+
+//肯定反向断言
+match = /(?<=\$)\d+(\.\d*)?/.exec(val); // match[0] -> 10.53
+
+//否定反向断言
+match = /(?<!\$)\d+(?:\.\d*)/.exec(val); // match[0] -> null
+match = /(?<!\$)\d+(?:\.\d*)/.exec('¥10.53') // match[0] -> 10.53
+

5.5 正则表达式改进-dotAll标记

+
// 增加s标记,可以使 . 匹配 行结束符
+
+//无标记
+/foo.bar/.test('foo\nbar'); // false
+
+//有标记
+/foo.bar/s.test('foo\nbar'); // true
+

5.6 正则表达式改进-Unicode转义

+
    +
  • 支持 \p{...}\P{...}实现Unicode转义
  • +
  • 之前类似实现需要使用第三方库
  • +
+
const regexGreekSymbol = /\p{Script=Greek}/u;
+
+regexGreekSymbol.test('π'); // true
+

5.7 模版字符串改进

+
    +
  • 解决\u,\x\数字开头的转义字符被自动认定为unicode,16进制和8进制转义,导致某些特定字符被认定为非法的错误
  • +
  • 比如\unicode, \xerxes, \0100都被认为是非法字符
  • +
+
+

6. ES2019 (ES10)

+
    +
  • 可选catch异常变量绑定
  • +
  • 字符集扩充
  • +
  • Symbol.prototype.description
  • +
  • Object.fromEntries( )
  • +
  • 完善JSON.stringify( )
  • +
  • 改进Function.prototype.toString( )
  • +
  • String.prototype.{ trimStart, trimEnd }
  • +
  • Array.prototype.{ flat, flatMap }
  • +
+

6.1 可选catch异常变量绑定

+
    +
  • catch的error参数可省略
  • +
+
//修改前
+try{} catch(err){} // ok
+try{} catch{} // error
+
+//修改后
+try{} catch(err){} // ok
+try{} catch{} // ok
+

6.2 字符集扩充

+ +

6.3 Symbol.prototype.description

+
    +
  • 增加属性直接获取description
  • +
  • 代替之前使用Symbol.prototype.toString方法间接获得
  • +
+
const aSymbol = Symbol('我是描述');
+//以前
+String(aSymbol); // Symbol('我是描述')
+
+//现在
+aSymbol.description;// '我是描述'
+

6.4 Object.fromEntries( )

+
    +
  • 和 Object.Entries( )相反
  • +
+
//嵌套数组转对象
+obj = Object.fromEntries([['a', 0], ['b', 1]]); // { a: 0, b: 1 }
+
+//map转对象
+map = new Map([ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]);
+obj = Object.fromEntries(map); // {a: 1, b: 2, c: 3}
+

6.5 完善JSON.stringify( )

+
// 正确的unicode字符
+JSON.stringify('𝌆');// → '"𝌆"'
+JSON.stringify('\uD834\uDF06')// → '"𝌆"' -> 来自太玄经
+
+// 超出字符集,返回转义的utf-8序列
+JSON.stringify('\uDF06\uD834')// → '"\\udf06\\ud834"'
+JSON.stringify('\uDEAD') // → '"\\udead"'
+

6.6 改进Function.prototype.toString( )

+
    +
  • 返回函数定义的全部内容,包括各种空格和注释
  • +
+
const a = () => { /*我是注释*/ return};
+
+//以前
+a.toString(); // '()=>{}'
+
+//现在
+a.toString(); // '() => { /*我是注释*/ return}'
+

6.7 String.prototype.{ trimStart, trimEnd}

+
var str = '   foo  '; //3个空格+foo+2个空格
+
+str.length; // 8
+
+str.trimStart().length; // 5
+str.trimStart();        // 'foo  '
+
+str.trimEnd().length;   // 6
+str.trimEnd();          // '   foo'
+

6.8 Array.prototype.{ flat, flatMap }

+
/*--------flat-----------*/
+var arr1 = [1, 2, [3, 4, [5, 6]]];
+arr1.flat();    // [1, 2, 3, 4, [5, 6]]
+
+var arr2 = [1, 2, [3, 4, [5, 6]]];
+arr2.flat(2);   // [1, 2, 3, 4, 5, 6]
+
+var arr3 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
+arr3.flat(Infinity);  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+
+/*--------flatMap-----------*/
+let arr4 = [1, 2, 3, 4];
+
+arr4.map(x => [x * 2]);   // [[2], [4], [6], [8]]
+arr4.flatMap(x => [x * 2]); // [2, 4, 6, 8]
+arr4.flatMap(x => [[x * 2]]); // [[2], [4], [6], [8]]
+
+

7. ES2020 待发布(ES11)

+
    +
  • String.prototype.matchAll
  • +
  • import( )
  • +
  • 新增基本类型BigInt
  • +
  • Promise.allSettled
  • +
  • globalThis
  • +
+

7.1 String.prototype.matchAll

+
    +
  • 避免在循环中调用regexp.exec获取匹配项信息,分组捕获更方便
  • +
+
//以前
+const regexp = /t(e)(st(\d?))/g;
+const str = 'test1test2';
+let match;
+while ((match = regexp.exec(str)) !== null) {
+  console.log(`找到 ${match[0]} 开始位置=${match.index} 结束位置=${regexp.lastIndex}.`);
+  // 输出: "找到 test1 开始位置=0 结束位置=4."
+  // 输出: "找到 test2 开始位置=5 结束位置=9."
+}
+//现在
+let matches = str.matchAll(regexp);
+for(const match of matches){
+  console.log(`找到 ${match[0]} 开始位置=${match.index} 结束位置=${match.index+match[0].length}.`)
+}//输出同上
+
+[...str.matchAll(regexp)]; //['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
+

7.2 import( )

+
    +
  • 动态加载 import( )
  • +
  • script tag中可用,不局限于模块中使用:例子
  • +
  • 如果在模块中使用,只影响import之后的语句
  • +
  • 接受字符串变量为参数,可以动态改变import的内容
  • +
  • 不强制增加静态依赖关系
  • +
+

7.3 新增基本类型BigInt

+
    +
  • 现在有7种基本类型: number, undefined, null, string, boolean, symbol, bigInt
  • +
  • 新类型要解决的问题
  • +
+
/*Number*/
+const x = Number.MAX_SAFE_INTEGER; // 9007199254740991, 即2^53-1
+const y = x + 1; // 9007199254740992
+const z = x + 2  // 9007199254740992
+
    +
  • BigInt
  • +
+
/*BigInt*/
+const theBiggestInt = 9007199254740991n;
+0n+1; // TypeError: Cannot mix BigInt and other types, use explicit conversions
+theBiggestInt + 2n; // 9007199254740993n;
+5n/2n; // 2n
+
+const alsoHuge = BigInt(9007199254740991); // 9007199254740991n
+const hugeButString = BigInt('9007199254740991');// 9007199254740991n
+0n === 0; //false
+0n == 0; //true
+Boolean(0n); // false
+
++1n; // TypeError: Cannot convert a BigInt value to a number
+Number(1n);// 1
+1n+ '2'; // '12'
+

7.4 Promise.allSettled

+
    +
  • 与 Promise.all 对应
  • +
  • 所有Promise都有结果,reject / resolve 皆可
  • +
+

7.5 globalThis

+
    +
  • 全局对象受运行环境影响: 浏览器为window,node环境为global,其他环境可能为this
  • +
  • 提供一个环境无关的方式访问全局对象
  • +
\ No newline at end of file diff --git "a/Blog/FlatList\345\222\214ScrollView\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/index.html" "b/Blog/FlatList\345\222\214ScrollView\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/index.html" new file mode 100644 index 0000000..17b1577 --- /dev/null +++ "b/Blog/FlatList\345\222\214ScrollView\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/index.html" @@ -0,0 +1,94 @@ +使用FlatList(ScrollView)的一个小问题 | Welcome to Alex's Midway

使用FlatList(ScrollView)的一个小问题

May 19, 2018


问题描述
+

列表 FlatList 直接放在 View 里面,无法 pull to refresh

+
原因排查
+

因为 FlatList 基于 ScrollView 和 VirtualizedList 封装,查看了 ScrollView 的官方文档说明

+
+

Keep in mind that ScrollViews must have a bounded height in order to work, since they contain unbounded-height children into a bounded container (via a scroll interaction)[1]. +In order to bound the height of a ScrollView, either set the height of the view directly (discouraged) +or make sure all parent views have bounded height. Forgetting to transfer {flex: 1} down the view stack can lead to errors here, which the element inspector makes easy to debug.

+
+
解决方案
+

在 FlatList 外层的容器里加上{flex:1}

+
<View style={{flex:1}}>  <FlatList
+    ...
+  />
+</View>
+
问题引申
+
    +
  1. FlatList 和 ScrollView 都必须包裹在有确定高度的容器内才能正常工作
    +所以,如果 FlatList 内嵌在 ScrollView 里,或者反之,内嵌的控件无法正常工作,因为 FlatList 或 ScrollView 都是不固定高度的。 +之前也遇到过类似情况,无意中将 FlatList 放在了基于 ScrollView 封装的容器里,只要上拉加载更多,就会出现 FlatList 无穷加载的情况
  2. +
  3. FlatList 和 ScrollView 都必须放在{flex:1}的容器里,否则无法正常工作
  4. +
\ No newline at end of file diff --git a/Blog/Google XSS game Level 1/index.html b/Blog/Google XSS game Level 1/index.html new file mode 100644 index 0000000..7432724 --- /dev/null +++ b/Blog/Google XSS game Level 1/index.html @@ -0,0 +1,103 @@ +Google XSS game - Level 1 | Welcome to Alex's Midway

Google XSS game - Level 1

November 18, 2020


Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe.

+

Although it was designed at least 4 yrs ago, I found it quite interesting and learned how to launch XSS attacks in various ways through the game. It took me almost 2 hrs to clear all 6 levels.

+

Level 1: Hello, world of XSS

+

Mission Description

+

This level demonstrates a common cause of cross-site scripting where user input is directly included in the page without proper escaping.

+

Interact with the vulnerable application window below and find a way to make it execute JavaScript of your choosing. You can take actions inside the vulnerable window or directly edit its URL bar.

+

Mission Objective

+

Inject a script to pop up a JavaScript alert() in the frame below.

+

Once you show the alert you will be able to advance to the next level.

+

Solution

+
+

TL;DR

+

input <script>alert('xxx')</script> into the textbox, click "Search", and then an alert will pop up.

+
+

Look at the source code below:

+
<!-- HTML Form -->
+<form action="" method="GET">  <input id="query" name="query" value="Enter query here..."
+    onfocus="this.value=''">
+  <input id="button" type="submit" value="Search"></form>
+
# Backend
+query = self.request.get('query', '[empty]')
+    
+# Our search engine broke, we found no results :-(
+message = "Sorry, no results were found for <b>" + query + "</b>."message += " <a href='?'>Try again</a>."
+
+# Display the results page
+self.render_string(page_header + message + page_footer)
+

The HTML form would send a GET request with a query parameter. Its value is what we input into the textbox. +When the server receives the request, it would directly write the value into an HTML response and send it back to our browser without proper escaping.

+

That's where our attack kicks in.

+

Just type <script>alert('xxx')</script> into the textbox, click "Search", and then an alert will pop up.

\ No newline at end of file diff --git "a/Blog/HTML\344\270\255\350\207\252\351\227\255\345\220\210Vue\347\273\204\344\273\266\347\232\204bug/index.html" "b/Blog/HTML\344\270\255\350\207\252\351\227\255\345\220\210Vue\347\273\204\344\273\266\347\232\204bug/index.html" new file mode 100644 index 0000000..8205123 --- /dev/null +++ "b/Blog/HTML\344\270\255\350\207\252\351\227\255\345\220\210Vue\347\273\204\344\273\266\347\232\204bug/index.html" @@ -0,0 +1,170 @@ +HTML中自闭合Vue组件的bug | Welcome to Alex's Midway

HTML中自闭合Vue组件的bug

October 12, 2019


写在前面

+

今天犯了个低级错误,页面新增加了一个vue组件,因为是直接在html里写的(需要用php的后端直出,没有用vue单文件的写法),在使用自闭合标记写法的情况下这个组件没有直接渲染,而是把它后面的div节点替换掉了。

+

背景信息

+

先假设这个组件的名字叫做BugComponent,模版内容大概是下面这样的

+
<template>
+	<div class="bug-component">
+    <p>我是bug component</p>
+  </div>
+</template>
+

bug试验

+
    +
  1. 自闭合组件在前:渲染替换节点
  2. +
+
...
+<!-- 渲染前 -->
+<div class="container">
+	<bug-component />
+	<div class="sibling">
+    <p>我是示例文本</p>
+	</div>
+ </div>
+...
+

这样就是今天遇到的bug情况,表现为组件替换掉了下面的div节点,这样渲染后最终的html是这样的

+
...
+<!-- 渲染后, sibling节点消失 -->
+<div class="container">
+	<div class="bug-component">
+    <p>我是bug component</p>
+  </div> 
+ </div>
+...
+
    +
  1. 自闭合组件在后:显示正常
  2. +
+
...
+<!-- 渲染前 -->
+<div class="container">
+	<div class="sibling">
+    <p>我是示例文本</p>
+	</div>
+  <bug-component />
+ </div>
+...
+

这种情况下,自闭合组件之下是上层节点标记的结束,这样表现为组件可以正常渲染,不会影响到上面的临近同级节点

+
...
+<!-- 渲染后,sibling节点保持不变,渲染BugComponent组件内容 -->
+<div class="container">
+	<div class="sibling">
+    <p>我是示例文本</p>
+	</div>
+  <div class="bug-component">
+    <p>我是bug component</p>
+  </div>
+ </div>
+...
+

原因分析

+

用户看到页面,整个渲染过程粗略说可以分为2步:

+
    +
  1. 浏览器解析HTML标签
  2. +
  3. 挂载Vue并完成渲染
  4. +
+

出问题的地方在第一步浏览器解析HTML标签,所以这个问题本质上是HTML解析问题。

+

具体解释如下:

+
    +
  • HTML5标准中的Normal elements不支持自闭合标签写法(包括自定义标签,但排除空标签和svg等特定标签),自闭合标签在解析时会被省略掉表示闭合的/,即<bug-component />实际上是当成<bug-component>来解析的
  • +
  • 根据标准,<bug-component>就会被解析为标签的开始,这样浏览器会认为它缺少了标签结尾
  • +
  • +

    关键的一步来了:浏览器会在父标签的结尾前,自动补全当前标签的结尾,所以自闭合标签在这样的机制下就变成了它后面兄弟节点的父节点

    +
    <!-- 原始html -->
    +<div class="container">
    +  <bug-component />
    +  <div class="sibling">
    +    <p>我是示例文本</p>
    +  </div>
    +</div>
    +
    +<!-- 浏览器补充后,实际html -->
    +<div class="container">
    +  <bug-component>
    +      <div class="sibling">
    +        <p>我是示例文本</p>
    +      </div>
    +  </bug-component>
    +</div>
    +
  • +
  • 这就是为什么在bug试验1的情境下,Vue渲染后的组件只剩下了组件模版的内容,而兄弟节点的内容消失了。因为对Vue来说,这个时候自闭合标签和它的兄弟节点都只是组件标记的一部分,都会被替换为组件模版
  • +
  • 当自闭合标签是最后一个子节点的时候,也就是bug试验2的情景,自动补全结束标签不会影响到其他的兄弟节点,所以Vue渲染后就表现为一切正常
  • +
+

Done.

+

延伸阅读

+

其实Vue的官方文档已经说的很清楚了,自闭合组件只能出现在三种场合:

+
    +
  • Vue template
  • +
  • 字符串模版
  • +
  • JSX
  • +
+

因为HTML标准不支持,所以在HTML中不能使用自闭合组件,而且标记必须使用kebab-case

+

详见 Vue风格指南: 自闭合组件 - 强烈推荐

\ No newline at end of file diff --git "a/Blog/HTTP2.0\345\210\235\346\255\245/index.html" "b/Blog/HTTP2.0\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..915db6d --- /dev/null +++ "b/Blog/HTTP2.0\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +HTTP/2初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/HTTPS\345\210\235\346\255\245/index.html" "b/Blog/HTTPS\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..5af9f6f --- /dev/null +++ "b/Blog/HTTPS\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +HTTPS初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/HTTP\347\274\223\345\255\230\345\260\217\347\273\223/index.html" "b/Blog/HTTP\347\274\223\345\255\230\345\260\217\347\273\223/index.html" new file mode 100644 index 0000000..d312604 --- /dev/null +++ "b/Blog/HTTP\347\274\223\345\255\230\345\260\217\347\273\223/index.html" @@ -0,0 +1,196 @@ +HTTP缓存小结 | Welcome to Alex's Midway

HTTP缓存小结

February 25, 2020


常见相关HTTP Header

+

HTTP 1.0

+
    +
  • Pragma
    +与HTTP 1.1 Cache-Control对等,为了兼容而存在;
    +如果Cache-Control同时存在,Pragma会被忽略;
    +通常设置为Pragma: no-cache;
  • +
+

HTTP 1.1 Cache-Control

+

HTTP 1.1引入请求头,用于控制缓存策略

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP header说明
public都可以缓存
private必须保存在私有缓存中,不可保存在共享缓存,即不可保存在CDN节点
no-cache保存缓存文件到磁盘,但未与源服务器验证前,不可使用
no-store1.不保存缓存文件到磁盘,但可以保存到内存中,转发后会尽快删除;
2. 无法保证私密性;
must-revalidate仅针对过期缓存,在未与源服务器验证前,不可使用
max-stale1. 请求头,表示愿意接受设置的过期时间内的缓存;
2. max-stale: 60表示过期60秒内的缓存,客户端也可以接受
+
+

注意must-revalidateno-cache差别

+
    +
  • 前者只要求验证已过期缓存
  • +
  • 后者不论缓存是否过期都需要验证;
  • +
+
+

缓存类别

+

强缓存

+ + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP header所属标准说明
ExpiresHTTP 1.01.HTTP日期时间戳
2. 优先级低于Cache-Control: max-age,如果后者出现Expires将被忽略
3.客户端本地时间会影响时间判定
4. 如果解析时间错误或时间格式错误,缓存将被认为已过期
Cache-Control: max-ageHTTP 1.11.表示缓存最大有效期,单位是秒
2.优先级高于Expires
Cache-Control: s-maxageHTTP 1.11.和max-age类似,但用于控制共享缓存,即CDN的最大缓存有效期
2.优先级高于max-ageExpires
+
+

强缓存命中,返回HTTP状态码200

+
+

协商缓存

+ + + + + + + + + + + + + + + + + + + + +
HTTP header所属标准说明
请求头:If-Modified-since
响应头:Last-Modified
HTTP 1.01.HTTP日期时间戳
2. 优先级低于Etag,如果后者出现将被忽略
3.只能精确到秒,速度快于1秒的变化无法感知
4. 连续变化但最后内容未变,会导致频繁刷新更新时间,导致之前的缓存失效
请求头: If-None-Match
响应头: Etag
HTTP 1.11.表示文件指纹,变化只与文件内容有关
2.优先级高于Last-Modified
3.Etag生成与具体算法有关,分布式系统中每台机器可能会为相同文件生成不同的Etag,需要统一计算规则
+
+

协商缓存命中返回HTTP状态码304,未命中会重新请求,成功返回200

+
+

使用场景

+

静态文件

+

变化较少的静态资源文件,如图片,或变化频繁但每个版本相对独立的静态资源文件,如js,css文件,尽量强缓存,并设置长有效期,通过hash或者类似方法区分不同文件版本,可以减少资源请求

+

html文件

+

一般设置为Cache-Control: no-cache,要求每次回源验证,以确保每次用户访问到的都是最新版本的App;但并不绝对,有些时效性没那么强的内容,或者内容相对稳定、或者需要通过缓存减少服务器访问压力的场景,也可以结合使用Cache-Control: max-age=xxx

+
    +
  • 前者例子见参考文献3
  • +
  • 后者例子可见各类新闻网站,常见设置为max-age=60
    +因为新闻内容相对稳定,设置强缓存影响css和js文件的更新,并不影响内容阅读,用户感知不明显,且此设置有助于减少服务器访问压力
  • +
  • +

    缺点:结合max-age的网站,通常会有多个版本同时运行在线上,比较难以定位线上问题

    +

    参考文献

    +

    [1] RFC 7324
    +[2] RFC 7232
    +[3] Jake·Archibald: caching-best-practices

    +
  • +
\ No newline at end of file diff --git "a/Blog/IEEE-754\346\240\207\345\207\206\344\270\216JS\344\270\255\347\232\204number\347\261\273\345\236\213/index.html" "b/Blog/IEEE-754\346\240\207\345\207\206\344\270\216JS\344\270\255\347\232\204number\347\261\273\345\236\213/index.html" new file mode 100644 index 0000000..04db001 --- /dev/null +++ "b/Blog/IEEE-754\346\240\207\345\207\206\344\270\216JS\344\270\255\347\232\204number\347\261\273\345\236\213/index.html" @@ -0,0 +1,805 @@ +IEEE-754标准与JS中的number类型 | Welcome to Alex's Midway

IEEE-754标准与JS中的number类型

October 01, 2018


+

引子: 0.1+0.2===0.3 ?

+

用一道有点无聊的面试题作为开篇:

+
+

0.1+0.2==0.3的结果是什么?
+当然是false

+
+

为什么?简言之,因为JS的number类型是双精度浮点数,浮点数计算有误差。

+
console.log(0.1+0.2==0.3) // false
+//控制台输入,结果如下
+0.1+0.2 //0.30000000000000004
+

至于具体原因就是本文的主题了,下文会依据浮点数的原理解释上述现象。


+

Number类型的二进制表示

+

跟其他强类型语言不同(比如C++,C#,Java等),作为动态语言的JS没有Int这样的整数类型。所有的数字,不管小数还是整数,只有一种类型:number。JS中的number类型是双精度浮点数,即用64位二进制数按照一定规则来存储及表示数字。浮点数的通行标准是IEEE-754,基本思想是使用科学记数法,利用±f×2n\pm f \times 2^n这样的形式来表示数字。 +

+

二进制小数与二进制科学记数法

+

十进制的小数和科学记数法很好理解,但是二进制没那么直观。我们先看个简单的例子。
+
+例1 用二进制小数和科学记数法表示32.125

+

对于十进制来说 32.125=30+2+0.1+0.02+0.005\ 32.125=30+2+0.1+0.02+0.005, 可以拆分为以下几个部分

+ + + + + + + + + + + + + + + + + + + + + +
101100.10-110-210-3
32.125
+

所以 32.125=3×101+2×100+1×101+2×102+5×103=3.2125×101\ 32.125=3 \times 10^1+2 \times 10^0+1 \times 10^{-1}+2 \times 10^{-2}+5 \times 10^{-3}=3.2125 \times 10^{1}

+

类似的,对于二进制来说,32.125=32+0.12532.125=32+0.125,可以拆分如下

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
252423222120.2-12-22-3
100000.001
+

因此 32.125=1×25+0×24+0×23+0×22+0×21+0×20+0×21+0×22+1×23=100000.0012=1.000000012×25\ 32.125=1 \times 2^{5}+0 \times 2^{4}+0 \times 2^{3}+0 \times 2^{2}+0 \times 2^{1}+0 \times 2^{0}+0 \times 2^{-1}+0 \times 2^{-2}+1 \times 2^{-3}=100000.001_{2}=1.00000001_{2} \times 2^{5}

+

先记住这样的形式,接下来浮点数内容中会用到。
+

+

IEEE-754双精度浮点数

+

IEEE-754标准用64位二进制数,以二进制科学记数法的形式表示双精度浮点数,主要分为符号、指数、有效数字三部分。根据标准,64位浮点数的存储结构如下: +

+

存储结构

+ + + + + + + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction
63bit
(1 bit)
62bit...52bit
(11 bits)
51bit...0bit
(52 bits)
0=>正数
1=>负数
按照11bits无符号数处理
实际值=exponent-1023
XXXXX视为二进制小数0.XXXXX2
实际值=fraction+1
+

基本计算公式是  N=(1)sign×2exponent1023×(1+fraction)\ N = (-1)^{sign} \times 2^{exponent-1023} \times (1+fraction)

+
+

计算方法

+
    +
  1. +

    符号位

    +
      +
    • sign=0的时候为正数,sign=1的时候为负数,因此定义最终的符号计算方式为 (1)sign\ (-1)^{sign}
    • +
    +
  2. +
  3. +

    指数部分

    +
      +
    • 11位二进制数以无符号数处理,可以表示总共211,即2048个数,可表示区间为[0, 2047]
    • +
    • 通过减去1023的偏移量,转换到区间[-1022,1023],原区间0和2047作为特殊情况保留
    • +
    +
  4. +
  5. +

    有效数部分

    +
      +
    • 按照标准规范之后,所有的数都默认第一位为1,因此存储时予以省略,仅存储小数点后的二进制部分
    • +
    +
  6. +
+
+

例2 写出32.125对应的IEEE浮点数
+例1中得到了 +32.125=1.000000012×2532.125=1.00000001_2 \times 2^{5}

+

下面根据浮点数的计算公式,计算对应的二进制表示

+
    +
  • 符号位:32.125显然为正数,因此符号位是0
  • +
  • +

    指数部分:指数为5,根据公式,exponent=5+1023=1028=1024+4exponent = 5+1023=1028=1024+4,因此指数部分11位二进制数为100 0000 0100,如下:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    10bit9bit8bit7bit6bit5bit4bit3bit2bit1bit0bit
    210=102429=51228=25627=12826=6425=3224=1623=822=421=220=1
    10000000100
    +
  • +
  • 小数部分:因为标准只存储小数部分,因此 fraction=1.000000011=0.000000012\ fraction=1.00000001-1=0.00000001_2,如下:
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
51bit50bit49bit48bit47bit46bit45bit44bit43bit42bit...0bit
0000000100...0
+

最终的二进制表示为

+ + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction
010000000100(1).0000000100000000000000000000000000000000000000000000
+
+

特殊情况

+

特殊情况有3种,分别是0,正负无穷大和NaN:

+
    +
  • +

    0

    +
      +
    • 符号位为0
    • +
    • 指数部分全为0,即exponent为0
    • +
    • 小数部分为0
    • +
    +
  • +
  • +

    无穷大

    +
      +
    • 符号位任意
    • +
    • 指数部分全为1,即exponent为2047
    • +
    • 小数部分为0
    • +
    +
  • +
  • +

    NaN

    +
      +
    • 符号位任意
    • +
    • 指数部分全为1,即exponent为2047
    • +
    • 小数部分非0
    • +
    +
  • +
+



+

浮点数的误差

+

双精度浮点数只有64位,如果一个十进制数无法被64位二进制数完整表示,那么就会产生误差。首先十进制数需要转换为二进制数,再将二进制数转换为符合IEEE-754标准的形式。这个过程有可能带来误差。
+

+

十进制转浮点数

+

十进制转换时,按照整数部分+小数部分分别计算的原则。整数部分使用除2取余法,小数部分使用乘2取整法。
+

+

例3 32.125转换为二进制数
+先处理整数部分32

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
被除数余数
32160
1680
840
420
210
101
+

从下往上取余数,于是得到10 0000

+

再处理小数部分

+ + + + + + + + + + + + + + + + + + + + + + + + + +
被乘数整数
0.1250.250
0.250.50
0.511
+

从上往下取整数,得到001

+

所以最后得到 32.125=100000.0012\ 32.125=100000.001_2
+
+例4 将0.1转换为IEEE浮点数
+按照例3中的小数转换为二进制的方法,计算如下:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
被乘数整数
0.10.20
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
+

可以看到出现了循环, 0.110=0.000112=1.100112×24\ 0.1_{10} = 0.0\overline{0011}_2=1.1 \overline{0011}_2 \times 2^{-4}

+

无限循环的0.1无法被有限64位完整表示,必须截断后才能保存,这个过程必然会带来误差。先按照例2的方法,可将其转换为浮点数,如下:

+ + + + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction无法表示部分
001111111011‬(1).100110011001100110011001100110011001100110011001100110011...0011...
+
+

舍入

+

IEEE-754规范默认采用的舍入规则是“向最接近的值舍入”,即数字向上或向下舍入,使得舍入后的值最接近原值,如果二者精确度相同,选择偶数的结果。在二进制中,最后一位为0是偶数,1是奇数。
+
+例4-续

+

0.1的二进制小数是无限循环的,转换为浮点数必然存在舍入操作

+ + + + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction无法表示部分
001111111011‬(1).100110011001100110011001100110011001100110011001100110011...0011...
+

为了便于描述,取fraction后2位视为整数,取无法表示部分前4位作为小数,合并记为01.1001,如上表中黑体部分。根据舍入规则,fraction最后2位有效数字为01,如果向上舍入变为10,向下舍入变为00,如何选择呢?

+
+

01.1001的整数部分01,正好是向上舍入后值10的一半,再加上小数部分大于10的一半,因此向上舍入为10的误差小于向下舍入为00的误差,所以这里选择向上舍入。

+
+

因此,0.110以二进制形式保存的值实际上比自身要大一点点,具体表示如下:

+ + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction
001111111011‬(1).1001100110011001100110011001100110011001100110011010
+
+

例5 将0.2转换为IEEE浮点数
+与例4类似,转换过程如下

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
被乘数整数
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
0.40.80
+

可以看到也出现了循环,因此 0.210=0.00112=1.100112×23\ 0.2_{10} = 0.\overline{0011}_2=1.1\overline{0011}_2 \times 2^{-3}

+

转换为浮点数如下:

+ + + + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction无法表示部分
001111111100(1).100110011001100110011001100110011001100110011001100110011...0011...
+

按照舍入规则,最终二进制表示为

+ + + + + + + + + + + + + + + +
符号位sign指数exponent有效数fraction
001111111100‬(1).1001100110011001100110011001100110011001100110011010
+

可以看到,它比真实的0.2也大了一点点。

+



+

0.1+0.2

+

按照规范,两个浮点数计算时有一个步骤叫做对阶,就是让2个操作数的小数点对齐,把较小的指数转化为较大的指数,然后再按照符号进行小数部分的计算。以0.1+0.2为例:

+
+

0.110 =1.100112×2-4
+0.210 = 1.100112×2-3

+
+

计算时,要将0.1变为0.2的同阶

+
+

0.110 =0.1100112×2-3
+0.210 = 1.100112×2-3

+
+

反映到二进制上就是对0.1的二进制码进行右移。因为两数的指数仅相差1,因此只需要右移1位:

+ + + + + + + + + + + + + + + + + + + + + + + +
0.1符号位sign指数exponent有效数fraction
移位前001111111011(1).1001100110011001100110011001100110011001100110011010
移位后001111111100(0).1100110011001100110011001100110011001100110011001101(0)
+ + + + + + + + + + + + + + + + + +
0.2符号位sign指数exponent有效数fraction
不移位001111111100‬(1).1001100110011001100110011001100110011001100110011010
+

相加时,指数不变,有效数部分(包括隐含的1)进行相加,变成了

+0.1100110011001100110011001100110011001100110011001101+1.1001100110011001100110011001100110011001100110011010=10.01100110011001100110011001100110011001100110011001110.1100110011001100110011001100110011001100110011001101\\+1.1001100110011001100110011001100110011001100110011010\\ +=10.0110011001100110011001100110011001100110011001100111 +

因为规范要求有效数的第一位为1,所以需要将和的小数点左移1位,同时指数部分加1。移位后有效数小数部分发生舍入。
+舍入时,最后四位是011(1),向上舍入变成100,向下舍入变为011。原值恰好位于二者中间,无论舍入方案如何,误差都一样。在“向最接近的值舍入”失效的情况下,采用舍入后是偶数的表示形式,即向上舍入变为100。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0.1+0.2符号位sign指数exponent有效数fraction
移位前001111111100(10).0110011001100110011001100110011001100110011001100111
移位后001111111101(1).0011001100110011001100110011001100110011001100110011(1)
舍入后001111111101(1).0011001100110011001100110011001100110011001100110100
+

再将二进制码转换为十进制数,于是得到
+0.1+0.2 = (-1)0×2(1021-1023)×(1+1×2-3+1×2-4+1×2-7+1×2-8+1×2-11+1×2-12+1×2-15+1×2-16+1×2-19+1×2-20+1×2-23+1×2-24+1×2-27+1×2-28+1×2-31+1×2-32+1×2-35+1×2-36+1×2-39+1×2-40+1×2-43+1×2-44+1×2-47+1×2-48+1×2-50)=0.3000000000000000444089209850062616169452667236328125 ≈ 0.30000000000000004

+

题外话

+
    +
  • +

    为什么按照符号位->指数->有效数这样的顺序进行排列二进制位?

    +
      +
    • 这样可以提高比较的速度,尽量实现一次比较得出结果:
    • +
    • 首先比较符号位,如果正负不同,谁大谁小一目了然;
    • +
    • 如果符号相同,那么比较指数,指数大的更大;
    • +
    • 如果指数也相同,那么最后再比较有效数的部分;
    • +
    • 所以才将符号位放在的最高权重位MSB上,而指数和有效数依次放在后面。
    • +
    +
  • +
  • 很显然指数可正可负,这样可以分别表示大于1或小于1的数;
  • +
  • 如果用补码表示,比较的时候又需要先比较符号位再比较数据位,规则太复杂。因此直接把11bits的指数部分当作了无符号数进行计算比较,再通过一个偏移把它映射到一个包含正负的对称区间内;
  • +
  • 11位的二进制数可以表示211,即2048个数,所以11位无符号数可以表示区间[0, 2047],通过减去偏移1024或1023,可以分别映射为2个对称区间:[-1024, 1023]或[-1023,1024]。
  • +
  • +

    标准中最终选择了1023作为偏移,原区间内0和2047作为特殊情况保留,得到转换后的有效指数区间[-1022,1023]。至于标准为什么要映射到对称区间,同时偏移为什么选择1023

    +
    +

    The reason for having |emin| < emax is so that the reciprocal of the smallest number will not overflow. Although it is true that the reciprocal of the largest number will underflow, underflow is usually less serious than overflow.

    +
    +
  • +
  • 因为浮点数可以有多种表示方式,比如1.12×25,也可以写作112×24,又或者0.112×26(因为小数点的位置可变,所以这种类型被称为浮点数)。为了规范表示,避免出现同一个数出现多种表示方法的情况,标准规定采用前者的形式,即第一位始终为1
  • +
  • 这样隐性增加了1位,提高了精度
  • +
+
+

参考文献

+
    +
  1. https://floating-point-gui.de/formats/fp/
  2. +
  3. https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
  4. +
  5. https://www.cnblogs.com/bossin/archive/2007/04/08/704567.html
  6. +
  7. https://www.eecs.wsu.edu/~jdelgado/EE334/chp3b.pdf
  8. +
  9. https://en.wikipedia.org/wiki/Exponent_bias
  10. +
  11. http://blog.reverberate.org/2014/09/what-every-computer-programmer-should.html
  12. +
  13. http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html
  14. +
  15. https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
  16. +
  17. http://www.oxfordmathcenter.com/drupal7/node/43
  18. +
  19. https://blog.angularindepth.com/the-mechanics-behind-exponent-bias-in-floating-point-9b3185083528
  20. +
\ No newline at end of file diff --git a/Blog/Intro to Docker/index.html b/Blog/Intro to Docker/index.html new file mode 100644 index 0000000..5f8deef --- /dev/null +++ b/Blog/Intro to Docker/index.html @@ -0,0 +1,73 @@ +Intro to Docker | Welcome to Alex's Midway \ No newline at end of file diff --git a/Blog/Intro to Functional Programming/index.html b/Blog/Intro to Functional Programming/index.html new file mode 100644 index 0000000..63083d0 --- /dev/null +++ b/Blog/Intro to Functional Programming/index.html @@ -0,0 +1,73 @@ +Intro to Functional Programming | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/JSBridge\347\232\204\344\270\200\347\202\271\346\200\273\347\273\223/index.html" "b/Blog/JSBridge\347\232\204\344\270\200\347\202\271\346\200\273\347\273\223/index.html" new file mode 100644 index 0000000..3ceb001 --- /dev/null +++ "b/Blog/JSBridge\347\232\204\344\270\200\347\202\271\346\200\273\347\273\223/index.html" @@ -0,0 +1,76 @@ +JSBridge的一点总结 | Welcome to Alex's Midway

JSBridge的一点总结

September 28, 2019


写在前面

+

最近做了几个混合App开发的需求,涉及到了JSBridge,记录一下

+

一点总结

+

webview的URL最大长度,跟使用的浏览器内核有关,和客户端同学测试过是8182个字符,和chrome标称的长度一致,所以我司webview内核用的应该是chrome

\ No newline at end of file diff --git "a/Blog/JS\344\270\255\347\232\204\351\232\220\345\274\217\350\275\254\346\215\242/index.html" "b/Blog/JS\344\270\255\347\232\204\351\232\220\345\274\217\350\275\254\346\215\242/index.html" new file mode 100644 index 0000000..73a6ddc --- /dev/null +++ "b/Blog/JS\344\270\255\347\232\204\351\232\220\345\274\217\350\275\254\346\215\242/index.html" @@ -0,0 +1,271 @@ +JS中的隐式转换 | Welcome to Alex's Midway

JS中的隐式转换

September 21, 2018


+

隐式转换相当于调用Boolean(value)方法,其底层实现为ToBoolean(value)方法,转换规则如下表:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
数据类型转换为true的值转换为false的值
Booleantruefalse
String非空字符串
(value.length>0)
空字符串''
(value.length===0)
Number非零值0 或 NaN
Undefined\false
Null\false
Symbol任何值\
+
+

注:转换为Boolean为false的值有:'', false, 0, NaN, undefined, null

+
+

例1

+
Boolean('') //空字符串,0
+Boolean(' ') //含有一个空格的字符串,1
+



+
基本类型转换为String类型
+

隐式转换相当于调用String(value)方法,其底层实现为ToString(value)方法,规则如下表:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
数据类型转换为string的值
Booleantrue=>'true'
false=>'false'
Null'null'
Undefined'undefined'
Number数字的string值
String不转换
Symbol抛出TypeError异常
+

例2

+
String(false) //'false'
+String(1.32e3) //'1320'
+String(-Infinity) //'-Infinity'
+String(NaN) // 'NaN'
+



+
基本类型转换为Number类型
+

隐式转换相当于调用Number(value)方法,底层实现为ToNumber(value)方法,规则如下表:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
数据类型转换为number的值
UndefinedNaN
Null0
Booleantrue=> 1
false=>0
Number不转换
String1.空字符串或仅有空格的字符串=>0
2.整数=>保留符号,忽略整数中的先导0,返回整数
3.浮点数=>保留符号,忽略先导0,返回浮点数
4.十六进制数=>返回相同大小的十进制数
5.二进制数=>返回相同大小的十进制数
6.八进制数=>返回相同大小的十进制数
7.科学记数法=>返回相同大小的十进制数
8.其他=>返回NaN
注:数字字符串中头尾2端的空白,转换时都将被忽略
Symbol抛出TypeError异常
+

例3

+
Number('') //0
+Number('    ') //0
+Number(' -1.33e3 ') //-1330
+Number(' 0x10') //16
+Number(' 1232 4345') //NaN
+



+
+

对象隐式转换为基本类型

+

对象转换为基本类型时:

+
    +
  1. 首先调用ToPrimitive ( input [, PreferredType] )方法,当input可转换为多种基本类型时,可选参数PrefreredType指定优先转换类型
  2. +
  3. +

    随后调用OrdinaryToPrimitive(input,hint)方法,其中hint值由PrefreredType决定,且为以下之一:["default", "string", "number"]:

    +
      +
    1. 如果PrefreredType值为hint String, 则 hint值为"string",依次调用对象的toString, valueOf方法,直至返回值为基本类型
    2. +
    3. 如果PrefreredType值为hint Number, 则 hint值为"number",依次调用对象的valueOf, toString方法,直至返回值为基本类型
    4. +
    5. 如果PrefreredType未指定, 则 hint值为"default",按2步骤执行
    6. +
    7. +

      如果上述执行完毕后,返回值仍不是基本类型,抛出TypeError异常

      +
      +

      注:
      +1.Date对象在转换时,其PrefreredTypehint String
      +2.以上对象默认转换规则,如果对象重写了默认的toString 和/或 valueOf方法,致使无法返回基本类型,那么将抛出TypeError异常

      +
      +
    8. +
    +
  4. +
+

例4

+
let a = {};
+a+1 //'[object Object]1'
+a.toString() //'[object Object]'
+
+function Test(){
+    this.valueOf = function(){return 112233}
+}
+a = new Test();
+a+1 //112234
+String(a) //'[object Object]'
+
+function Test2(){
+  this.toString = function(){return []};
+}
+a= new Test2();
+a+1 //TypeError: Cannot convert object to primitive value 
+
    +
  • 上例中,先将a声明为空对象,a+1进行计算时,a按照规则2.3进行转换,先根据原型链调用Object.valueOf()方法,返回对象自身,然后继续调用Object.toString()方法返回值'[object Object]',最后将a和数字1进行字符串拼接,得到结果;
  • +
  • 之后将a声明为Test类的实例对象,Test中重写了valueOf()方法,再次进行a+1计算时,按照规则2.3进行转换,此时valueOf()方法返回值为基本类型,不再继续调用toString()方法,于是结果变为112234;而调用String(a)将对象优先转换为string类型,仍然调用的是Object.toString()方法,结果与之前相同
  • +
  • 再次声明Test2类,确保其2个方法都没有返回基本类型,再次计算实例a+1时,抛出了TypeError错误
  • +
\ No newline at end of file diff --git "a/Blog/JavaScript\344\270\255\347\232\204\345\216\237\345\236\213\351\223\276/index.html" "b/Blog/JavaScript\344\270\255\347\232\204\345\216\237\345\236\213\351\223\276/index.html" new file mode 100644 index 0000000..d179b04 --- /dev/null +++ "b/Blog/JavaScript\344\270\255\347\232\204\345\216\237\345\236\213\351\223\276/index.html" @@ -0,0 +1,211 @@ +JavaScript中的原型链 | Welcome to Alex's Midway

JavaScript中的原型链

March 24, 2019


+
+

原型链的前提规则

+
    +
  1. +

    任何对象都拥有__proto__属性,指向其 构造函数 (constructor function)原型 (prototype) 对象

    +
      +
    • 例: 假设有数组对象 a,因为它是由数组构造函数Array创建的,那么a.__proto__将指向Array.prototype
    • +
    +
  2. +
+

这里可以引申出 2 个推论:

+
+

推论 1.1:因为构造函数 (constructor function)是函数,而函数都是对象,所以构造函数也是对象。它也有__proto__属性,__proto__指向构造函数之构造函数的原型 (prototype) 对象;

+
+
+

推论 1.2原型 (prototype) 对象也是对象,所以也有__proto__属性,并指向 Object 构造函数原型Object.prototype

+
+

疑问 1.1Object.prototype是否也是对象?如果是,那么它也应该有__proto__属性,这个属性应该指向它自身?如果不是对象,那它是什么?

+
    +
  1. +

    任何函数都是 函数 (Function) 创建的实例,且拥有prototype属性,该属性指向函数对应的原型 (prototype) 对象Function.prototype

    +

    根据 2 和推论 1.1,可以得到推论:

    +
  2. +
+
+

推论 2.1:构造函数既是对象,又是函数实例,因此它不仅拥有__proto__属性,也拥有prototype属性

+
+
+

推论 2.2:构造函数的__proto__属性指向其上一级构造函数原型 (prototype) 对象,即Function.prototype, 它的prototype属性指向[[constructor]].prototype

+
+

疑问 2.1Function作为元构造函数,其自身又是哪个构造函数的实例呢?如果Function是自身的实例,那么其__proto__属性应该指向Function.prototype;如果不是,它的__proto__属性会指向哪里?

+
    +
  1. +

    构造函数的原型 (prototype)对象都有一个构造函数(constructor)属性,指向其对应的构造函数

    +
      +
    • 例:即 Array.prototype.constructor 将指向 Array
    • +
    +
  2. +
+

原型链关系试验

+
/*** 疑问1.1 ***/
+typeof Object.prototype; // 'object'
+Object.prototype === null; // false
+//解释:Object.prototype是对象,按照基础概念1,它有__proto__属性
+
+Object.prototype.__proto__; // null
+//解释:Object.prototype.__proto__指向null,它没有__proto__属性
+
+Object.prototype instanceof Object; // false
+//解释:Object.prototype不是Object的实例
+
+/************************************************************/
+
+/*** 疑问2.1***/
+typeof Function; // 'function'
+Function instanceof Function; // true
+Function instanceof Object; // true
+//解释:Function是构造函数,它是函数,也是对象,所以既有prototype属性,也有__proto__属性
+
+Function.__proto__ == Function.prototype; // true
+//解释:根据推论1.1,Function的构造函数是它自己
+
+typeof Function.prototype; // 'function'
+Function.prototype.prototype; // undefined
+//解释:Function.prototype是函数,但它没有prototype属性
+
+Function.prototype instanceof Function; // fasle
+Function.prototype instanceof Object; // true
+Function.prototype.__proto__ == Object.prototype; // true
+//解释:Function.prototype是函数,但它不是Function的实例,却是Object的实例
+
+typeof Object; // 'function'
+Object instanceof Function; // true
+Object.__proto__ == Function.prototype; // true
+//解释:Object是构造函数,它是Function的实例
+

这里出现了 2 个矛盾点,集中在Object.prototypeFunction.prototype这 2 个对象:

+
    +
  1. Object.prototype是对象,却不是 Object 创建的
  2. +
  3. Function.prototype是函数,却不是 Function 创建的,而是由 Object 创建,但 Object 明明是 Function 的实例
  4. +
+

如果说按照常理,第一点已经怪异到看不懂,那么第二点则是直接变成了“先有鸡 (Function),还是先有蛋 (Object)”的哲学拷问。

+

试验的一点解释

+

逻辑上这样自然说不通,那么只能说明一开始的前提规则错了,或者更具体点说,提到的这 2 个对象是超越规则的存在,不受前提规则的约束。查了下标准,果然这两个东西是基于规则创建的,为了兼容旧版本 JS 设定了一些规则,和构造函数其实没什么关系。

+

关于 Object.prototype(注意加粗部分)

+
+

ECMA-262 19.1.3 Properties of the Object Prototype Object

+

The Object prototype object is the intrinsic object %ObjectPrototype%. The Object prototype object is an ordinary object.

+

The value of the [[Prototype]] internal slot of the Object prototype object is null and the initial value of the [[Extensible]] internal slot is true.

+
+

关于 Function.prototype(注意加粗部分)

+
+

ECMA-262 19.2.3 Properties of the Function Prototype Object

+

The Function prototype object is the intrinsic object %FunctionPrototype%. The Function prototype object is itself a built-in function object. When invoked, it accepts any arguments and returns undefined. It does not have a [[Construct]] internal method so it is not a constructor.

+

NOTE - The Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.

+

The value of the [[Prototype]] internal slot of the Function prototype object is the intrinsic object %ObjectPrototype% (19.1.3). The initial value of the [[Extensible]] internal slot of the Function prototype object is true.

+

The Function prototype object does not have a prototype property.

+

The value of the length property of the Function prototype object is 0.

+

The value of the name property of the Function prototype object is the empty String.

+
+

原型链关系图

+

最后附上一张自己理解的图,权当费脑子的证明吧

+

+ + + prototype chain + +

\ No newline at end of file diff --git "a/Blog/JavaScript\345\211\215\347\253\257RSA\345\212\240\345\257\206/index.html" "b/Blog/JavaScript\345\211\215\347\253\257RSA\345\212\240\345\257\206/index.html" new file mode 100644 index 0000000..faba953 --- /dev/null +++ "b/Blog/JavaScript\345\211\215\347\253\257RSA\345\212\240\345\257\206/index.html" @@ -0,0 +1,73 @@ +JavaScript前端RSA加密 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/JavaScript\347\274\226\347\240\201URL/index.html" "b/Blog/JavaScript\347\274\226\347\240\201URL/index.html" new file mode 100644 index 0000000..28def55 --- /dev/null +++ "b/Blog/JavaScript\347\274\226\347\240\201URL/index.html" @@ -0,0 +1,82 @@ +JavaScript编码URL | Welcome to Alex's Midway
\ No newline at end of file diff --git a/Blog/LeetCode-1-Two Sum/index.html b/Blog/LeetCode-1-Two Sum/index.html new file mode 100644 index 0000000..d37f35e --- /dev/null +++ b/Blog/LeetCode-1-Two Sum/index.html @@ -0,0 +1,145 @@ +[LeetCode 1] Two Sum | Welcome to Alex's Midway

[LeetCode 1] Two Sum

February 28, 2019


Given an array of integers, return indices of the two numbers such that they add up to a specific target.

+

You may assume that each input would have exactly one solution, and you may not use the same element twice.

+

Example:

+
+

Given nums = [2, 7, 11, 15], target = 9,

+

Because nums[0] + nums[1] = 2 + 7 = 9, +return [0, 1].

+
+

题目类型分析

+

Two Sum 可以说是 LC 最经典的题目,没做过 Two Sum 甚至都不好意思说自己刷过 LC。每次看到这道题都会想起自己刷题初期的窘迫,百感交集。

+

这道题没有什么复杂的规则,属于数据结构应用。

+

解法

+
    +
  1. +

    暴力解法

    +

    什么也不想的情况下,第一反应肯定是 brutal force ,2 个 for 循环就完事了。时间复杂度  O(n2)\ O(n^2), 效率实在不高。

    +
    var twoSum = function(nums, target) {
    + var res = [];
    + for (let i = 0; i < nums.length; i++) {
    +   for (let j = i + 1; j < nums.length; j++) {
    +     if (nums[i] + nums[j] == target) {
    +       res[0] = nums[i];
    +       res[1] = nums[j];
    +     }
    +   }
    + }
    + return res;
    +};
    +
  2. +
  3. +

    hashmap 两次遍历

    +

    换一个思路,可以用空间来换时间,先遍历数组,在 hashmap 里建立元素索引,然后再遍历数组,在 hashmap 里找对应元素的配对。这样就把时间复杂度降低到了 O(n)\ O(n),当然空间复杂度也提升到了 O(n)\ O(n)

    +
    var twoSum = function(nums, target) {
    + var map = {},
    +   res = [];
    + //建立索引
    + for (let i = 0; i < nums.length; i++) {
    +   if (map[nums[i]] == undefined) map[nums[i]] = i;
    + }
    + //查找配对元素
    + for (let i = 0; i < nums.length; i++) {
    +   let residual = target - nums[i];
    +   if (map[residual] != undefined && map[residual] != i) {
    +     res.push(map[residual]);
    +     res.push(i);
    +     break;
    +   }
    + }
    + return res;
    +};
    +
  4. +
  5. +

    hashmap 一次遍历

    +

    解法 2 当然可以再优化一下,只需要一次遍历就可以找到结果。少了一次遍历,时间复杂度和空间复杂度同上。

    +
  6. +
+
var twoSum = function(nums, target) {
+  var map = {},
+    res = [];
+  for (let i = 0; i < nums.length; i++) {
+    let curElement = nums[i];
+    let residual = target - curElement;
+    //找到当前元素的配对
+    if (map[residual] !== undefined) {
+      res.push(map[residual]);
+      res.push(i);
+      break;
+    }
+    //建立元素索引
+    map[curElement] = i;
+  }
+  return res;
+};
\ No newline at end of file diff --git a/Blog/LeetCode-2-Add Two Numbers/index.html b/Blog/LeetCode-2-Add Two Numbers/index.html new file mode 100644 index 0000000..924b8a3 --- /dev/null +++ b/Blog/LeetCode-2-Add Two Numbers/index.html @@ -0,0 +1,73 @@ +LeetCode-2-Add Two Numbers | Welcome to Alex's Midway \ No newline at end of file diff --git a/Blog/LeetCode-278-First Bad Version/index.html b/Blog/LeetCode-278-First Bad Version/index.html new file mode 100644 index 0000000..4962971 --- /dev/null +++ b/Blog/LeetCode-278-First Bad Version/index.html @@ -0,0 +1,140 @@ +[LeetCode 278] First Bad Version | Welcome to Alex's Midway

[LeetCode 278] First Bad Version

February 13, 2019


You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.

+

Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one, which causes all the following ones to be bad.

+

You are given an API bool isBadVersion(version) which will return whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

+

题目类型分析

+

很明显属于查找算法题。
+题目要求 API 函数使用次数尽可能少,而且查找对象是自增的自然数序列,直接考虑 Binary Search。

+

解法

+
    +
  1. 生搬硬套 binary search 的解法
  2. +
+
var solution = function(isBadVersion) {
+  /**
+   * @param {integer} n Total versions
+   * @return {integer} The first bad version
+   */
+  return function(n) {
+    var min = 0;
+    var max = n;
+    var mid;
+    while (max >= min) {
+      mid = Math.floor((max - min) / 2) + min;
+      let result = isBadVersion(mid);
+      if (result ^ isBadVersion(mid - 1)) {
+        return mid;
+      }
+      if (result) {
+        max = mid - 1;
+      } else {
+        min = mid + 1;
+      }
+    }
+  };
+};
+

上面是硬套 binary search 形式的笨拙解法,通过 min 和 max 两个 pointer 逼近 target,以 mid pointer 及其前一个元素调用 API 的结果来判断 mid 是否为 bad version。

+

以本题的限制条件来看,上面这段代码中其实有一行逻辑不合理:max=mid-1,尽管它导致的副作用被if (result ^ isBadVersion(mid - 1))排除掉了。

+

原因:只有当 mid 为 bad version 时,max 才会被修改,但根据返回的信息,我们只能确认 mid 是 bad version,而它恰好有可能是第一个 bad version。因此更合理的写法应该是max=mid。这样修改之后,if (result ^ isBadVersion(mid - 1))这几行代码也不需要了,减少了代码行数,也减少了 API 调用次数。

+

结束了吗?还没有,循环的判断条件还要修改为max>min;否则当max==min的时候,程序就陷入死循环了。修改之后,当max==min时循环结束,任意返回二者之一就是答案(也可以重新计算mid,再将其返回,此时 max,min,mid 三者相等)。

+

现在结束了。

+
    +
  1. 按题目限制优化后的 binary search 解法
  2. +
+

根据上面的思路,优化后的代码如下:

+
var solution = function(isBadVersion) {
+  /**
+   * @param {integer} n Total versions
+   * @return {integer} The first bad version
+   */
+  return function(n) {
+    var min = 0;
+    var max = n;
+    var mid;
+    while (max > min) {
+      mid = Math.floor((max - min) / 2) + min;
+      if (isBadVersion(mid)) {
+        max = mid;
+      } else {
+        min = mid + 1;
+      }
+    }
+    return max;
+  };
+};
+

类似题目

+
    +
  1. [LeetCode 374] Guess Number Higher or Lower
  2. +
  3. [LeetCode 34] Find First and Last Position of Element in Sorted Array
  4. +
  5. [LeetCode 35] Search Insert Position
  6. +
\ No newline at end of file diff --git a/Blog/LeetCode-3-Longest Substring Without Repeating Characters/index.html b/Blog/LeetCode-3-Longest Substring Without Repeating Characters/index.html new file mode 100644 index 0000000..432b86e --- /dev/null +++ b/Blog/LeetCode-3-Longest Substring Without Repeating Characters/index.html @@ -0,0 +1,73 @@ +LeetCode-3-Longest Substring Without Repeating Characters | Welcome to Alex's Midway
\ No newline at end of file diff --git a/Blog/LeetCode-461-Hamming Distance/index.html b/Blog/LeetCode-461-Hamming Distance/index.html new file mode 100644 index 0000000..f89b154 --- /dev/null +++ b/Blog/LeetCode-461-Hamming Distance/index.html @@ -0,0 +1,113 @@ +[LeetCode 461] Hamming Distance | Welcome to Alex's Midway

[LeetCode 461] Hamming Distance

February 11, 2019


The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

+

Given two integers x and y, calculate the Hamming distance.

+

Note:  0x,y<231.\ 0 ≤ x, y < 2^{31}.

+

题目类型分析

+

题目要求汉明距离,即统计 2 个数在二进制形式下,不同二进制位的数量。
+开始没有思路,只能判断出它不是考查数据结构、也不是某种算法的应用,先归入数学类应该是比较稳妥的。

+

解法

+
    +
  1. +

    暴力求解法
    +没有思路的情况下最容易想到暴力求解法,大概的流程如下:

    +
      +
    • 比较 x, y,假设 x 为二者中较大的一个,并以它为比较基准
    • +
    • 将 x, y 分别转换为二进制字符串,并将位数对齐
    • +
    • 从 x 的 LSB 开始,循环比较 y 对应位置的二进制位
    • +
    • 如果相同,计数不变;如果不同,计数+1
    • +
    • 循环结束,返回计数结果
    • +
    +

    边界情况:如果 x, y 相等,那么直接返回 0;否则按照上述流程进行计算

    +

    缺陷:存在大量的字符串拼接操作,也保存了完整的二进制字符串。考虑上述两个缺陷,改进的思路有了:1.不使用字符串,考虑直接使用数值进行比较 2. 不保存完整的二进制位,逐位比较完毕后直接丢弃,于是有了下面的解法。

    +
  2. +
  3. +

    改进一点的暴力求解法
    +用“除二取余法”通过数值计算逐位获取二进制表示,同时完成比较,每次比较完毕后就丢弃结果。与上面提到的改进方向一致,大致流程如下:

    +
      +
    • x, y 分别对 2 取余数
    • +
    • 余数相同,则计数+1;否则不变
    • +
    • x, y 分别除以 2,不能整除则向下取整
    • +
    • 重复以上步骤,直至 x, y 均为 0 时,结束循环,返回计数
    • +
    +

    边界情况: 同上

    +

    缺陷:比方法 1 节省了字符串操作和存储,但仍然需要循环计算。

    +

    能不能免去循环计算的过程呢?当然可以,请看下文。

    +
  4. +
  5. +

    利用数学原理求解
    +查一下 wiki,汉明距离的标准算法就是 2 个数进行逻辑异或,结果中只包含二者不同的二进制位(也就是'1'),那么把结果中 1 的个数统计出来就是答案。(逻辑运算真是太美好了!)这个方法完整步骤太简单,就不写了。

    +

    边界情况:同上

    +

    缺陷: 继承了方法 2 的优点,不仅免去了循环计算,还更容易理解,重要结果一步就可以得到,应该是最优方案了吧。

    +
  6. +
\ No newline at end of file diff --git a/Blog/LeetCode-88-Merge Sorted Array/index.html b/Blog/LeetCode-88-Merge Sorted Array/index.html new file mode 100644 index 0000000..b5a1242 --- /dev/null +++ b/Blog/LeetCode-88-Merge Sorted Array/index.html @@ -0,0 +1,95 @@ +[LeetCode 88] Merge Sorted Array | Welcome to Alex's Midway

[LeetCode 88] Merge Sorted Array

February 12, 2019


Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

+

Note:

+

The number of elements initialized in nums1 and nums2 are m and n respectively. +You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.

+

题目类型分析

+

Merge Sort 算法题目,尽可能往这个方向上考虑具体思路。
+如果不能第一时间想到 Merge Sort 说明数据结构和算法基础需要复习,补好基础继续解题才是正确的路。

+

解法

+

现有条件相当于 merge sort 剩最后 2 个子数组,直接比较各自元素再 merge 。
+题目有限制,要求直接修改 nums1,如果使用额外空间会报错,需要对合并步骤做一些调整。 +题目说明 nums1 长度足够,从数组尾部开始,从后往前向 nums1 中复制元素就可以了,步骤如下:

+
    +
  • 比较 nums1 和 nums2 初始尾部元素大小,大的那个移动到 nums1 未使用的尾部
  • +
  • 重复以上步骤,依次把二个子数组当前最大元素复制到 nums1 的尾部,直至二者其中之一所有元素都已复制
  • +
  • 因为是将 nums2 元素合并到 nums1 中,所以只需要考虑剩余数组是 nums2 的情况,继续赋值 nums2 的元素,直至将 nums1 数组填满
  • +
  • 新的 nums1 就是合并后的结果,结束
  • +
+

类似题目

+

不同数据结构的类似题目

+
    +
  1. [LeetCode 21] Merge Two Sorted List
  2. +
  3. [LeetCode 617] Merge Two Binary Trees
  4. +
\ No newline at end of file diff --git "a/Blog/Mac\346\241\214\351\235\242\347\253\257webview\346\211\223\345\274\200\351\241\265\351\235\242\345\244\261\350\264\245\346\216\222\346\237\245/index.html" "b/Blog/Mac\346\241\214\351\235\242\347\253\257webview\346\211\223\345\274\200\351\241\265\351\235\242\345\244\261\350\264\245\346\216\222\346\237\245/index.html" new file mode 100644 index 0000000..d93c16e --- /dev/null +++ "b/Blog/Mac\346\241\214\351\235\242\347\253\257webview\346\211\223\345\274\200\351\241\265\351\235\242\345\244\261\350\264\245\346\216\222\346\237\245/index.html" @@ -0,0 +1,160 @@ +Mac桌面端webview打开页面失败排查 | Welcome to Alex's Midway

Mac桌面端webview打开页面失败排查

October 12, 2020


背景

+

公司产品的Mac桌面端使用webview打开公司PC端主页,主页上有多个Tab。
+其中一个Tab(以下简称A Tab,对应地址以下代称为:https://correct.domain.com)可以跳转到我负责的PC端页面(以下简称B页,对应地址https://correct.domain.com/desktop)。

+

问题描述

+

Mac开发同事反馈在Mac桌面端里点击A Tab无法成功跳转,变成了空白页面,而其他Tab都可以正常点击跳转。

+

排查过程

+

这个bug已知信息非常少,而且涉及到2个项目的代码,只有一步步排查了。

+
    +
  1. 查看bug是否可以复现
    +Mac客户端内点击A Tab,页面确实变成空白,并且可以稳定复现。
  2. +
  3. 查看主页上的跳转链接是否正确
    +浏览器inspect就可以直接看,链接正确。
  4. +
  5. 打开charles抓包Mac请求
    +点击A Tab看如何跳转,结果发现了2条有意思的记录:
  6. +
+ + + + + + + + + + + + + + + + + +
url状态码
https://correct.domain.com302
http://correct.domain.com/desktop301
+

302跳转是预期中的,从业务主域名跳转对应的PC端主页,但不知为什么本来该出现的https变成了http。

+

所以可以定位问题了,点击确实可以跳转,但是因为出现了http链接,所以被webview拦截了。 接下来只需要排查哪一步出现这个重定向就可以了。

+
+

注:苹果推出了ATS,非https请求都会被拦截

+
+
    +
  1. +

    排查Nginx
    +Nginx里只有如下的配置可能会影响到地址,但它只是重写http为https协议而已,并没有重定向到/desktop的功能。

    +
    rewrite      ^(.*)$ https://$host$1 permanent;
    +
  2. +
+

事实上在浏览器上如果同样点击A Tab,跳转过程会有如下3条记录:

+ + + + + + + + + + + + + + + + + + + + + +
url状态码
https://correct.domain.com302
http://correct.domain.com/desktop301
https://correct.domain.com/desktop200
+

普通浏览器没有ATS机制,所以第2条http地址是可以301跳转到对应的https地址的。

+

排除Nginx配置问题,只能是代码层面的问题了。

+
    +
  1. 排查代码
    +先搜索后端代码,以/desktop为关键字,然后在PHP路由文件里找到下面这段代码,问题就在这一行了。
  2. +
+
$url = $this->params["domain"].'desktop';
+$params = $this->request->get();
+if (!empty($params)) {
+    $url = ['/desktop'];    foreach ($params as $key => $val) {
+        $url[$key] = $val;
+    }
+}
+$this->redirect($url);
+
    +
  1. 交给后端同事改了一下这段代码,确保是https跳转,重新发布,bug消失
  2. +
+

小结

+

后端路由代码疏忽,无意中返回了http地址。因为http地址在浏览器中表现正常,能够正常跳转,所以没发现这个bug。

+

总耗时:断断续续大约2小时

\ No newline at end of file diff --git "a/Blog/Native Module xxx tried to override xxx native module\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/index.html" "b/Blog/Native Module xxx tried to override xxx native module\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/index.html" new file mode 100644 index 0000000..abf9c1c --- /dev/null +++ "b/Blog/Native Module xxx tried to override xxx native module\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/index.html" @@ -0,0 +1,89 @@ +Native Module xxx tried to override xxx native module错误解决办法 | Welcome to Alex's Midway

Native Module xxx tried to override xxx native module错误解决办法

March 13, 2018


安卓下又报了个错误

+
+

Native module SplashScreenModule tired to override SplashScreenModule for module name SplashScreenModule. If this was your intention, set canOverrideExistingModule=true

+
+

错误原因

+

这是Project\android\app\src\main\java\com\project\MainApplication.java里面多引用了一个同名模块导致,可能是手动添加了一遍后又自动加了一遍, +删除掉多余的就好了

+
 protected List<ReactPackage> getPackages() {
+      return Arrays.<ReactPackage>asList(
+          new MainReactPackage(),
+            new SplashScreenReactPackage(),            .
+            .
+            .
+            new PickerPackage(),
+            new SplashScreenReactPackage(),//删除这行就好了            new RNDeviceInfo()
+      );
+    }
\ No newline at end of file diff --git "a/Blog/PM2\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/index.html" "b/Blog/PM2\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/index.html" new file mode 100644 index 0000000..886ace6 --- /dev/null +++ "b/Blog/PM2\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/index.html" @@ -0,0 +1,88 @@ +PM2遇到的一个小问题 | Welcome to Alex's Midway

PM2遇到的一个小问题

September 25, 2019


写在前面

+

这篇是大概一个半月前部署node项目时遇到的一个小问题,写下来备忘

+

问题描述

+
    +
  1. 部署完毕,运行报错的时候才发现服务器没有pm2.config.js配置的文件路径
  2. +
  3. ssh登陆服务器,准备手动建好文件路径,结果发现登陆账户权限不足...
  4. +
  5. 迫于无奈,在登陆账户权限范围内新建了文件夹路径,同时改了pm2和nginx配置文件的路径
  6. +
  7. 重启pm2和nginx,再运行不报错了
  8. +
  9. 直接访问项目, 502
  10. +
  11. 输入 pm2 list发现项目重启了500多次,最后还是挂了
  12. +
  13. 搜了一下,找到了解决方案: pm2 delete xxx, 删了项目服务再重启
  14. +
  15. 再次访问项目,ok了
  16. +
+

原因

+

pm2的配置文件某些配置项会有缓存,即使重启也没用,最好还是删了进程再重启

+

Done.

\ No newline at end of file diff --git "a/Blog/RN Animated API\344\275\277\347\224\250/index.html" "b/Blog/RN Animated API\344\275\277\347\224\250/index.html" new file mode 100644 index 0000000..b91a251 --- /dev/null +++ "b/Blog/RN Animated API\344\275\277\347\224\250/index.html" @@ -0,0 +1,95 @@ +RN Animated API使用 | Welcome to Alex's Midway

RN Animated API使用

March 29, 2018


RN 也用了小一段时间了,之前都着重实现功能+赶工期,交互体验方面基本无暇顾及。
+最近项目周期不算太紧,于是小小试验了一下 Animated 的 API,模拟器上的效果还不错。 +简单记录一下 API 的内容,以后备查: +---先挖坑,以后再填---

+
    +
  1. 组件
  2. +
  3. 自带的有Animated.View, Animated.Image, Animated.Text
    +一般用上面的基本就足够了,或者基于上面 3 个自行封装新的动画组件
  4. +
  5. 还可以用createAnimatedComponent()方法创建自定义的动画组件
    +用过方法包装自己封装的扩展button组件,动画效果没出来,不知道是不是因为自己的button用了其他非Animated组件的原因
  6. +
  7. API
  8. +
  9. timing
  10. +
  11. spring
  12. +
  13. interpolate
  14. +
  15. 单个动画实现
  16. +
  17. 组合动画实现
  18. +
\ No newline at end of file diff --git "a/Blog/RN0.53+react-native-splash-screen3.0.1\357\274\214Android\345\220\257\345\212\250\351\227\252\351\200\200/index.html" "b/Blog/RN0.53+react-native-splash-screen3.0.1\357\274\214Android\345\220\257\345\212\250\351\227\252\351\200\200/index.html" new file mode 100644 index 0000000..c27fee9 --- /dev/null +++ "b/Blog/RN0.53+react-native-splash-screen3.0.1\357\274\214Android\345\220\257\345\212\250\351\227\252\351\200\200/index.html" @@ -0,0 +1,92 @@ +RN0.53+react-native-splash-screen3.0.1,Android启动闪退 | Welcome to Alex's Midway

RN0.53+react-native-splash-screen3.0.1,Android启动闪退

March 13, 2018


splash-screen 这个 RN 插件挺好用的,升级之后启动 Android 版 APP 就闪退 +查了 issue 之后发现是文档没更新,在按照说明操作之后,还需要做额外调整:

+

插件 github 地址

+
    +
  1. MainActivity.java 修改为
  2. +
+
SplashScreen.show(this);//原代码
+
+SplashScreen.show(this, true);//修改成这样
+
    +
  1. 然后修改插件源代码 +在node_modules> react-native-splash-screen> android> src> SplashScreen.java
  2. +
+
//原代码,删掉
+mSplashDialog = new Dialog(activity, fullScreen ? R.style.SplashScreen_Fullscreen : R.style.SplashScreen_SplashTheme);
+//修改为下面的mSplashDialog = new Dialog(activity, R.layout.launch_screen);
+

之后就可以正常运行了

\ No newline at end of file diff --git "a/Blog/RN0.53\346\211\276\344\270\215\345\210\260remote debugger\350\247\243\345\206\263\346\226\271\346\241\210/index.html" "b/Blog/RN0.53\346\211\276\344\270\215\345\210\260remote debugger\350\247\243\345\206\263\346\226\271\346\241\210/index.html" new file mode 100644 index 0000000..d289177 --- /dev/null +++ "b/Blog/RN0.53\346\211\276\344\270\215\345\210\260remote debugger\350\247\243\345\206\263\346\226\271\346\241\210/index.html" @@ -0,0 +1,85 @@ +RN0.53找不到remote debugger解决方案 | Welcome to Alex's Midway

RN0.53找不到remote debugger解决方案

March 08, 2018


+

更新: +换了 0.53 版本的 RN,目前 android 遇到的,而且只有模拟器,真机调试都不会有以下问题

+
+
现象:
+

直接打开调试会找 10.0.2.2:8081/debugger-ui/,但是这个地址并不能连接成功

+
解决方法:
+

手动修改地址为http://localhost:8081/debugger-ui/ ,然后重新启动 app,就可以成功开始 debug 了

+
+

话说 RN 这个版本怎么这么坑啊...

\ No newline at end of file diff --git "a/Blog/React-Navigation\344\270\255tabNavigator\345\216\273\346\216\211\346\214\207\347\244\272\347\272\277/index.html" "b/Blog/React-Navigation\344\270\255tabNavigator\345\216\273\346\216\211\346\214\207\347\244\272\347\272\277/index.html" new file mode 100644 index 0000000..41e53b3 --- /dev/null +++ "b/Blog/React-Navigation\344\270\255tabNavigator\345\216\273\346\216\211\346\214\207\347\244\272\347\272\277/index.html" @@ -0,0 +1,94 @@ +React-Navigation中tabNavigator去掉指示线 | Welcome to Alex's Midway

React-Navigation中tabNavigator去掉指示线

March 12, 2018


bottom 模式的 tabBar 也出现了 indicator(就是选中某个 tabbar icon 的时候,出现的那根线,一般是出现在 top 模式下的) +感觉很烦人,想去掉,开始自然想到把这根线调为透明

+
tabBarOption: {
+  indicatorStyle: {
+    opacity: 0,    }
+}
+

发现不管用。

+

查了一下 issue,发现了下面这个解决方案:

+
export const AppNavigator = TabNavigator(
+ {
+    screenA:  screen1
+  },
+  {
+    screenB: screen2
+  },
+  {
+     tabBarOptions: {        renderIndicator: () => null//加上这句就不会渲染indicator了     }  }
+}
+

搞定!

\ No newline at end of file diff --git "a/Blog/React-Navigation\344\270\255\345\216\273\346\216\211header\344\270\213\347\232\204\351\230\264\345\275\261/index.html" "b/Blog/React-Navigation\344\270\255\345\216\273\346\216\211header\344\270\213\347\232\204\351\230\264\345\275\261/index.html" new file mode 100644 index 0000000..4525607 --- /dev/null +++ "b/Blog/React-Navigation\344\270\255\345\216\273\346\216\211header\344\270\213\347\232\204\351\230\264\345\275\261/index.html" @@ -0,0 +1,84 @@ +React-Navigation中去掉header下的阴影 | Welcome to Alex's Midway

React-Navigation中去掉header下的阴影

March 18, 2018


    +
  1. StackNavigator
    +在navigationOptions里修改headerStyle
  2. +
  3. TabNavigator
    +在tabBarOptions修改style
  4. +
+

代码

+
//Android
+elevation:0
+//iOS
+shadowOpacity:0
+

最好在navigator定义时设置navigationOptions,否则在页面嵌套的时候容易冲突,可能设置不起作用

\ No newline at end of file diff --git "a/Blog/Sequelize\345\222\214MySql\346\227\266\351\227\264\346\240\274\345\274\217\345\260\217\350\256\260/index.html" "b/Blog/Sequelize\345\222\214MySql\346\227\266\351\227\264\346\240\274\345\274\217\345\260\217\350\256\260/index.html" new file mode 100644 index 0000000..9ea33df --- /dev/null +++ "b/Blog/Sequelize\345\222\214MySql\346\227\266\351\227\264\346\240\274\345\274\217\345\260\217\350\256\260/index.html" @@ -0,0 +1,74 @@ +Sequelize和MySql时间格式小记 | Welcome to Alex's Midway
\ No newline at end of file diff --git a/Blog/Server-Side GraphQL/index.html b/Blog/Server-Side GraphQL/index.html new file mode 100644 index 0000000..630e654 --- /dev/null +++ b/Blog/Server-Side GraphQL/index.html @@ -0,0 +1,73 @@ +Server-Side GraphQL | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/StackNavigator Header\345\242\236\345\212\240\342\200\234\350\277\224\345\233\236\342\200\235\346\214\211\351\222\256/index.html" "b/Blog/StackNavigator Header\345\242\236\345\212\240\342\200\234\350\277\224\345\233\236\342\200\235\346\214\211\351\222\256/index.html" new file mode 100644 index 0000000..8a04c56 --- /dev/null +++ "b/Blog/StackNavigator Header\345\242\236\345\212\240\342\200\234\350\277\224\345\233\236\342\200\235\346\214\211\351\222\256/index.html" @@ -0,0 +1,99 @@ +StackNavigator Header增加“返回”按钮 | Welcome to Alex's Midway

StackNavigator Header增加“返回”按钮

September 26, 2017


StackNavigator 自带了 navigationOptions 属性,但必须以静态对象申明

+

实现有 3 个要点:

+
    +
  1. navigationOptions 对象里,创建{param}常量,然后 headerLeft 或者 headerRight 里配置好闭包函数
    +这样做是因为 navigation 是类的实例成员,无法通过类成员访问,所以需要用闭包绕开这一限制
  2. +
  3. 在 DidMount 事件中配置 params 的闭包函数对象
  4. +
  5. 页面跳转的执行函数
  6. +
+
static navigationOptions = ({navigation}) => ({
+      const {params} = navigation.state;
+      title: 'PlayGround',
+      headerRight: <View />,//之前提到过,占位的用的空view
+      headerLeft:        <Button onPress={params.handleNavigation && params.handleNavigation()} />,      headerStyle: {
+        backgroundColor: 'white',
+      },
+      headerTitleStyle: {
+        textAlign: "center",
+        alignSelf: "center",
+        fontSize: 16,
+      }
+  });
+  //页面跳转执行函数  toOtherScreen(){    this.props.navigation.navigate('pageDest');  }
+  componentDidMount(){
+    this.navigation.setParams(
+      handleNavigation: ()=>{this.toOtherScreen()}
+    )
+  }
\ No newline at end of file diff --git "a/Blog/Svelte\345\210\235\346\216\242/index.html" "b/Blog/Svelte\345\210\235\346\216\242/index.html" new file mode 100644 index 0000000..13f6e6e --- /dev/null +++ "b/Blog/Svelte\345\210\235\346\216\242/index.html" @@ -0,0 +1,73 @@ +Svelte初探 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/TCP\344\270\211\346\254\241\346\217\241\346\211\213/index.html" "b/Blog/TCP\344\270\211\346\254\241\346\217\241\346\211\213/index.html" new file mode 100644 index 0000000..7ba0078 --- /dev/null +++ "b/Blog/TCP\344\270\211\346\254\241\346\217\241\346\211\213/index.html" @@ -0,0 +1,73 @@ +TCP三次握手 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/The Virtual DOM\351\230\205\350\257\273\347\254\224\350\256\260/index.html" "b/Blog/The Virtual DOM\351\230\205\350\257\273\347\254\224\350\256\260/index.html" new file mode 100644 index 0000000..47c2cf5 --- /dev/null +++ "b/Blog/The Virtual DOM\351\230\205\350\257\273\347\254\224\350\256\260/index.html" @@ -0,0 +1,87 @@ +The Virtual DOM阅读笔记 | Welcome to Alex's Midway

The Virtual DOM阅读笔记

August 22, 2017


Dan Abramov 在 2018-11-24 发了一系列推文是说明 React 的本质。他提到 Virtual DOM 这个词该退休了,这个词并没有说清楚 React 到底是什么。React 本质是“UI 类型”,和 JS 中其他类型一样可以保存、修改和操作,可表现性才是它的本质,而不是通过 diff 来减少 DOM 更改。

+

=====以下的理解全部错误=========

+

React 出现的原因

+

因为前端页面大量的 DOM 操作,其中很大一部分是因为不必要的 DOM 更新。比如只是改了 10 个对象中的 1 个,在之前的框架下没变化的 9 个也不得不一起跟随刷新,显然这个 9 个操作是不必要的。有点像当年的 AJAX 的出现是为了解决网页部件的不必要更新一样,React 也是为了只更新变化的部分。
+减少了更新的部分,自然也就减少了更新 DOM 的操作,于是得到了性能的提高。

+

实现的手段 Virtual DOM

+

React 实现了一个 Virtual DOM 的对象,可以认为是真实 DOM 的一个复制品,区别在于 virtual DOM 并不展现到屏幕上。 +因为不必显示,virtual DOM 的更改速度快得多。通过更新 virtual DOM,再将 virtual DOM 的变化映射到真实 DOM,达到修改的目的。 +感觉设计理念有那么一点像当年的微软做过的 DataSet,数据在内存中修改之后一次性提交,减少频繁的数据库操作,提高响应速度。

+

更新 DOM 的流程

+

更新的时候先建立一个 T0 时刻的 pre-virtual DOM,然后开始更新,得到 T1 时刻 virtual DOM; +更新完毕比较 T0 和 T1 时刻的 virtual DOM 变化,这一步叫做 diffing +只将变化的部分提交到 DOM; +DOM 的变化引起显示的改变,更新完毕;

+

原文链接

\ No newline at end of file diff --git "a/Blog/Vue\344\270\255v-if\345\222\214v-show\351\201\207\345\210\260\347\232\204\345\260\217\351\227\256\351\242\230/index.html" "b/Blog/Vue\344\270\255v-if\345\222\214v-show\351\201\207\345\210\260\347\232\204\345\260\217\351\227\256\351\242\230/index.html" new file mode 100644 index 0000000..a183361 --- /dev/null +++ "b/Blog/Vue\344\270\255v-if\345\222\214v-show\351\201\207\345\210\260\347\232\204\345\260\217\351\227\256\351\242\230/index.html" @@ -0,0 +1,73 @@ +Vue中v-if和v-show遇到的小问题 | Welcome to Alex's Midway
\ No newline at end of file diff --git "a/Blog/Vue\344\275\277\347\224\250provide-inject\347\211\271\346\200\247\346\263\250\345\205\245\347\232\256\350\202\244\351\205\215\347\275\256/index.html" "b/Blog/Vue\344\275\277\347\224\250provide-inject\347\211\271\346\200\247\346\263\250\345\205\245\347\232\256\350\202\244\351\205\215\347\275\256/index.html" new file mode 100644 index 0000000..c0d7385 --- /dev/null +++ "b/Blog/Vue\344\275\277\347\224\250provide-inject\347\211\271\346\200\247\346\263\250\345\205\245\347\232\256\350\202\244\351\205\215\347\275\256/index.html" @@ -0,0 +1,97 @@ +Vue使用provide-inject特性注入皮肤配置 | Welcome to Alex's Midway

Vue使用provide-inject特性注入皮肤配置

January 03, 2020


背景

+

H5页面主题皮肤切换,有2条路线,一是使用css实现,一是使用js实现。

+

其实需求很简单,希望组件本身可以和皮肤主题解耦,这样至少有2个好处:

+
    +
  • 更改的时候只用在皮肤设置文件更改一次
  • +
  • 组件本身与主题样式无关,只在需要的时候把组件和主题组合使用,有足够的灵活性
  • +
+

现有方案的问题

+

现有方案使用的less,在每个组件中引入less variables,然后再按照css规则渲染主题。

+

其实已经基本够用了,只是必须每个组件分别编写对应主题下的规则,引入了主题和组件的强耦合,不是特别好的设计,也无法做到实时更改主题。

+

本来可以用sass的mixin,但同事都比较排斥sass,只好放弃。

+

于是考虑尝试js的方案。

+

JS的方案

+

搜索的过程中看到了vuetify,它的主题实现就用的provide模式,看了文档之后发现这个就是vue版的React context,来了兴趣就试验了一下。

+

废话完毕,先看看基本使用

+

Provide-Eject基本使用

+

查下vue的官方文档就明白了,2句话:

+
    +
  1. 父组件配置provide,注入属性
  2. +
  3. 子组件配置inject,使用属性
  4. +
+

当然vue本身还支持provide-inject之间互传信息的,对于主题来说,内部注入主题已经足够了,所以没有再继续深究这个特性。

+

版本一:基本使用

+

版本二:结合mixin

+

版本三:实时换主题

\ No newline at end of file diff --git "a/Blog/Vue\345\256\236\344\276\213\346\226\271\346\263\225\347\232\204this\346\214\207\345\220\221/index.html" "b/Blog/Vue\345\256\236\344\276\213\346\226\271\346\263\225\347\232\204this\346\214\207\345\220\221/index.html" new file mode 100644 index 0000000..e5d5cf1 --- /dev/null +++ "b/Blog/Vue\345\256\236\344\276\213\346\226\271\346\263\225\347\232\204this\346\214\207\345\220\221/index.html" @@ -0,0 +1,136 @@ +Vue实例方法的this指向 | Welcome to Alex's Midway

Vue实例方法的this指向

June 09, 2020


背景

+

做Code Review的时候遇到一段Vue的SFC代码,需要在mounted生命周期里绑定document的scroll事件

+

下面这段代码的问题有哪些?

+
export default {
+    methods:{
+        testThis(){
+            console.log(this);
+        }
+    },
+    mounted(){
+        const vm = this;
+        window.addEventListener.add('scroll',vm.testThis);
+    }
+}
+// 窗口滚动后输出是什么?
+

另一个例子

+

再看一个其他例子

+
const obj = {
+    a(){
+        console.log(this);
+    },
+    b(){
+        window.addEventListener('scroll',this.a);
+    }
+}
+
+// 全局作用域下执行
+obj.b()
+// 窗口滚动后输出是什么?
+

答案

+
    +
  1. 第一个console输出的是Vue实例
  2. +
  3. 第二个console输出的是window
  4. +
+

原因

+
    +
  • +

    第二个console的才是正常的情况

    +

    根据MDN的文档,执行event handler的时候,如果没有指定this对象,那么this指向event listener的对象,即指向window。

    +
  • +
  • +

    在第一个console里,Vue肯定帮我们做了些事情

    +

    经过查看源码,发现Vue在初始化方法initMethods的时候,为每一个方法都做了this绑定。

    +
    function(vm, methods){
    +    ...
    +    for(var key in methods){
    +        ...
    +        vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key],vm);
    +    }
    +}
    +
  • +
+

第一段代码的问题

+

最后再说会Code Review的问题,有2个错误:

+
    +
  • 用了this被shadowing的方法,来处理this指向问题,属于概念不清
  • +
  • 在不清楚this指向问题的时候,没有用bind来绑定this
  • +
+

结论

+
    +
  • Vue实例方法中,只要不存在this shadowing的情况,直接传this.[method]就可以了
  • +
  • 不清楚this指向,this.[method]内部又使用了this.xxx需要确认this指向关系的,可以用bind方法绑定后再传入
  • +
+

以上~

\ No newline at end of file diff --git "a/Blog/Websocket\345\210\235\346\255\245/index.html" "b/Blog/Websocket\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..bf48ad7 --- /dev/null +++ "b/Blog/Websocket\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +Websocket初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/XMLHttpRequest\345\233\236\351\241\276/index.html" "b/Blog/XMLHttpRequest\345\233\236\351\241\276/index.html" new file mode 100644 index 0000000..cc7f6c2 --- /dev/null +++ "b/Blog/XMLHttpRequest\345\233\236\351\241\276/index.html" @@ -0,0 +1,73 @@ +XMLHttpRequest回顾 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/antd-mobile\345\274\225\347\224\250\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/index.html" "b/Blog/antd-mobile\345\274\225\347\224\250\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/index.html" new file mode 100644 index 0000000..8037d94 --- /dev/null +++ "b/Blog/antd-mobile\345\274\225\347\224\250\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/index.html" @@ -0,0 +1,106 @@ +antd-mobile引用错误解决办法 | Welcome to Alex's Midway

antd-mobile引用错误解决办法

March 09, 2018


问题:

+

创建 APP 代码完整框架的时候,因为升级到了 2.x 版本的antd-mobile,报了下面错误

+
+

但是运行时出现依赖 react-dom 的错误

+
+

"Unable to resolve module react-dom from /Users/xiesubin/Workspace/Project/seller-pad-rn/node_modules/rc-animate/lib/AnimateChild.js

+
+
+

原因:

+

1.创建项目使用的react-native init,官方说明是

+
+

有人反映通过 react-native init 创建的项目在使用时可能会报 Unable to resolve module react-dom 的错误 , +此时不妨安装 babel-plugin-module-resolver 试试~

+
+

2.issue 里有人分析是因为

+
+

查看babel-preset-expo 源码,发现比 babel-preset-react-native 多个插件 babel-plugin-module-resolver

+
+

所以没有用babel-preset-expo创建项目的话,需要加上babel-plugin-importbabel-plugin-module-resolver的引用

+

解决办法:

+
    +
  1. npm i antd-mobile
  2. +
  3. npm i -D babel-plugin-import babel-plugin-module-resolver
  4. +
  5. update .babelrc:
  6. +
+
  {
+    "presets": ["react-native"],
+    "plugins": [["import", { "libraryName": "antd-mobile" }]],
+    "env": {
+      "development": {
+        "plugins": ["transform-react-jsx-source"]
+      }
+    }
+  }
\ No newline at end of file diff --git "a/Blog/array.indexof\345\222\214array.includes/index.html" "b/Blog/array.indexof\345\222\214array.includes/index.html" new file mode 100644 index 0000000..61c3245 --- /dev/null +++ "b/Blog/array.indexof\345\222\214array.includes/index.html" @@ -0,0 +1,131 @@ +array.indexOf和array.includes | Welcome to Alex's Midway

array.indexOf和array.includes

October 03, 2018


+

一点微小差别

+

indexOf 和 includes 都可以用来判断数组是否包含某个元素,二者到底有什么区别呢?看一个例子:

+
let a = [1,2,3,null,undefined,NaN];
+
+if(a.indexOf(NaN)!==-1){
+  console.log('using Array.indexOf: Found NaN in Array a!');
+}else{
+  console.log('using Array.indexOf: No NaN found in Array a~');
+}
+
+if(a.includes(NaN)){
+  console.log('using Array.includes: Found NaN in Array a!');
+}else{
+  console.log('using Array.includes: No NaN found in Array a~');
+}
+
+//输出:
+>'using Array.indexOf: No NaN found in Array a~'
+>'using Array.includes: Found NaN in Array a!'
+

为什么

+

二者内部使用的算法不同:

+
    +
  • indexof 内部使用全等操作符,即===进行比较;
  • +
  • includes 内部使用的算法是SameValueZero
  • +
+

全等操作符进行NaN===NaN比较时,必然返回false,所以indexOf无法判断数组内是否含有 NaN。

+

SameValueZero规则 2.1解释了原因:

+
    +
  1. x,y类型不同,返回false
  2. +
  3. +

    x,y同为number类型,那么

    +
      +
    1. 同为NaN时,返回true
    2. +
    3. 同为 0 时(不管 0 之前的符号),返回true
    4. +
    5. 数值相等时,返回true
    6. +
    7. 其他情况,返回false
    8. +
    +
  4. +
  5. x,y同为其他类型,仅在值相同时返回true
  6. +
+

结论

+

其实indexOfincludes二者的搜索机制差不多,只有比较算法不同。实际使用我倾向于后者,一方面因为前者这个隐含的坑,另一方面后者直接返回true/false,更加直观。

+

参考文献

+
\ No newline at end of file diff --git "a/Blog/background-image\350\270\251\345\235\221/index.html" "b/Blog/background-image\350\270\251\345\235\221/index.html" new file mode 100644 index 0000000..b8baef9 --- /dev/null +++ "b/Blog/background-image\350\270\251\345\235\221/index.html" @@ -0,0 +1,87 @@ +background-image踩坑 | Welcome to Alex's Midway

background-image踩坑

May 25, 2020


现象

+

用了一个雪碧图,图片的真实宽高是 112px*22px,对应了 4 种情况下的 4 个图标 A,B,C,D, 每个分别是 28pt*22pt,折算到两倍屏就是 14pt*11pt 的图标尺寸。

+
.icon {
+    width: 14px;
+    height: 11px;
+    background-image: url('path/to/icon');
+    background-size: cover;
+    background-repeat: no-repeat;
+    background-position: -42px -0px;//x为14的负整数倍,-42,-28,-14,0
+}
+

@1x,@2x,@3x 整数倍 dpr 的屏幕显示都正常。但是某些 Android 手机的 dpr 不是整数,比如小米 9 是 2.75,发现显示的图标变形了,漏出其他部分的边缘,非常难看。

+

解决: 修改 background-size 属性值

+

把 background-size 设置为了图片的真实尺寸,按@2x 计算是 56pt*11pt,之后显示一切正常了。

+

总结

+

使用pt指定图片显示尺寸,position使用px

\ No newline at end of file diff --git "a/Blog/echarts\344\275\277\347\224\250\345\260\217\350\256\260/index.html" "b/Blog/echarts\344\275\277\347\224\250\345\260\217\350\256\260/index.html" new file mode 100644 index 0000000..aca00de --- /dev/null +++ "b/Blog/echarts\344\275\277\347\224\250\345\260\217\350\256\260/index.html" @@ -0,0 +1,73 @@ +echarts使用小记 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/echarts\345\260\201\350\243\205Vue\347\273\204\344\273\266/index.html" "b/Blog/echarts\345\260\201\350\243\205Vue\347\273\204\344\273\266/index.html" new file mode 100644 index 0000000..1b5f7c6 --- /dev/null +++ "b/Blog/echarts\345\260\201\350\243\205Vue\347\273\204\344\273\266/index.html" @@ -0,0 +1,73 @@ +echarts封装Vue组件 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/header title\345\234\250Android\344\270\213\344\270\215\345\261\205\344\270\255\351\227\256\351\242\230\347\232\204\350\247\243\345\206\263\346\212\200\345\267\247/index.html" "b/Blog/header title\345\234\250Android\344\270\213\344\270\215\345\261\205\344\270\255\351\227\256\351\242\230\347\232\204\350\247\243\345\206\263\346\212\200\345\267\247/index.html" new file mode 100644 index 0000000..d3df6bb --- /dev/null +++ "b/Blog/header title\345\234\250Android\344\270\213\344\270\215\345\261\205\344\270\255\351\227\256\351\242\230\347\232\204\350\247\243\345\206\263\346\212\200\345\267\247/index.html" @@ -0,0 +1,82 @@ +header title在Android下不居中问题的解决技巧 | Welcome to Alex's Midway

header title在Android下不居中问题的解决技巧

September 22, 2017


页面用了 stackNavigator,header left 加了一个 button,header titleStyle 也设置了居中

+

iOS 下没有问题,但是在 Android 下发现 title 向右偏移

+

系统版本

+
    +
  • RN 0.47.2
  • +
  • NODE 8.4
  • +
  • NPM 4.6.2
  • +
+

解决办法

+

header right 增加一个空的 view 占位,之后就可以保证 title 在 Android 下居中了

\ No newline at end of file diff --git "a/Blog/iTerm2\350\207\252\345\212\250\345\241\253\345\205\205\345\257\206\347\240\201\350\256\277\351\227\256ssh/index.html" "b/Blog/iTerm2\350\207\252\345\212\250\345\241\253\345\205\205\345\257\206\347\240\201\350\256\277\351\227\256ssh/index.html" new file mode 100644 index 0000000..59b3d42 --- /dev/null +++ "b/Blog/iTerm2\350\207\252\345\212\250\345\241\253\345\205\205\345\257\206\347\240\201\350\256\277\351\227\256ssh/index.html" @@ -0,0 +1,73 @@ +iTerm2自动填充密码访问ssh | Welcome to Alex's Midway \ No newline at end of file diff --git a/Blog/index.html b/Blog/index.html new file mode 100644 index 0000000..ba7a4e6 --- /dev/null +++ b/Blog/index.html @@ -0,0 +1,75 @@ +Blog | Welcome to Alex's Midway

"The ultimate test of your knowledge is your capacity to convey it to another."

2020

2019

2018

2017

\ No newline at end of file diff --git "a/Blog/mac\347\273\210\347\253\257\344\270\255\346\226\207\346\230\276\347\244\272\346\225\260\345\255\227\347\274\226\347\240\201\347\232\204\350\256\276\347\275\256\351\227\256\351\242\230/index.html" "b/Blog/mac\347\273\210\347\253\257\344\270\255\346\226\207\346\230\276\347\244\272\346\225\260\345\255\227\347\274\226\347\240\201\347\232\204\350\256\276\347\275\256\351\227\256\351\242\230/index.html" new file mode 100644 index 0000000..f756a20 --- /dev/null +++ "b/Blog/mac\347\273\210\347\253\257\344\270\255\346\226\207\346\230\276\347\244\272\346\225\260\345\255\227\347\274\226\347\240\201\347\232\204\350\256\276\347\275\256\351\227\256\351\242\230/index.html" @@ -0,0 +1,106 @@ +mac终端中文显示数字编码的设置问题 | Welcome to Alex's Midway

mac终端中文显示数字编码的设置问题

October 16, 2019


问题描述

+

新部署的服务器,查看git commit message不显示中文了,全是各种数字编码,而旧服务器显示一切正常,这显然是编码问题了。

+

原因

+

简单google了一下,发现是服务器字符集和本机字符集不匹配。

+

输入locale查看本机的配置,发现LANG和LC_ALL都为空

+
LANG=
+LC_COLLATE="C"
+LC_CTYPE="UTF-8"
+LC_MESSAGES="C"
+LC_MONETARY="C"
+LC_NUMERIC="C"
+LC_TIME="C"
+LC_ALL=
+

而服务器上的LANG和LC_ALL都是utf-8

+
LANG="en_US.UTF-8"
+LC_CTYPE="en_US.UTF-8"
+LC_NUMERIC="en_US.UTF-8"
+LC_TIME="en_US.UTF-8"
+LC_COLLATE="en_US.UTF-8"
+LC_MONETARY="en_US.UTF-8"
+LC_MESSAGES="en_US.UTF-8"
+LC_PAPER="en_US.UTF-8"
+LC_NAME="en_US.UTF-8"
+LC_ADDRESS="en_US.UTF-8"
+LC_TELEPHONE="en_US.UTF-8"
+LC_MEASUREMENT="en_US.UTF-8"
+LC_IDENTIFICATION="en_US.UTF-8"
+LC_ALL="en_US.UTF-8"
+

解决方案

+

本地用的zsh,所以在本地打开zsh配置文件vi ~/.zshrc,有一段注释的代码,输入下面的内容

+
# You may need to manually set your language environment
+  export LANG="en_US.UTF-8"
+  export LC_ALL="en_US.UTF-8"
+

接着重启终端,或者 source ~/.zshrc使设置生效就可以了,done

\ No newline at end of file diff --git "a/Blog/nginx\345\237\272\346\234\254\351\205\215\347\275\256/index.html" "b/Blog/nginx\345\237\272\346\234\254\351\205\215\347\275\256/index.html" new file mode 100644 index 0000000..5654de9 --- /dev/null +++ "b/Blog/nginx\345\237\272\346\234\254\351\205\215\347\275\256/index.html" @@ -0,0 +1,100 @@ +nginx基本配置 | Welcome to Alex's Midway

nginx基本配置

January 15, 2020


三个主要字段

+

http,server,location

+

location配置

+

优先级

+

=

+

^~

+

~

+

~*

+

/

+

反向代理配置

+

proxy_pass

+

gzip配置

+
gzip on;
+gzip_min_length 1k; 
+gzip_buffers   4 16k;
+gzip_http_version 1.1; # 为什是1.1
+gzip_comp_level 2;  # 为什么选择2
+gzip_types    
+		text/plain 
+		text/javascript
+		application/javascript 
+		text/css 
+		application/json
+		application/xml;
+    	gzip_vary on;
+
+gzip_proxied any;
+

案例

\ No newline at end of file diff --git "a/Blog/nginx\351\205\215\347\275\256\347\232\204\344\270\200\344\270\252\345\260\217\351\224\231\350\257\257/index.html" "b/Blog/nginx\351\205\215\347\275\256\347\232\204\344\270\200\344\270\252\345\260\217\351\224\231\350\257\257/index.html" new file mode 100644 index 0000000..6f0b275 --- /dev/null +++ "b/Blog/nginx\351\205\215\347\275\256\347\232\204\344\270\200\344\270\252\345\260\217\351\224\231\350\257\257/index.html" @@ -0,0 +1,129 @@ +nginx配置的一个小错误 | Welcome to Alex's Midway

nginx配置的一个小错误

October 11, 2019


写在前面

+

最近一次帮同事找错误的经历,虽然最后发现是很低级的错误,但是过程挺有意思

+

问题描述

+

之前搭建的新管理后台项目A上线了,搭档想在本地调试,于是按照文档配好了nginx配置文件,本地启动项目,按域名访问却被重定向到了另一个项目B的页面

+

排查过程

+
    +
  1. +

    检查项目A的ip地址是否正确

    +

    确认是本机ip,没有错,刷新页面,问题依旧

    +
  2. +
  3. +

    switchHosts关闭其他项目的host配置,只保留项目A的配置

    +

    清理dns缓存,刷新页面,问题依旧,怀疑nginx配置没有生效

    +
  4. +
  5. +

    nginx -t 检查配置

    +

    检查失败,报错“duplicate upstream a-proxy”,定位到A的nginx配置文件

    +

    a-proxy是配置的反向代理,在配置文件里大概是这样的

    +
    server {
    +    ...
    +    location / {
    +        ...
    +        proxy_pass http://a-proxy;
    +    }
    +}
    +upstream a-proxy {
    +   server 127.0.0.1: 12076;
    +}
    +

    google了一下这个错误,说是出现了这个错误说明a-proxy出现了多次,删除多余的就可以,于是排查配置文件

    +
  6. +
  7. +

    A的nginx配置文件中搜索重复的a-proxy

    +

    没有找到

    +
  8. +
  9. +

    排查其他servernginx配置文件,搜索重复的a-proxy

    +

    没有找到

    +
  10. +
  11. +

    排查合并的主nginx配置文件,搜索重复的a-proxy

    +

    还是没有找到

    +
  12. +
  13. +

    a-proxy改名,看是否还是报错

    +

    仍然报相同的错误,“duplicate upstream xxx-proxy”,这样基本上可以确认是A的同一份配置文件被加载了多次导致的错误

    +
  14. +
  15. +

    回到主nginx配置文件,开始查找加载的配置代码

    +

    经过排查发现 include servers/*代码出现了多次,正是这个代码导致了同一份配置文件被多次加载。 +于是删除多余代码,重新nginx -t检查通过,重启nginx后项目访问正常

    +
  16. +
+

总耗时: 1小时

+

总结

+

经过搭档回忆,起因是之前重装nginx复制粘贴配置文件的时候不小心复制重复了一些内容。

+

其他配置尽管重复加载,但没有遇到这个不允许重复的情况,这个问题一直没有暴露出来,直到这次...

+

自己对nginx不太熟悉,以后还要抽时间补一补相关知识,以上。

\ No newline at end of file diff --git "a/Blog/node\345\274\200\345\217\221\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\345\235\221/index.html" "b/Blog/node\345\274\200\345\217\221\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\345\235\221/index.html" new file mode 100644 index 0000000..2c84313 --- /dev/null +++ "b/Blog/node\345\274\200\345\217\221\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\345\235\221/index.html" @@ -0,0 +1,92 @@ +node开发遇到的一个小坑 | Welcome to Alex's Midway

node开发遇到的一个小坑

September 03, 2019


写在前面

+

大前端之路又迈出了坚实一步。

+

leader架不住我们前端切图仔的各种游说,终于决定了上node。马上就可以写node接入层了,后端哥们可以专心开发微服务,切图仔们也可以想要什么数据字段就用什么了,毕竟求人不如求己。

+

leader给我分配了搭建框架的任务,以公司内部koa2+vue框架为基础,自己改改应该就可以了。毕竟只是个管理后台,做成MPA方便编译、迁移和维护。SPA页面数量过多,热更新直接爆内存堆,之前体会过一次,不想再碰。

+

踩坑记录

+

搭框架自然要区分各种运行环境,开发、测试、生产自然是标配。界面上会根据环境不同给一些信息提示,在node里很自然就要写这样的语句env = process.env.NODE_ENV来判断当前所处的环境。

+

用的现成框架,却在EJS条件渲染视图文件的时候总是失败,始终没有触发到我想要的逻辑分支。看了几分钟,开始看页面env变量的值。

+

结果居然发现框架里是这么写的

+
const env = JSON.stringify(process.env.NODE_ENV || 'development')
+

而我的模板条件渲染语句是这么写的

+
<% if(env=='development') {%>
+    //do something 
+<% } %>
+

打印一看,当然不能进入分支逻辑

+
var a = JSON.stringify('development'); // '"development"'
+var b = 'development'; // 'development'
+a == b; // false
+a === b; // false
+

框架大佬多此一举用了JSON.stringify,把字符串'development'变成了有额外双引号的字符串'"development"',二者的比较自然变成了develpmentdevelopment+双引号的比较,永远不会相等,不管使用严格相等===还是转换类型相等==

+

踩坑记录完毕

\ No newline at end of file diff --git "a/Blog/normalizr\346\211\201\345\271\263\345\214\226\351\200\222\345\275\222\347\273\223\346\236\204\347\232\204json/index.html" "b/Blog/normalizr\346\211\201\345\271\263\345\214\226\351\200\222\345\275\222\347\273\223\346\236\204\347\232\204json/index.html" new file mode 100644 index 0000000..5c6449a --- /dev/null +++ "b/Blog/normalizr\346\211\201\345\271\263\345\214\226\351\200\222\345\275\222\347\273\223\346\236\204\347\232\204json/index.html" @@ -0,0 +1,73 @@ +normalizr扁平化递归结构的json | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/null\345\222\214undefined\347\232\204\346\257\224\350\276\203/index.html" "b/Blog/null\345\222\214undefined\347\232\204\346\257\224\350\276\203/index.html" new file mode 100644 index 0000000..d678159 --- /dev/null +++ "b/Blog/null\345\222\214undefined\347\232\204\346\257\224\350\276\203/index.html" @@ -0,0 +1,121 @@ +null和undefined的比较 | Welcome to Alex's Midway

null和undefined的比较

May 03, 2018


相同点

+
+
    +
  1. 均为基本类型
  2. +
  3. 都属于“假值”,用Boolean()转换类型后都为false
  4. +
  5. 使用==进行比较时,二者相等
  6. +
+

看 2 个可能会遇到的情况:

+
//例1
+var a = null;
+var b;
+var c = 0;
+if (!a) {
+  console.log('abc'); //a 为 null
+}
+if (!b) {
+  console.log('abc'); //b 为 undefined
+}
+if (!c) {
+  console.log('abc'); //c 为 0
+}
+
+//例2
+if (b == a) {
+  console.log('a,b');
+}
+if (b === undefined) {
+  console.log('b');
+}
+

例 1 中,这几个值在 if 语句中都会被隐式转换为boolean类型,而且恰好都为假值,取反之后均为真,因此 三个 if 内部的 console 语句都可以执行。

+

如果要区分具体值,需要指明比较的对象。比如例 2 中第一个 if 语句,当 b 为undefinednull时,才判定为真;在第二个 if 语句中,只有当 b 为undefined时才判定为真,null也无法通过。

+

不同点

+
+
    +
  1. 类型不同,因此二者用===比较不相等,typeof的值也不同
  2. +
  3. 转换为 string,number 后,二者不相同
  4. +
+
//例3
+
+undefined === null; //false
+
+typeof undefined; //'undefined'
+typeof null; //'object'
+
+String(undefined); //'undefined'
+String(null); //'null'
+
+Number(undefined); //NaN
+Number(null); //0
\ No newline at end of file diff --git "a/Blog/parameter\344\270\216argument/index.html" "b/Blog/parameter\344\270\216argument/index.html" new file mode 100644 index 0000000..a5aac6b --- /dev/null +++ "b/Blog/parameter\344\270\216argument/index.html" @@ -0,0 +1,79 @@ +parameter与argument | Welcome to Alex's Midway

parameter与argument

November 21, 2018


以前一直迷迷糊糊的,parameter 和 argument,形参和实参,这 2 个概念中英文完全对不上,现在终于弄清楚了

+
    +
  • parameter: 函数声明中用来占位的参数名,中译“形参”
    +其实它就是 placeholder,翻译成“参数占位符”更容易理解
  • +
  • argument: 函数调用时候真实传入的参数,中译“实参”
  • +
+

---------------------EOF---------------------

\ No newline at end of file diff --git "a/Blog/php\350\260\203\345\217\202\344\274\230\345\214\226\345\260\217\350\256\260/index.html" "b/Blog/php\350\260\203\345\217\202\344\274\230\345\214\226\345\260\217\350\256\260/index.html" new file mode 100644 index 0000000..b14756d --- /dev/null +++ "b/Blog/php\350\260\203\345\217\202\344\274\230\345\214\226\345\260\217\350\256\260/index.html" @@ -0,0 +1,73 @@ +php调参优化小记 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/react-native-init\344\273\245\346\214\207\345\256\232\347\211\210\346\234\254\345\210\233\345\273\272project/index.html" "b/Blog/react-native-init\344\273\245\346\214\207\345\256\232\347\211\210\346\234\254\345\210\233\345\273\272project/index.html" new file mode 100644 index 0000000..2a163c6 --- /dev/null +++ "b/Blog/react-native-init\344\273\245\346\214\207\345\256\232\347\211\210\346\234\254\345\210\233\345\273\272project/index.html" @@ -0,0 +1,75 @@ +react-native-init以指定版本创建project | Welcome to Alex's Midway
\ No newline at end of file diff --git "a/Blog/scroll\344\272\213\344\273\266\350\270\251\345\235\221\350\256\260\345\275\225/index.html" "b/Blog/scroll\344\272\213\344\273\266\350\270\251\345\235\221\350\256\260\345\275\225/index.html" new file mode 100644 index 0000000..3e4e66a --- /dev/null +++ "b/Blog/scroll\344\272\213\344\273\266\350\270\251\345\235\221\350\256\260\345\275\225/index.html" @@ -0,0 +1,193 @@ +scroll事件踩坑记录 | Welcome to Alex's Midway

scroll事件踩坑记录

May 25, 2020


背景

+

使用Vue重构一个jQuery的H5/PC页面,一个列表组件实现滚动加载更多的时候踩了个坑。

+

现象

+
    +
  • 没有触发滚动 +开始是把滚动事件绑定在列表组件的父级元素,然后发现无论如何都无法触发滚动事件
  • +
  • 实现父元素滚动的布局导致了刘海屏下的一个兼容性bug +让html和body的高度都为屏高,父元素继承body高度也撑满body,监听父元素的滚动事件。
  • +
+

这个布局方式导致safe-area区域不能跟随滚动消失,始终占据了屏幕的底部位置

+

原因

+

先说第一个现象的原因

+

scroll事件冒泡原理

+
    +
  • +

    一般页面元素的scroll事件和普通事件不同,没有事件冒泡过程

    +

    + + + event-bubbling + +

    +

    也就是在上图的4就结束了,只经过事件捕获 -> 事件触发,没有事件冒泡的过程,之前监听父元素的事件委托做法是行不通的。

    +
  • +
  • +

    来自document元素的scroll事件可以冒泡

    +

    由于其自身已经是顶层元素了,所以这个场景下事件冒泡与否已经失去了意义。

    +
  • +
  • 具体可以参考这篇文章,写的很清楚
  • +
+

如何处理scroll事件

+

确认监听scroll事件目标元素

+

首先要明确开发功能的目标是在那个元素监听scroll事件。

+

比如上面提到safe-area的bug,要让safe-area跟随scroll事件收起和展开,需要监听document元素的滚动事件。

+

但是其他情况,也许不需要在document元素上监听。比如网页内有个固定高度的table元素,要监听他的内部滚动事件,可以只监听table的scroll事件。

+

具体监听哪个元素的scroll事件,要根据功能目标来确定。这是思考的出发点。

+

如何判断绑定正确或错误

+

在明确监听元素之后,再来观察是否监听到了正确的元素。可以通过以下方法来判断(此处以chrome为例子):

+
    +
  • devTool - Performance,点击Record开始录制
  • +
  • 滚动页面
  • +
  • 结束录制
  • +
  • 点击Event Log,搜索框内输入scroll,在最右侧就能看到scroll事件绑定的元素
  • +
  • 确认绑定元素是否为目标元素即可
  • +
+

如下图所示:

+

+ + + performance-panel + +

+

绑定document的处理

+

需要在Vue的生命周期钩子函数中绑定和解绑scroll事件,考虑到H5页面,因此追加了passive属性

+
...
+mounted(){
+    window.addEventListener('scroll', this.handleScroll, {passive: true});
+},
+destroyed(){
+    window.addEventListener('scroll', this.handleScroll, {passive: true});
+}
+

绑定页面元素的处理

+

可以在目标元素上绑定scroll事件,同时使用passive属性提高移动端滚动体验

+
<div @scroll.passive="handleScroll">
+

元素对应的CSS中要增加overflow-y: scroll或者overflow-y: auto的设置

+

其他兼容性处理

+

-webkit-overflow-scrolling: touch

+

对iOS来说,为了避免滚动卡顿,还需要在滚动的目标元素上设置-webkit-overflow-scrolling: touch,开启硬件加速,提升用户体验

+

Done

\ No newline at end of file diff --git "a/Blog/shell\350\204\232\346\234\254\345\220\210\345\271\266csv\346\226\207\344\273\266/index.html" "b/Blog/shell\350\204\232\346\234\254\345\220\210\345\271\266csv\346\226\207\344\273\266/index.html" new file mode 100644 index 0000000..864afd6 --- /dev/null +++ "b/Blog/shell\350\204\232\346\234\254\345\220\210\345\271\266csv\346\226\207\344\273\266/index.html" @@ -0,0 +1,73 @@ +shell脚本合并csv文件 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/typeof\344\270\216instanceof/index.html" "b/Blog/typeof\344\270\216instanceof/index.html" new file mode 100644 index 0000000..14edcb7 --- /dev/null +++ "b/Blog/typeof\344\270\216instanceof/index.html" @@ -0,0 +1,237 @@ +typeof与instanceof | Welcome to Alex's Midway

typeof与instanceof

October 22, 2018


+

typeof

+

typeof可以用来测试变量的类型,语法是typeof myVariable,返回值为变量类型的字符串。一般来说,基本类型会返回描述基本类型的字符串,而对象则返回'object'字符串,但是有2个例外。
+下表简单测试了一下几个浏览器的控制台输出。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数类型ChromeFirefoxEdgeIE11
typeof atypeof atypeof atypeof a
var a=1'number''number''number''number'
var a='1''string''string''string''string'
var a=null'object''object''object''object'
var a=undefined'undefined''undefined''undefined''undefined'
var a=true'boolean''boolean''boolean''boolean'
var a=Symbol('1')'symbol''symbol''symbol'不支持Symbol类型
var a={}'object''object''object''object'
var a=new Object()'object''object''object''object'
var a=[]'object''object''object''object'
var a=new Array()'object''object''object''object'
var a=function(){}'function''function''function''function'
var a=()=>{}'function''function''function'不支持箭头函数
+
+

例外
+1.基本类型null的typeof返回值为'object',这是js里著名的一个bug
+2.函数也是对象的一种,但是所有浏览器都单独返回'function'的具体类型,而不仅仅是'object'

+
+

因为例外1和2的存在,判断变量是否为对象时,至少要先检查变量是否为null以及变量是否为函数,否则会出错,比如下面这段代码就有bug:

+
let a = null;
+let b = ()=>{};
+function isObject(input){
+  if(typeof input == 'object'){
+    console.log('I am an object!');
+  }else{
+    console.log('I am not an object~');
+  }
+}
+isObject(a);//'I am an object!' 
+isObject(b);//'I am not an object~'
+

有2种方法可以修复这个bug,一种是增加判断,排除null,同时增加function的情况;还有一种是使用Object()方法进行类型转换。

+
//方法1
+function isObject(input){
+  if(input !==null && 
+  (typeof input === 'function' || typeof input == 'object')){
+    console.log('I am an object!');
+  }else{
+    console.log('I am not an object~');
+  }
+}
+//方法2
+//调用Object()方法,基本类型会转换为对应的包装类返回,null和undefined会变为空对象{},对象直接返回
+function isObject(input){
+  if(input === Object(input)){
+    console.log('I am an object!');
+  }else{
+    console.log('I am not an object~');
+  }
+}
+

instanceof

+

instanceof用来判断对象的类型

+
    +
  1. 有原型为null的情况 +Object(null) instanceof Object
  2. +
  3. +

    有跨框架情况

    + +
  4. +
  5. +

    跨框架解决方案

    +
      +
    • Object.prototype.toString.call(obj)
    • +
    +
  6. +
\ No newline at end of file diff --git "a/Blog/web\345\233\276\347\211\207\344\274\230\345\214\226\345\210\235\346\255\245/index.html" "b/Blog/web\345\233\276\347\211\207\344\274\230\345\214\226\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..e6712e1 --- /dev/null +++ "b/Blog/web\345\233\276\347\211\207\344\274\230\345\214\226\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +web图片优化初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/web\345\256\211\345\205\250\345\210\235\346\255\245/index.html" "b/Blog/web\345\256\211\345\205\250\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..48d8ed6 --- /dev/null +++ "b/Blog/web\345\256\211\345\205\250\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +web安全初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/web\346\200\247\350\203\275\344\274\230\345\214\226\346\214\207\346\240\207\350\247\243\346\236\220/index.html" "b/Blog/web\346\200\247\350\203\275\344\274\230\345\214\226\346\214\207\346\240\207\350\247\243\346\236\220/index.html" new file mode 100644 index 0000000..5a0d8d3 --- /dev/null +++ "b/Blog/web\346\200\247\350\203\275\344\274\230\345\214\226\346\214\207\346\240\207\350\247\243\346\236\220/index.html" @@ -0,0 +1,163 @@ +web性能优化指标解析 | Welcome to Alex's Midway

web性能优化指标解析

April 12, 2020


写在前面

+

1.sequence

+

request - server responds - domContentLoaded - load

+
    +
  1. Choose the metrics
  2. +
+

web.dev/user-centric-performance-metrics

+

2.1 Is there content?

+
    +
  • +

    Time to First Byte

    +

    a) Time from when the browser requests a page to the first bye of the page being received

    +

    b) Value = time to establish connection + 2*time to transmission + time for server respond

    +
  • +
  • +

    First Paint

    +

    a) time when the first pixel is painted on the screen

    +

    b) value greater than TTFB, somewhere after domContentLoaded

    +
  • +
  • +

    First Contentful Paint

    +

    a) time when the first piece of content from the DOM is rendered

    +

    b)

    +

    2.2 is the content meaningful?

    +
  • +
  • +

    Largest Contentful Paint

    +

    a) successor to FMP, measures the time when the largest piece fo content whithin the viewport is rendered

    +

    b) better than FMP

    +
  • +
  • +

    Visually Complete

    +

    a) time taken for the content within the viewport to be fully rendered

    +

    b) longer than LCP

    +
  • +
  • +

    Speed Index

    +

    a) score of how quickly visual content is rendered within the viewport

    +

    b)

    +

    2.3 is the content interactable?

    +
  • +
  • +

    First Input Delay

    +

    a) delay between the time a user can attempt to interact with a part fo the site, and the time that the interface is able to respond to that interaction

    +
  • +
  • +

    Max Potential First Input Delay

    +

    a) maximum possible First Input Delay based on the duration of the longest task

    +
  • +
  • +

    Total Blocking Time

    +

    a) total duration of JavaScript tasks between the First Contentful Paint and Time to Interactive

    +
  • +
  • +

    Time to Interactive

    +

    a) time when the. main thread has had up to 5sec with no network activitiy or JavaScript tasks

    +

    2.4 Are interactions smooth?

    +
  • +
  • +

    Cumulative Layout Shift

    +

    a) shifts in layout while a page is loading

    +
  • +
  • +

    Frame Rate

    +

    a) rate at which the browser can produce new frames in response to interactions and/or animations

    +

    2.5 Example

    +
  • +
+

e.g. News Website

+
    +
  • is there content? First Contentful Paint
  • +
  • is the content meaningful? Largest Contentful Paint, Speed Index
  • +
  • is the content intractable? Time to Interactive
  • +
  • Are the interactions smooth? Cumulative Layout Shift
  • +
  • Define a budget
  • +
  • a performance budget defines specific values to your metrics that your site should never exceed.
  • +
+

e.g. News Website

+
    +
  • FCP < 1.5s
  • +
  • LCP < 2s
  • +
  • SI < 0.43
  • +
  • TTI < 4s
  • +
  • CLS<0.1
  • +
+

OR use competitors as a guide/baseline

+
    +
  1. Start measuring
  2. +
  3. Lighthouse
  4. +
  5. Calibre
  6. +
\ No newline at end of file diff --git "a/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-jmeter/index.html" "b/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-jmeter/index.html" new file mode 100644 index 0000000..71a6015 --- /dev/null +++ "b/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-jmeter/index.html" @@ -0,0 +1,73 @@ +web性能测试-jmeter | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-locust/index.html" "b/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-locust/index.html" new file mode 100644 index 0000000..a4d0f55 --- /dev/null +++ "b/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-locust/index.html" @@ -0,0 +1,73 @@ +web性能测试-locust | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225\345\210\235\346\255\245/index.html" "b/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..840aa26 --- /dev/null +++ "b/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +web性能测试初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\344\270\200\344\270\252\345\205\263\344\272\216babel\347\232\204\346\204\232\350\240\242\345\260\217\351\224\231\350\257\257/index.html" "b/Blog/\344\270\200\344\270\252\345\205\263\344\272\216babel\347\232\204\346\204\232\350\240\242\345\260\217\351\224\231\350\257\257/index.html" new file mode 100644 index 0000000..7e1613e --- /dev/null +++ "b/Blog/\344\270\200\344\270\252\345\205\263\344\272\216babel\347\232\204\346\204\232\350\240\242\345\260\217\351\224\231\350\257\257/index.html" @@ -0,0 +1,89 @@ +一个关于babel的愚蠢错误 | Welcome to Alex's Midway

一个关于babel的愚蠢错误

September 19, 2019


+

TL;DR

+

babel不会打包node_modules里的文件,所以引入组件时,必须用组件打包后的代码

+
+

问题描述

+

npm install安装了公司内部组件之后,使用时import了源文件,然后项目打包报错:

+
+

... UglifyJS unexpected token: punc <<(>> ....

+
+

开始一直觉得奇怪,google一下是UglifyJS不认识ES6的代码,ES6肯定是babel处理的,自然问题出在babel上。 然后捣鼓了快半个小时,又是配.babelrc,又是安装各种babel-plugin。徒劳无功。

+

之后鼓起勇气,问了大佬,大佬一句话点醒梦中人: 为了加速打包,babel不会转译node_modules里的文件

+

然后就没有然后了....

+

babel不转译,那么源文件里的ES6语法就不会被转为ES5,而UglifyJS不认识ES6语法,所以打包报错...

+

总结

+

API dummy没有未来,自己还是太菜了,没有真正理解打包这个过程的真实含义,也没有理解很多webpack配置的背景。只是记住了怎么使用而已。一旦出现死记硬背场景之外的问题,就抓瞎了。

+

当然,公司组件没有按照commonJS弄个index.js入口文件以方便引入还是很坑的,吐槽结束。

+

技术进阶之路漫漫,我还要继续努力。

\ No newline at end of file diff --git "a/Blog/\344\270\200\346\254\241App\345\206\205\351\241\265\347\232\204bug\346\272\257\346\272\220/index.html" "b/Blog/\344\270\200\346\254\241App\345\206\205\351\241\265\347\232\204bug\346\272\257\346\272\220/index.html" new file mode 100644 index 0000000..2e416f2 --- /dev/null +++ "b/Blog/\344\270\200\346\254\241App\345\206\205\351\241\265\347\232\204bug\346\272\257\346\272\220/index.html" @@ -0,0 +1,148 @@ +一次App内页的bug溯源 | Welcome to Alex's Midway

一次App内页的bug溯源

September 02, 2019


写在前面

+

上一篇博客中提到的业务,这次引发了另一个bug

+

背景信息

+

上一次的H5页面上线有段时间了,客户端同学终于赶上了进度,把页面用到了App里更多的地方。

+

这次bug的主角是2个页面,一个列表页(以下简称L),一个详情页(以下简称D)。L由内嵌webview为容器,作为App一级页面tabView中的一个tab;点击L打开覆盖全屏的webview,展示D。很常见的一种App导航配置。

+

需要说明一点,这次的2个页面都有CSRF校验。正是这个CSRF校验,诱发了后续的一系列bug。

+

BUG排查过程

+
    +
  1. +

    无意发现bug

    +

    iOS开发哥们反馈L和D在iPad上有bug,聊着聊着突然发现,页面从L到D,随便点击D内一个按钮再返回,L里所有功能按钮点击统统报错。

    +

    按钮的请求都有CSRF校验,当时很自然想到了应该是CSRF校验失败,否则很难解释这么大面积的功能失灵。

    +

    结论:CSRF校验失败?

    +
  2. +
  3. +

    CSRF校验失败

    +

    抓包看了请求的返回数据,也麻烦搭档查了日志,确认是校验失败引起的bug。

    +

    结论:确认CSRF校验失败

    +
  4. +
  5. +

    只有iOS出现bug

    +

    于是交给了搭档排查后台。我也不想闲着,试了试Android的页面,并没有像iOS一样出现bug。

    +

    原因一目了然,Android 返回的时候,会重新请求页面,而iOS使用缓存,不会请求。

    +

    到这步再一次确认了就是CSRF的问题,并且是因为页面跳转引起了CSRF token变化,而iOS仍然使用缓存的旧页面(token保存在页面meta字端内,即请求还是用旧token),所以无法通过校验以致报错。

    +

    结论:页面切换导致CSRF token改变,iOS使用缓存所以无法通过校验

    +
  6. +
  7. +

    跨webview跳转bug

    +

    之前L页在另一个App三级入口,点击后在同一个webview内部跳转D页,再次返回L功能正常。而这次的bug出现在2个webview之间。初步看是因为跨webview有些信息没有传递过去,所以导致了CSRF token变化。

    +

    结论:跨webview切换缺失数据,导致token变化

    +
  8. +
  9. +

    试图手动共享token失败

    +

    搭档的排查没有发现原因,但给了一条信息:token会存一个对应的key在cookie里,如果后台渲染页面时发现cookie中有这个key,就不会刷新token。

    +

    当时也没细想,觉得既然如此,那么跳转页面的时候把key写入local storage,D页面加载时再取出并写入cookie就可以了。居然丝毫没发现这个做法逻辑上的漏洞。

    +

    很自然的,失败了。

    +

    抓包数据发现不论怎么写,D页面加载时cookie里都没有这个key。再一想,在回写cookie的时候页面都已经加载,怎么会有效果...更不要说只从L页写local storage,这个key在以后被D页取出的时候很可能存在过期的情况,毕竟D页自身可以刷新,还可能从其他页面跳转过来,并非只有L->D一种路径。

    +

    要想生效,那么必须在D页请求之前,cookie中就有这个key。这个目标只能靠客户端实现了。

    +

    死路一条,放弃。

    +

    结论:web端手段受限,cookie只能被共享给D页,否则页面总会发起一次新请求刷新token

    +
  10. +
  11. +

    共享cookie带来的矛盾

    +

    抓包继续看,发现D页加载时cookie里没有key,随后请求接口时cookie里key出现了,说明key是页面加载时新请求到的。这个key和L页的不一样。但是从D返回L时,二者的key相同了。说明某个时候,D修改了L的cookie,或者更进一步假设,D修改了cookie,因为cookie二者共享,所以L的cookie也变化了。

    +

    但马上就可以发现一个新的矛盾:

    +
      +
    • 矛盾1:既然共享cookie,为什么D加载时没有key?
    • +
    • 矛盾2:如果不共享cookie,为什么其他字段都一样,而且D的key变化后能同步给L?
    • +
    +

    假设不共享,那么谁改动了cookie?是web后台还是客户端?什么时候改动的?

    +

    考虑L页的iOS缓存,正常情况下web后台唯一写cookie的时机是在D页加载时,因为此时D页cookie中没有key这个字段。再次返回L页因为缓存缘故,并没有任何网络请求,没有改变cookie的机会。那么只能是客户端有动作了。

    +

    但这个假设又有挥之不去的另一个矛盾,全过程中除了key之外的字段都是一样的,没理由通过代码全部手工写入。那么这又如何解释呢?感觉好迷。

    +

    结论:cookie共享?不共享?

    +
  12. +
  13. +

    chrome再现bug场景,发现webview有问题

    +

    客户端调试手段受限,还是本能希望在浏览器上做调试。

    +

    组内大佬提醒,chrome隐身模式不共享cookie的。那么普通模式打开一个L页面,隐身模式打开一个D页面,用来模拟cookie不共享的状态。

    +

    很奇怪的事情出现了,隐身模式和普通模式页面都能正常的工作,彼此并不影响。于是根据这个结果,可以排除cookie不共享的假设,只剩下cookie共享一种可能了。于是我把D的cookie内容全部复制到了L页,再次点击L页按钮,bug复现了。然后为了找到真正的原因,缩小覆盖的范围。

    +

    最后发现,只要key被覆盖,L页的请求就会失效,并且提示信息和之前App上的一模一样。

    +

    带着这个信息找搭档,他看了后台源代码后告诉我:CSRF校验过程中,后台有一个token池,cookie中的key能检索出对应的token。当页面请求携带的token跟检索出的token一致,就能通过校验。

    +

    根本原因找到了:cookie肯定是共享的。但是由于某种原因,客户端在新开webview时没有把key传递过去,于是新webview请求了新的CSRF token-key键值对;又因为cookie共享,新key写入cookie,覆盖了旧key,于是使用缓存的iOS页面就拿着新key+旧token发起请求,自然无法通过验证。

    +

    结论:只能是客户端webview的问题

    +
  14. +
  15. +

    确认bug根源

    +

    把以上信息反馈给客户端开发哥们,他们开始了排查。

    +

    最后发现是一个历史遗留逻辑没有清理,新开webview时会先清空一次cookie,cookie同步机制不定时从NSCookieStorage取cookie,但不会同步key这个字段(当然即使同步了,因为存在不可控延迟,按照现有的了解,页面还是会重新请求token。这样经过同步,L和D总有一个页面会拿到新key+旧token,也就还是会出bug。只有保持cookie一直共享,才不会让后台返回新的key-token键值对)。于是就有了上面的bug。

    +

    移除这个逻辑,保持cookie共享,问题就消除了。

    +

    排查总耗时:断断续续花了2天半

    +
  16. +
+

总结

+

复盘下这个bug。

+

首先,有内部沟通的问题。产品客户端规划这个页面的时候,没有和web端讨论,否则这个问题可能规划的时候就暴露出来了。其次,这种有安全验证写请求的web页面,似乎不太适合作为App内的一级页面,还是纯读请求的页面感觉更合适,至少风险会小些。最后,自己对web安全验证这一块的机制还是了解不够,早一点知道到key-token这种验证机制,排查出bug的时间应该会少很多。

+

进阶路漫漫,继续学习

\ No newline at end of file diff --git "a/Blog/\344\270\200\346\254\241\346\220\236\347\254\221\350\200\214\346\267\261\345\210\273\347\232\204bug\350\260\203\350\257\225/index.html" "b/Blog/\344\270\200\346\254\241\346\220\236\347\254\221\350\200\214\346\267\261\345\210\273\347\232\204bug\350\260\203\350\257\225/index.html" new file mode 100644 index 0000000..4b9801d --- /dev/null +++ "b/Blog/\344\270\200\346\254\241\346\220\236\347\254\221\350\200\214\346\267\261\345\210\273\347\232\204bug\350\260\203\350\257\225/index.html" @@ -0,0 +1,119 @@ +一次搞笑而深刻的bug调试 | Welcome to Alex's Midway

一次搞笑而深刻的bug调试

May 04, 2018


问题出现

+
+

APP 某个页面加载时访问了 2 个 API,两者的返回数据都分别有type字段,用于区分对应的数据列表中项目的类别,前端界面再根据类别渲染不同的界面

+
+

这个时候问题出现了,第一个 API 一切正常,第二个 API 返回列表本应全是type=1的数据类型,但是每次返回的第一条数据都是type=2

+

调试

+
    +
  1. 很自然打开chrome devTool,打印并查看后台返回数据,嗯,返回的数据type=2,看来是后台问题可能性较大
  2. +
  3. 再次确认,用postman请求一次接口看看返回数据,咦,怎么返回数据又对了,type=1,反复试了几次,还是对的
  4. +
  5. 换了一个 API 测试工具,结果和 2 一样,看样子应该是前端的问题了,而且应该是网络层的问题,而网络层是基于 axios 封装的,也就是说 axios 有问题?
  6. +
  7. 还是觉得需要首先排除后台原因,于是让后台同事打印出接口返回数据,对比之后发现和 API 工具结果一致,基本排除后端责任
  8. +
  9. 深入到封装的网络层查看axios返回的数据,链式函数里淘宝,分别打印了response=>response.data,二者数据一致错误,数据 bug 复现
  10. +
  11. 怀疑 axios 老版本不可靠,于是升级到最新版,继续测试,问题依旧
  12. +
  13. 开始 axios 请求的头部是json,移植之前封装的另一版本网络层代码,头部使用arraybuffer, 解码后response的数据与后台一致了, +但是response.data数据仍错误,因为二者间只多了一次JSON.parse,定位问题在JSON.parse
  14. +
  15. 因为 JSON.parse 本身不会有问题,再次开始怀疑 bug 源于后端,返回的 json 字符串格式不标准导致解析错误,可用解析工具可以顺利解析出 json,这里没有问题
  16. +
  17. 病急乱投医,怀疑 2 个接口同时请求有问题,于是注释第一个正常 API 的所有网络访问代码,返回结果一致,看来接口没有相关性,问题独立出现在第二个接口上
  18. +
  19. 复制 API 调试工具的返回 json,同时网络层截断发往结果异常 API 接口的所有网络访问,把复制的 json 作为固定数据返回给 +response,错误依旧,问题确定位在前端了
  20. +
  21. 把 10 中的 json 里的 type 属性改名为 mode,axios 解析的数据正常了
  22. +
  23. 继续看 axios 封装内容,.then(response=>{...})同时打印response, JSON.parse(response.data), 数据又正确了,并且打印出数据一致。 +基本排除 axios 错误的可能性,那么就只剩下前端页面代码 bug 这一种可能性了,开始从网络层逐渐向应用层排查
  24. +
  25. 最后可耻的在 reducer 里发现了自己写死的代码response[0].type = 2, 根源找到
  26. +
+

总耗时: 8 小时

+

原因

+

简单说就是 chrome 的 console.log 打印对象时,如果对象后续值被修改了,打印的值也会随之改变,除非打印时就立刻展开对象的所有属性

+

stackoverflow找到了问题,这个问题(或者说 bug)起源于 webkit 的一个 bug stackoverflow问题地址

+
+

Excerpts from the original bug report ([https://bugs.webkit.org/show_bug.cgi?id=35801]):

+

Description From mitch kramer 2010-03-05 11:37:45 PST

+
    +
  1. create an object literal with one or more properties
  2. +
  3. console.log that object but leave it closed (don't expand it in the console)
  4. +
  5. change one of the properties to a new value
  6. +
+

now open that console.log and you'll see it has the new value for some reason, even though it's value was different at the time it was generated.

+

I should point out that if you open it, it will retain the correct value if that wasn't clear.

+
+

规避方法

+
    +
  • 创建对象的一个深拷贝,使它不受后续的影响, 比如把对象转成字符串再读取回来
  • +
+
JSON.parse(JSON.stringify(object));
+
+

应验了一句老话,眼见也未必为实,今天体会很深

+
\ No newline at end of file diff --git "a/Blog/\344\275\277\347\224\250Charles\346\212\223\345\214\205\347\247\273\345\212\250\347\253\257\347\275\221\347\273\234\350\257\267\346\261\202/index.html" "b/Blog/\344\275\277\347\224\250Charles\346\212\223\345\214\205\347\247\273\345\212\250\347\253\257\347\275\221\347\273\234\350\257\267\346\261\202/index.html" new file mode 100644 index 0000000..2174625 --- /dev/null +++ "b/Blog/\344\275\277\347\224\250Charles\346\212\223\345\214\205\347\247\273\345\212\250\347\253\257\347\275\221\347\273\234\350\257\267\346\261\202/index.html" @@ -0,0 +1,846 @@ +使用Charles抓包移动端网络请求 | Welcome to Alex's Midway

使用Charles抓包移动端网络请求

September 07, 2019


写在前面

+

这是4个月前的一篇简要工作记录,重新编辑整理了一下,算是自己技能成长的一个见证。

+

可以抓包移动端网络请求的工具很多,windows下有fiddler和wireshark,Mac下有Charlse和Surge for Mac(Surge iOS版甚至可以在iOS设备上直接抓包,功能非常强大)。

+

因为目前使用Mac,所以本文主要介绍如何使用Charles在Mac上进行抓包。

+
+

注意: 以下全程,请保持电脑和手机在同一个局域网内

+
+

抓包普通请求

+
+

这部分iOS和Android方法类似,以iOS为例说明

+
+
    +
  1. +

    打开Charles代理设置窗口,点击 Proxy -> Proxy Settings

    +

    + + + charles 1 + +

    +
  2. +
  3. +

    设置代理端口号,勾选 Enable transparent HTTP proxying,并设置一个端口号,比如8888

    +

    + + + charles 2 + +

    +
  4. +
  5. +

    手机端配置

    +
      +
    • 打开 设置-> 无线局域网,点击已连接wif的蓝色图标,图中红圈处
    • +
    +

    + + + charles 3 + +

    +
      +
    • HTTP代理选手动配置
    • +
    +

    + + + charles 4 + +

    +
      +
    • 服务器配置为电脑的IP,端口设为之前charles配置的端口
    • +
    +

    + + + charles 5 + +

    +
  6. +
  7. +

    允许手机连接charles

    +

    这个时候随便访问一个网页,charles就会提示,选择“允许”

    +

    + + + charles 6 + +

    +

    如果不小心关掉了也没关系,打开Proxy -> Access Control Settings,添加手机的IP就可以了

    +

    + + + charles 7 + +

    +

    + + + charles 8 + +

    +
  8. +
+

之后手机上的任何http请求,都可以被charles抓包查看了,Done.

+

抓包https请求

+

上面的配置只能抓包http请求,但是现在主要网站大都是https的,请求数据会显示为乱码,不可读。需要额外配置让charles可以抓包https的请求。根据官网的说明,抓包https请求需要在手机上安装charles证书。

+

为什么需要安装证书呢?官方的说明如下:

+
+

SSL Proxying

+

Charles does this by becoming a man-in-the-middle. Instead of your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore you will see a security warning, indicating that the root authority is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings – see below for how to do this.

+

Charles still communicates via SSL to the web server. The communication is SSL (encrypted) from web browser to Charles and also SSL (encrypted) from Charles to the web server.

+
+

这个抓包本质上是一种中间人攻击 (Man in the Middle Attack)。

+

只不过单纯抓包并没有篡改数据,只是charles作为代理和服务端通信,然后转发数据和charles动态生成的证书给手机。如果不安装证书,手机浏览器会提示证书不可信,以存在安全风险为由,拒绝接受charles发回的数据。

+

理论上,charles当然也可以篡改数据后再发给手机,似乎某些更高级的功能就是基于此实现的。这不是本文的主题了,以后有机会再写。

+

废话结束,下面继续说明如何安装证书。

+

安装证书

+
Charles启用SSL代理功能
+ +
手机端配置
+
+

证书安装在iOS和Android两端不同,手机端的配置分为两部分写

+
+
iOS
+
    +
  • +

    手机Safari打开https://chls.pro/ssl这个网址下载证书

    +

    + + + charles 13 + +

    +
  • +
  • +

    根据提示下载证书,返回设置,在已下载描述文件中找到该证书

    +

    + + + charles 14 + +

    +
  • +
  • +

    安装证书

    +

    + + + charles 15 + +

    +
  • +
  • +

    关于本机开启信任证书

    +

    + + + charles 16 + +

    +
  • +
  • +

    happy抓包

    +

    + + + charles 17 + +

    +

    + + + charles 19 + +

    +
  • +
  • +

    如果不开启信任证书

    +

    + + + charles 18 + +

    +
  • +
+
Android
+
    +
  • 前三步和iOS相同,手机Chrome打开网址下载证书并安装
  • +
  • +

    安装成功之后各个安卓手机有所不同了,我用的坚果pro2

    +

    坚果pro2: 设置 - 解锁与安全 - 高级设置 - 受信任的凭据 - 用户tab

    +

    + + + charles 20 + +

    +

    + + + charles 21 + +

    +
  • +
  • +

    如果安装失败,可以下载证书文件到本地,选择从存储设备安装(可以参考这篇

    +
      +
    • 坚果pro2: 设置 - 解锁与安全 - 高级设置 - 从存储设备安装,见上图
    • +
    +
  • +
  • +

    happy抓包

    +

    + + + charles 22 + +

    +
  • +
  • +

    如果没有安装证书

    +

    + + + charles 23 + +

    +
  • +
+

记录完毕,收工

\ No newline at end of file diff --git "a/Blog/\344\275\277\347\224\250eslint+prettier+husky\350\247\204\350\214\203\351\241\271\347\233\256\344\273\243\347\240\201\351\243\216\346\240\274/index.html" "b/Blog/\344\275\277\347\224\250eslint+prettier+husky\350\247\204\350\214\203\351\241\271\347\233\256\344\273\243\347\240\201\351\243\216\346\240\274/index.html" new file mode 100644 index 0000000..2c39acf --- /dev/null +++ "b/Blog/\344\275\277\347\224\250eslint+prettier+husky\350\247\204\350\214\203\351\241\271\347\233\256\344\273\243\347\240\201\351\243\216\346\240\274/index.html" @@ -0,0 +1,118 @@ +使用eslint+prettier+husky规范项目代码风格 | Welcome to Alex's Midway

使用eslint+prettier+husky规范项目代码风格

November 05, 2019


写在前面

+

项目配置

+

ESLint

+

eslint

+

babel-eslint

+

eslint-config-airbnb-base

+

eslint-plugin-vue

+

eslint-config-futu

+

eslint-plugin-import, 不认识webpack别名 -> eslint-import-resolver-alias

+

配置.eslint.js.eslintignore文件

+

Prettier

+

处理Prettier和ESLint的冲突

+
+

以下内容为Prettier官方文档的翻译

+
+
Disable formatting rules
+

eslint-config-prettier is a config that disables rules that conflict with Prettier. Add it to your devDependencies, then extend from it within your .eslintrc configuration. Make sure to put it last in the extends array, so it gets the chance to override other configs.

+
# yarn
+yarn add --dev eslint-config-prettier
+# npm
+npm install --dev eslint-config-prettier
+

Then in .eslintrc.json:

+
{
+  "extends": ["prettier"]
+}
+
Use ESLint to run Prettier
+

eslint-plugin-prettier is a plugin that adds a rule that formats content using Prettier. Add it to your devDependencies, then enable the plugin and rule.

+
yarn add --dev eslint-plugin-prettier
+

Then in .eslintrc.json:

+
{
+  "plugins": ["prettier"],
+  "rules": {
+    "prettier/prettier": "error"
+  }
+}
+ +

eslint-plugin-prettier exposes a "recommended" configuration that configures both eslint-plugin-prettier and eslint-config-prettier in a single step. Add both eslint-plugin-prettier and eslint-config-prettier as developer dependencies, then extend the recommended config:

+
yarn add --dev eslint-config-prettier eslint-plugin-prettier
+

Then in .eslintrc.json:

+
{
+  "extends": ["plugin:prettier/recommended"]
+}
+

LintStaged和Husky

+

编辑器插件集成

+

VSCode

+

WebStorm

\ No newline at end of file diff --git "a/Blog/\344\275\277\347\224\250json-server\346\220\255\345\273\272API\346\250\241\346\213\237\346\234\215\345\212\241\345\231\250/index.html" "b/Blog/\344\275\277\347\224\250json-server\346\220\255\345\273\272API\346\250\241\346\213\237\346\234\215\345\212\241\345\231\250/index.html" new file mode 100644 index 0000000..08d2bb8 --- /dev/null +++ "b/Blog/\344\275\277\347\224\250json-server\346\220\255\345\273\272API\346\250\241\346\213\237\346\234\215\345\212\241\345\231\250/index.html" @@ -0,0 +1,79 @@ +使用json-server搭建API模拟服务器 | Welcome to Alex's Midway

使用json-server搭建API模拟服务器

May 29, 2018


--先挖坑,有时间再填--

+
    +
  1. 超简单服务器 20 秒 done(只用于数据测试)
  2. +
  3. 自定义 API route
  4. +
  5. 复杂 API 模拟服务器实现
  6. +
  7. 结合 Fake.js 实现随机数据 API 模拟服务器
  8. +
\ No newline at end of file diff --git "a/Blog/\345\205\245\345\235\221TypeScript/index.html" "b/Blog/\345\205\245\345\235\221TypeScript/index.html" new file mode 100644 index 0000000..509eb0c --- /dev/null +++ "b/Blog/\345\205\245\345\235\221TypeScript/index.html" @@ -0,0 +1,73 @@ +入坑TypeScript | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\207\240\344\270\252JS\351\253\230\351\230\266\345\207\275\346\225\260\347\232\204\347\256\200\345\215\225\345\272\225\345\261\202\345\256\236\347\216\260/index.html" "b/Blog/\345\207\240\344\270\252JS\351\253\230\351\230\266\345\207\275\346\225\260\347\232\204\347\256\200\345\215\225\345\272\225\345\261\202\345\256\236\347\216\260/index.html" new file mode 100644 index 0000000..53b8e26 --- /dev/null +++ "b/Blog/\345\207\240\344\270\252JS\351\253\230\351\230\266\345\207\275\346\225\260\347\232\204\347\256\200\345\215\225\345\272\225\345\261\202\345\256\236\347\216\260/index.html" @@ -0,0 +1,151 @@ +几个JS高阶函数的简单底层实现 | Welcome to Alex's Midway

几个JS高阶函数的简单底层实现

October 07, 2018


+

高阶函数

+

看了 FCC 的函数式编程章节才发现,原来 JS 里的几个高阶函数是典型的函数式编程思想的应用。不改变原值,总是返回新值以避免 side-effect。
+有点好奇这些函数的底层是如何实现的,干脆练练手,全部自己尝试写一遍。暂时考虑写简化版,所以会略去异常处理部分的代码,实现全部使用 ES5 的语法。

+

Array.prototype.forEach

+
Array.prototype.simpleForEach = function(callback, thisArg) {
+  var length = this.length;
+  for (var i = 0; i < length; i++) {
+    callback.call(thisArg, this[i], i, this);
+  }
+};
+

Array.prototype.map

+
Array.prototype.simpleMap = function(callback, thisArg) {
+  var newArr = [];
+  var length = this.length;
+  for (var i = 0; i < length; i++) {
+    newArr.push(callback.call(thisArg, this[i], i, this));
+  }
+  return newArr;
+};
+

Array.prototype.filter

+
Array.prototype.simpleFilter = function(callback, thisArg) {
+  var newArr = [];
+  var length = this.length;
+  for (var i = 0; i < length; i++) {
+    if (callback.call(thisArg, this[i], i, this)) {
+      newArr.push(this[i]);
+    }
+  }
+  return newArr;
+};
+

Array.prototype.every

+
Array.prototype.simpleEvery = function(callback, thisArg) {
+  var length = this.length;
+  for (var i = 0; i < length; i++) {
+    if (!callback.call(thisArg, this[i], i, this)) {
+      return false;
+    }
+  }
+  return true;
+};
+

Array.protytype.some

+
Array.prototype.simpleSome = function(callback, thisArg) {
+  var length = this.length;
+  for (var i = 0; i < length; i++) {
+    if (callback.call(thisArg, this[i], i, this)) {
+      return true;
+    }
+  }
+  return false;
+};
+

Array.protytype.reduce

+
Array.prototype.simpleReduce = function(callback, initialVal) {
+  var accumulator,
+    length = this.length;
+  if (initialVal === undefined) {
+    //无初值:将首个元素赋给accumulator,并从index=1的元素开始循环
+    accumulator = this[0];
+    for (var i = 1; i < length; i++) {
+      accumulator = callback(accumulator, this[i], i, this);
+    }
+  } else {
+    //有初值:将initialVal赋给accumulator,从index=0的元素开始循环
+    accumulator = initialVal;
+    for (var i = 0; i < length; i++) {
+      accumulator = callback(accumulator, this[i], i, this);
+    }
+  }
+
+  return accumulator;
+};
\ No newline at end of file diff --git "a/Blog/\345\210\244\346\226\255\346\234\211\345\272\217\346\225\260\347\273\204B\346\230\257\345\220\246\344\270\272\346\234\211\345\272\217\346\225\260\347\273\204A\347\232\204\345\255\220\351\233\206/index.html" "b/Blog/\345\210\244\346\226\255\346\234\211\345\272\217\346\225\260\347\273\204B\346\230\257\345\220\246\344\270\272\346\234\211\345\272\217\346\225\260\347\273\204A\347\232\204\345\255\220\351\233\206/index.html" new file mode 100644 index 0000000..137991d --- /dev/null +++ "b/Blog/\345\210\244\346\226\255\346\234\211\345\272\217\346\225\260\347\273\204B\346\230\257\345\220\246\344\270\272\346\234\211\345\272\217\346\225\260\347\273\204A\347\232\204\345\255\220\351\233\206/index.html" @@ -0,0 +1,133 @@ +判断有序数组B是否为有序数组A的子集 | Welcome to Alex's Midway

判断有序数组B是否为有序数组A的子集

March 12, 2019


富途面试遇到的手写算法题: +2 个有序数组 A 和 B,只含有数字,每个数组内的元素都有可能重复。请写一个函数,判断 B 是否为 A 的子集。如果是,返回 true;反之,返回 false。 +要求:不能用内置函数,不能转换为字符串等等做间接比较,算法效率越高越好。

+

题目分析

+

典型的数组类问题,有序这个条件已经降低很多难度了,题目难度至多相当于 LC Medium 的题目。

+

解题方法

+

有序+数组比较,很自然两个思路:

+
    +
  • Two Pointers
  • +
  • Binary Search
  • +
+

现场做的时候选的 1,有几个 corner case 没考虑到,面试官指出来之后放过我了。

+

时间复杂度 O(n)\ O(n), 空间复杂度 O(1)\ O(1),简单说下思路:

+
    +
  1. 排除 corner case,B 为空,B 比 A 元素多,B 的元素范围超过 A 的范围等等;
  2. +
  3. 2 个 pointer,分别从 A,B 的第一个元素开始
  4. +
  5. A 的 pointer 一直前进,找和 B 当前相等的元素,直到找到或者抵达 A 的尾部
  6. +
  7. 如果找到相同元素,2 个 pointer 同时前进一位
  8. +
  9. 如果循环中 A 提前到达尾部,那么返回 false,如果 B 先到达尾部,跳出循环返回 true
  10. +
+

现场写的代码如下,十分丑陋:

+
/**
+ * @param {sorted src array} a
+ * @param {sorted target array} b
+ */
+var isSubset = function isSubset(a, b) {
+  if (b.length == 0) return true;
+  if (b.length > a.length) return false;
+  var len1 = a.length,
+    len2 = b.length;
+  if (b[0] >= a[len1 - 1] || b[len2 - 1] <= a[0]) return false;
+  var p1 = 0,
+    p2 = 0;
+  while (true) {
+    while (a[p1] !== b[p2] && p1 < len1) p1++;
+    if (p1 == len1) return false;
+    p1++;
+    p2++;
+    if (p2 == len2) break;
+  }
+  return true;
+};
+

其实可以写的更简单一点,这样理解就容易多了:

+
var isSubset = function isSubset(a, b) {
+  if (b.length == 0) return true;
+  var p1 = 0,
+    p2 = 0;
+  while (p1 < a.length) {
+    if (b[p2] == a[p1]) {
+      p2++;
+      if (p2 == b.length) return true;
+    }
+    p1++;
+  }
+  return false;
+};
+

Follow Up

+

LC 有一道题和这个很类似([LeetCode 392] Is Subsequence)

\ No newline at end of file diff --git "a/Blog/\345\211\215\347\253\257\344\272\214\345\271\264/index.html" "b/Blog/\345\211\215\347\253\257\344\272\214\345\271\264/index.html" new file mode 100644 index 0000000..fb3b675 --- /dev/null +++ "b/Blog/\345\211\215\347\253\257\344\272\214\345\271\264/index.html" @@ -0,0 +1,84 @@ +前端二年 | Welcome to Alex's Midway

前端二年

October 08, 2019


很多年以后,我可能仍然会记得2017年7月某个下午的那场谈话。

+

入职第一天,项目负责人笑眯眯的给我说,公司项目有了变化,临时前端缺人,需要我支持一下。就这样,本以为做java后台开发的我,误打误撞进了前端的门。

+

从什么前端知识都不会,到可以使用react-native独立开发App,我花了8个月;从学会开发App到能开发web管理后台,花了3个月;从开发web管理后台到学会开发移动端H5页面,花了1个月;从移动端H5页面到学会简单的nodejs接入层开发,花了2周

+

前端三大框架都接触过,vue和react已经掌握,前端工程化的常规手段比较熟悉,nodejs能开发,但是还不够熟悉后端的一整套,然后还缺一些前端技术场景暂时没接触过,比如小程序、可视化等等,今年结束之前会想办法自己做demo体验一下

+

不过总的来说,基本上完成了前端一年时立下的目标:大前端

+

是时候考虑下一步该做什么了,目前有一些朦胧的想法:

+
    +
  • 技术补全:可视化,前端监控、埋点,团队开发效率提升的手段
  • +
  • 业务:承担从0到1的前端业务启动,能在不同阶段选择合适的技术支持业务发展(目前比较感兴趣的是内容产品的前端业务,因为一直在做这块内容)
  • +
  • 管理:积累前端团队的技术管理经验,或者以准pm角色积累业务管理经验
  • +
+

这个阶段暂定时间是2年,希望当自己前端4年时能够做到上面的这些事情,以上

\ No newline at end of file diff --git "a/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Axios\345\257\271\350\261\241Mock/index.html" "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Axios\345\257\271\350\261\241Mock/index.html" new file mode 100644 index 0000000..3cb75cf --- /dev/null +++ "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Axios\345\257\271\350\261\241Mock/index.html" @@ -0,0 +1,73 @@ +前端单元测试-Axios对象Mock | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\345\257\271\350\261\241Mock/index.html" "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\345\257\271\350\261\241Mock/index.html" new file mode 100644 index 0000000..92e86d5 --- /dev/null +++ "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\345\257\271\350\261\241Mock/index.html" @@ -0,0 +1,73 @@ +前端单元测试-Vue对象Mock | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\347\273\204\344\273\266mock/index.html" "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\347\273\204\344\273\266mock/index.html" new file mode 100644 index 0000000..91db38f --- /dev/null +++ "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\347\273\204\344\273\266mock/index.html" @@ -0,0 +1,73 @@ +前端单元测试-Vue组件Mock | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\265\213\350\257\225\347\273\204\344\273\266/index.html" "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\265\213\350\257\225\347\273\204\344\273\266/index.html" new file mode 100644 index 0000000..822721f --- /dev/null +++ "b/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\265\213\350\257\225\347\273\204\344\273\266/index.html" @@ -0,0 +1,73 @@ +前端单元测试-测试组件 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\211\215\347\253\257\351\224\231\350\257\257\347\233\221\346\216\247\344\270\216\344\270\212\346\212\245\345\216\237\347\220\206/index.html" "b/Blog/\345\211\215\347\253\257\351\224\231\350\257\257\347\233\221\346\216\247\344\270\216\344\270\212\346\212\245\345\216\237\347\220\206/index.html" new file mode 100644 index 0000000..222dc2c --- /dev/null +++ "b/Blog/\345\211\215\347\253\257\351\224\231\350\257\257\347\233\221\346\216\247\344\270\216\344\270\212\346\212\245\345\216\237\347\220\206/index.html" @@ -0,0 +1,73 @@ +前端错误监控与上报原理 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\212\240\346\263\225\346\223\215\344\275\234\347\254\246/index.html" "b/Blog/\345\212\240\346\263\225\346\223\215\344\275\234\347\254\246/index.html" new file mode 100644 index 0000000..4e5ba97 --- /dev/null +++ "b/Blog/\345\212\240\346\263\225\346\223\215\344\275\234\347\254\246/index.html" @@ -0,0 +1,201 @@ +加法操作符 | Welcome to Alex's Midway

加法操作符

September 18, 2018


+

引子

+

JavaScript上手快 1 年了,今天无意刷到了几道传统面试题,无法有条理的给出答案,顿感基础薄弱。 这几道题都是关于加法操作符的知识点,先上面试例题:

+
1. []+[] //''
+
+2. []+{}//'[object Object]'
+
+3. {}+[]//0
+
+4. {}+{}//'[object Object][object Object]'
+

下面先总结加法操作符规则,之后按照总结的计算规则,依次解题。

+

+操作符规则

+

"+"作为二元操作符,完成表达式x+y中 2 个变量数值相加或字符串拼接,具体规则如下所示:

+
    +
  1. 如果 x, y 至少有一个为对象,将其转换为基本类型
  2. +
  3. 转换后如果 x, y 至少有一个为string,则将另一个转换为string,执行字符串拼接
  4. +
  5. 以上均不满足,将 x, y 转换为number,执行数值计算
  6. +
+
对象转换为基本类型规则
+
    +
  1. 如果 x 是Date对象,返回x.toString()
  2. +
  3. 如果 x 是其他对象,且x.valueOf()返回值为基本类型,返回x.valueOf()
  4. +
  5. 如果x.valueOf()返回值不是基本类型,且 x.toString()返回值为基本类型,返回x.toString()
  6. +
  7. +

    以上皆不满足,抛出TypeError异常

    +
    +

    注:根据 ECMA,对象到基本类型转换实际过程较复杂,以后单独写一篇

    +
    +
  8. +
+

题目解析

+

题 1

+
[] + []; //''
+

分析:

+
    +
  • 均为对象,先将其转换为基本类型,根据对象转换规则,数组首先调用 valueOf(),返回值为自身,继续调用 toString(),返回空字符串'',表达式变为''+''
  • +
  • 根据+规则-2,执行字符串拼接,表达式返回结果''
  • +
+

题 2

+
[] + {}; //'[object Object]'
+

分析:

+
    +
  • 均为对象,先将其转换为基本类型,根据对象转换规则,首先调用valueOf(),返回值为自身,继续调用toString(),返回空字符串'''[object Object]',表达式变为''+'[object Object]'
  • +
  • 根据+规则-2,执行字符串拼接,表达式返回结果'[object Object]'
  • +
+

题 3

+
{
+}
++[]; //0
+

分析:

+
    +
  • 因浏览器将{}解析为代码块注[1],表达式等价于+[],先将其转换为基本类型,根据对象转换规则,数组首先调用valueOf(),返回值为自身,继续调用toString(),返回空字符串'',表达式变为+'',取Number(''),表达式返回0
  • +
  • 如果将表达式改写为({})+[],将得到与题 2 相同的结果
  • +
+

题 4

+
{
+}
++{}; //'[object Object][object Object]'
+

分析:

+
    +
  • 这道题比较奇怪
  • +
  • 按照题 3 的规则,第一个{}将被解析为代码块,表达式等效于+{},按照对象转换规则,先变成+'[object Object]',然后取Number('[object Object]'),应该返回结果NaN才对。FireFox 62EdgeIE11的输出就是这个。
  • +
  • 可是输入Chrome 69,二者都是被当作对象处理的,最终表达式返回结果'[object Object][object Object]'
  • +
  • 看来几家浏览器在这种情况下规则有所不同,深入研究需要看parser里的抽象语法树Abstract Syntax Tree(AST) 是如何解析的,以后有时间了再研究
  • +
+
+

下面对题 4 做一点扩展,算作验证
+题 4-扩展

+
1. ({})+{}   //Chrome  - '[object Object][object Object]'
+             //FireFox - '[object Object][object Object]'
+             //IE 11   - '[object Object][object Object]'
+             //Edge    - '[object Object][object Object]'
+
+2. {}+({})   //Chrome  - NaN
+             //FireFox - NaN
+             //IE 11   - NaN
+             //Edge    - NaN
+
+3. {}+{}+{}  //Chrome  - '[object Object][object Object][object Object]'
+             //FireFox - 'NaN[object Object]'
+             //IE 11   - 'NaN[object Object]'
+             //Edge    - 'NaN[object Object]'
+
+4. ({})+{}+{}//Chrome  - '[object Object][object Object][object Object]'
+             //FireFox - '[object Object][object Object][object Object]'
+             //IE 11   - '[object Object][object Object][object Object]'
+             //Edge    - '[object Object][object Object][object Object]'
+
+5. {}+({})+{}//Chrome  - '[object Object][object Object][object Object]'
+             //FireFox - 'NaN[object Object]'
+             //IE 11   - 'NaN[object Object]'
+             //Edge    - 'NaN[object Object]'
+
+6. {}+{}+({})//Chrome  - 'NaN[object Object]'
+             //FireFox - 'NaN[object Object]'
+             //IE 11   - 'NaN[object Object]'
+             //Edge    - 'NaN[object Object]'
+
+7. {}+[]+{}  //Chrome  - '[object Object][object Object]'
+             //FireFox - '0[object Object]'
+             //IE 11   - '0[object Object]'
+             //Edge    - '0[object Object]'
+
+8. {}+{}+[]  //Chrome  - 'NaN'
+             //FireFox - 'NaN'
+             //IE 11   - 'NaN'
+             //Edge    - 'NaN'
+

看起来似乎Chrome对以{}开头且以{}结尾(即'{}+...+{}') 的表达式做了优化解析,不会把遇见的{}视为代码块,而是作为空对象解析。其他浏览器没有这个规则。

+
+
注 1
+
+

Expression Statement +Syntax

+
ExpressionStatement[Yield] :
+       [lookahead ∉ {{, function, class, let [}] Expression[In, ?Yield] ;
+
+

NOTE +An ExpressionStatement cannot start with a U+007B (LEFT CURLY BRACKET) because that might make it ambiguous with a Block. Also, an ExpressionStatement cannot start with the function or class keywords because that would make it ambiguous with a FunctionDeclaration, a GeneratorDeclaration, or a ClassDeclaration. An ExpressionStatement cannot start with the two token sequence let [ because that would make it ambiguous with a let LexicalDeclaration whose first LexicalBinding was an ArrayBindingPattern.

+
+
\ No newline at end of file diff --git "a/Blog/\345\215\225\345\205\203\346\265\213\350\257\225\345\210\235\346\255\245/index.html" "b/Blog/\345\215\225\345\205\203\346\265\213\350\257\225\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..b3c398b --- /dev/null +++ "b/Blog/\345\215\225\345\205\203\346\265\213\350\257\225\345\210\235\346\255\245/index.html" @@ -0,0 +1,73 @@ +单元测试初步 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Koa\344\270\255\351\227\264\344\273\266\346\265\213\350\257\225/index.html" "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Koa\344\270\255\351\227\264\344\273\266\346\265\213\350\257\225/index.html" new file mode 100644 index 0000000..e4e61dc --- /dev/null +++ "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Koa\344\270\255\351\227\264\344\273\266\346\265\213\350\257\225/index.html" @@ -0,0 +1,73 @@ +后端单元测试-Koa中间件测试 | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-controller/index.html" "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-controller/index.html" new file mode 100644 index 0000000..427fef7 --- /dev/null +++ "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-controller/index.html" @@ -0,0 +1,73 @@ +后端单元测试-controller | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-service/index.html" "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-service/index.html" new file mode 100644 index 0000000..aefa0b1 --- /dev/null +++ "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-service/index.html" @@ -0,0 +1,73 @@ +后端单元测试-service | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\216\245\345\205\245\345\261\202\350\257\267\346\261\202mock/index.html" "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\216\245\345\205\245\345\261\202\350\257\267\346\261\202mock/index.html" new file mode 100644 index 0000000..eea47ba --- /dev/null +++ "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\216\245\345\205\245\345\261\202\350\257\267\346\261\202mock/index.html" @@ -0,0 +1,73 @@ +后端单元测试-接入层请求mock | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\225\260\346\215\256\345\272\223model/index.html" "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\225\260\346\215\256\345\272\223model/index.html" new file mode 100644 index 0000000..57d67da --- /dev/null +++ "b/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\225\260\346\215\256\345\272\223model/index.html" @@ -0,0 +1,73 @@ +后端单元测试-数据库model | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\345\223\215\345\272\224\345\274\217\345\233\276\347\211\207\344\274\230\345\214\226/index.html" "b/Blog/\345\223\215\345\272\224\345\274\217\345\233\276\347\211\207\344\274\230\345\214\226/index.html" new file mode 100644 index 0000000..9df5aad --- /dev/null +++ "b/Blog/\345\223\215\345\272\224\345\274\217\345\233\276\347\211\207\344\274\230\345\214\226/index.html" @@ -0,0 +1,101 @@ +响应式图片优化 | Welcome to Alex's Midway

响应式图片优化

April 12, 2020


写在前面

+
+

图片消耗了网页流量的50%(中位数),移动端图片消耗了大约900Kb

+

​ - httparchive.org, 2020.01

+
+

图片优化的2个目标:

+
    +
  • 保持图片质量的同时,减少不必要的流量(为了更快的加载)
  • +
  • 没有页面布局抖动(为了更好的体验)
  • +
+

如何做:

+
    +
  1. +

    图片格式

    +
      +
    • 绝大多数情况使用jpg
    • +
    • 少数有透明背景要求的情况使用png
    • +
    • gif尽量不用,使用短视频替换
    • +
    • 尽量使用新格式webp,可以大幅缩小图片体积
    • +
    +
  2. +
  3. +

    响应式

    +
      +
    • img标签使用src-set,sizes适配不同尺寸
    • +
    • 多种格式可以使用picture元素,通过source属性指定不同格式图片
    • +
    +
  4. +
\ No newline at end of file diff --git "a/Blog/\345\233\275\351\231\205\345\214\226\345\222\214\346\234\254\345\234\260\345\214\226\345\210\235\346\255\245/index.html" "b/Blog/\345\233\275\351\231\205\345\214\226\345\222\214\346\234\254\345\234\260\345\214\226\345\210\235\346\255\245/index.html" new file mode 100644 index 0000000..2826794 --- /dev/null +++ "b/Blog/\345\233\275\351\231\205\345\214\226\345\222\214\346\234\254\345\234\260\345\214\226\345\210\235\346\255\245/index.html" @@ -0,0 +1,131 @@ +国际化和本地化初步 | Welcome to Alex's Midway

国际化和本地化初步

April 27, 2020


写在前面

+

公司项目网站改版在即,需要扩充国际化和本地化支持。

+

查资料看了下这两个东西,理清了一些概念,简单记录一下。

+

国际化和本地化

+

根据wiki的说法,国际化与本地化(internationalization and localization)是指修改软件使之能适应目标市场的语言、区差异以及技术需要。

+

因为这两个单词太长了,所以前者简写为i18n(表示i和n之间有18个字母),后者是L10n。分别用小写i和大写L是为了和之后的数字1区分,i18n和I18n,显然前者更容易辨识;L10n同理。

+
    +
  • +

    国际化

    +

    将软件与特定语言及地区脱钩的过程,即软件移植到不同语言和地区时,不需要做工程上的改动

    +
  • +
  • +

    本地化

    +

    与国际化相反,指移植软件时,增加与特定区域有关的信息和必要翻译的过程

    +
  • +
+

举个例子,前端最常见的国际化场景是给文案增加不同的语言版本,比如一个按钮文案是“提交”,在英文状态下可能会改成"Submit"。

+

另一个例子是处理时间,用统一逻辑处理不同时区之间的时间,这个算国际化;但是不同地区时间显示的格式不一样,同样是英语国家,英国的时间一般是dd/mm/yyyy,而美国的就是MM dd, yyyy,这个算本地化。

+

更常见的本地化场景是货币,不同国家的货币一般来说都是不同的,符号不同、计数的方式也不同。比如欧元区的德国,除了欧元的货币符号与美元不同之外,逗号和小数点的规则完全相反,2.100,50数值于美国的2,100.50

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
地区货币日期
美国$1,234.56Apr 27, 2020
英国£1,234.5627/04/2020
德国1.234,56 €27/04/2020
中国¥1234.562020/04/27
+

地区设置Locale

+

有了国际化和本地化的支持,那么下一步就是要获取用户的位置了,否则无法有效根据不同用户背景提供更匹配的服务,于是引入了一个地区设置locale的概念。

+

从用户的角度来说,操作系统一般会有一组相应的环境变量设置locale,而对于网站/服务提供者来说,其实locale更像是一种推定,根据已获得的某些用户数据,推测用户的背景,并让网站/服务根据这个假设为用户提供(可能)更匹配的服务,比如语言。后面讲到语言类别的时候会更具体的讲到。

+

例子: 语言设置

+

如何获取用户语言设置

+

优先级:https://support.google.com/webmasters/answer/182192?hl=en&ref_topic=2370587

+

domain->sub-domain->subdirectories->query parameters->http header accept-language->cookie->user agent

+

google如何检索不同语言版本

+

https://support.google.com/webmasters/answer/182192?hl=en&ref_topic=2370587

\ No newline at end of file diff --git "a/Blog/\345\244\232\350\257\255\350\250\200\347\232\204\345\210\244\346\226\255\344\274\230\345\205\210\347\272\247/index.html" "b/Blog/\345\244\232\350\257\255\350\250\200\347\232\204\345\210\244\346\226\255\344\274\230\345\205\210\347\272\247/index.html" new file mode 100644 index 0000000..7c6fbd8 --- /dev/null +++ "b/Blog/\345\244\232\350\257\255\350\250\200\347\232\204\345\210\244\346\226\255\344\274\230\345\205\210\347\272\247/index.html" @@ -0,0 +1,93 @@ +多语言的判断优先级 | Welcome to Alex's Midway

多语言的判断优先级

March 05, 2020


写在前面

+

最近增加Node多语言的支持,后端获取语言参数的优先级有点不清楚
+特意查了些文档,在这里记录一下

+

优先级

+
    +
  1. Domain: 顶级域名(TLD, Top Level Domain),如.cn, .de等
  2. +
  3. Subdomain: 子域名,如cn.amazon.com
  4. +
  5. Subdirectory: URL里增加path,如www.mozilla.org/en-US/
  6. +
  7. +

    其他: 以下不分先后,可自定义优先级

    +
      +
    • URL parameter: 如www.example.com?lang=en-US
    • +
    • HTTP header: Accept-Language: 可在浏览器语言偏好里设置,请求时会将此信息带上'Accept-Language: en;q=0.8,es;q=0.6,fr;q=0.4'
    • +
    • User Agent: 一般用在App内,语言参数名称可能不标准,而且变更可能比较频繁,比如Facebook的UA里表示语言的属性是user-lang
    • +
    • Cookie: 语言参数名也可能不标准,变更也可能比较频繁,现在好像用的越来越少了
    • +
    +
  8. +
  9. IP查找: 以上都失效的时候,后端还可以考虑使用IP查找检测对应语言,准确率较低
  10. +
  11. 自定义标准: 还可以自定义规则覆盖以上的设置
  12. +
+

暂时这么多,以上

\ No newline at end of file diff --git "a/Blog/\345\246\202\344\275\225\345\210\244\346\226\255\346\227\245\346\234\237\346\230\257\345\220\246\344\270\272\344\273\212\345\244\251/index.html" "b/Blog/\345\246\202\344\275\225\345\210\244\346\226\255\346\227\245\346\234\237\346\230\257\345\220\246\344\270\272\344\273\212\345\244\251/index.html" new file mode 100644 index 0000000..df65649 --- /dev/null +++ "b/Blog/\345\246\202\344\275\225\345\210\244\346\226\255\346\227\245\346\234\237\346\230\257\345\220\246\344\270\272\344\273\212\345\244\251/index.html" @@ -0,0 +1,77 @@ +如何判断日期是否为今天 | Welcome to Alex's Midway
\ No newline at end of file diff --git "a/Blog/\345\256\236\347\216\260\350\207\252\345\256\232\344\271\211tabbar component/index.html" "b/Blog/\345\256\236\347\216\260\350\207\252\345\256\232\344\271\211tabbar component/index.html" new file mode 100644 index 0000000..66cf4aa --- /dev/null +++ "b/Blog/\345\256\236\347\216\260\350\207\252\345\256\232\344\271\211tabbar component/index.html" @@ -0,0 +1,78 @@ +实现自定义tabbar component | Welcome to Alex's Midway
\ No newline at end of file diff --git "a/Blog/\345\274\200\345\247\213\345\210\267leetcode/index.html" "b/Blog/\345\274\200\345\247\213\345\210\267leetcode/index.html" new file mode 100644 index 0000000..21ce56d --- /dev/null +++ "b/Blog/\345\274\200\345\247\213\345\210\267leetcode/index.html" @@ -0,0 +1,80 @@ +开始刷leetcode | Welcome to Alex's Midway

开始刷leetcode

February 11, 2019


可能是今年 flag 里包含项目最多的一个,今天正式开始 leetcode 刷题,目标是 7 月 31 日之前至少刷完一遍。

+

leetcode 官方放出了一个 top interview questions list,一共 151 题:

+ +

嗯,就这些。

\ No newline at end of file diff --git "a/Blog/\346\201\266\350\266\243\345\221\263\346\236\204\351\200\240\345\207\275\346\225\260/index.html" "b/Blog/\346\201\266\350\266\243\345\221\263\346\236\204\351\200\240\345\207\275\346\225\260/index.html" new file mode 100644 index 0000000..ac5b3d6 --- /dev/null +++ "b/Blog/\346\201\266\350\266\243\345\221\263\346\236\204\351\200\240\345\207\275\346\225\260/index.html" @@ -0,0 +1,146 @@ +恶趣味构造函数 | Welcome to Alex's Midway

恶趣味构造函数

October 29, 2018


+
+

引子

+

理论上说,只要对函数使用new语法,任何function都可以作为constructor创建新实例,但是如果function不按常理出牌呢?还可以实现创建新实例的目标吗?

+
+

注:本文内容为JavaScript Ninja的读书笔记。

+
+

带返回值的构造函数

+
    +
  1. 返回值为基本类型
  2. +
+
function retPrimType() {
+  this.value = 'I am a function returning a primitive type';
+  this.getMyThis = function() {
+    return this;
+  };
+  return 'I return a new Object as this';
+}
+
+const a = new retPrimType();
+console.log(retPrimType()); //'I return a new Object as this'
+console.log(a.getMyThis() === a); //true
+
    +
  1. 返回值为对象
  2. +
+
const ref = { key: 'object' };
+function retObjectType() {
+  this.value = 'I am a funtion returning an Object';
+  this.getMyThis = function() {
+    return this;
+  };
+  return ref;
+}
+
+const b = new retObjectType();
+console.log(retObjectType()); //{key:'object'}
+console.log(b.getMyThis === b); // error: b.getMyThis is not a function
+console.log(b === ref); //true
+
+const c = new retObjectType();
+console.log(b === c); //true
+
    +
  1. +

    小结

    +
      +
    • function返回基本类型,new之后其返回值被忽略,依然能够创建新实例,并且this的指向正确
    • +
    • function返回对象,new 之后该对象将被返回,无法创建新实例
    • +
    +
  2. +
+

一点引申: 单例模式

+

开一点脑洞,如果要求某个对象使用new后只能返回同一个实例,即实现单例模式,如何利用上面的结论来实现?

+
const singleton = (function() {
+  const retObj = { key: 'I am singleton!' };
+  return function() {
+    return retObj;
+  };
+})();
+const a = new singleton();
+const b = new singleton();
+console.log(a === b); //true
+a.key = 'everyone changes with me';
+console.log(a); //{key: 'everyone changes with me'}
+console.log(b); //{key: 'everyone changes with me'}
+

用 IIFE+闭包构造一个singleton对象,它的值就是内层匿名函数,可以访问其外层自由变量retObj。按照上面总结的规则,每当对singleton执行new操作时,它总是会返回对象retObj,这样就实现了恶趣味单例模式。

\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.every/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.every/index.html" new file mode 100644 index 0000000..d882976 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.every/index.html" @@ -0,0 +1,118 @@ +手写Array.prototype.every | Welcome to Alex's Midway

手写Array.prototype.every

May 24, 2020


前端知识复习 code snippet

+

array.prototype.every 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. +
  7. Let k be 0.
  8. +
  9. +

    Repeat, while k < len,

    +
      +
    • Let Pk be ! ToString(k).
    • +
    • Let kPresent be ? HasProperty(O, Pk).
    • +
    • +

      If kPresent is true, then

      +
        +
      • Let kValue be ? Get(O, Pk).
      • +
      • Let testResult be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, O »)).
      • +
      • If testResult is true, return false.
      • +
      +
    • +
    +
  10. +
  11. Set k to k + 1.
  12. +
  13. Return true.
  14. +
+
+

代码

+
Array.prototype.myEvery = function (callbackfn, thisArg) {
+    if (this == undefined) {
+        throw TypeError('Cannot read property filter of ' + this);
+    }
+    if (typeof callbackfn !== 'function') {
+        throw TypeError(callbackfn + ' is not a function');
+    }
+
+    var O = Object(this);
+    var len = O.length >>> 0;
+    for (var k = 0; k < len; k++) {
+        if (k in O) {
+            var kValue = O[k];
+            if (!callbackfn.call(thisArg, kValue, k, O)) return false;
+        }
+    }
+    return true;
+};
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.filter/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.filter/index.html" new file mode 100644 index 0000000..a1b9efc --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.filter/index.html" @@ -0,0 +1,138 @@ +手写Array.prototype.filter | Welcome to Alex's Midway

手写Array.prototype.filter

May 22, 2020


前端知识复习 code snippet

+

array.prototype.filter 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. +
  7. Let A be ? ArraySpeciesCreate(O, 0).
  8. +
  9. Let k be 0.
  10. +
  11. Let to be 0.
  12. +
  13. +

    Repeat, while k < len,

    +
      +
    • Let Pk be ! ToString(k).
    • +
    • Let kPresent be ? HasProperty(O, Pk).
    • +
    • +

      If kPresent is true, then

      +
        +
      • Let kValue be ? Get(O, Pk).
      • +
      • Let selected be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, O »)).
      • +
      • +

        If selected is true, then

        +
          +
        • Perform ? CreateDataPropertyOrThrow(A, ! ToString(to), kValue).
        • +
        • Set to to to + 1.
        • +
        +
      • +
      +
    • +
    • Set k to k + 1.
    • +
    +
  14. +
  15. Return A.
  16. +
+
+

代码

+
Array.prototype.myFilter = function(callbackfn,thisArg){
+    // this cannot be null or undefined
+    if(this == undefined){
+        throw TypeError('Cannot read property filter of '+ this);
+    }
+    // callbackfn must be a function
+    if(typeof callbackfn !== 'function'){
+        throw TypeError(callbackfn + ' is not a function')
+    }
+
+    var O = Object(this);
+    var len = O.length >>> 0;
+
+    var A = [];
+    // element index in O
+    var k=0;
+    // element index in A
+    var to=0;
+    // iterate O and store element that meets criteria in A
+    for(;k<len;k++){
+        if(k in O){
+            var kValue = O[k]
+            var selected = callbackfn.call(thisArg, kValue, k, O);
+            if(selected){
+                A[to++] = kValue;
+            }
+        }
+    }
+    return A;
+}
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.forEach/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.forEach/index.html" new file mode 100644 index 0000000..db85a72 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.forEach/index.html" @@ -0,0 +1,134 @@ +手写Array.prototype.forEach | Welcome to Alex's Midway

手写Array.prototype.forEach

May 23, 2020


前端知识复习 code snippet

+

array.prototype.foreach 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. +
  7. Let k be 0.
  8. +
  9. +

    Repeat, while k < len,

    +
      +
    • Let Pk be ! ToString(k).
    • +
    • Let kPresent be ? HasProperty(O, Pk).
    • +
    • +

      If kPresent is true, then

      +
        +
      • Let kValue be ? Get(O, Pk).
      • +
      • Perform ? Call(callbackfn, thisArg, « kValue, k, O »).
      • +
      +
    • +
    +
  10. +
  11. Set k to k + 1.
  12. +
  13. Return undefined.
  14. +
+
+

代码

+
Array.prototype.myForEach = function (callbackfn, thisArg) {
+    // this must not be null or undefined
+    if (this == null) {
+        throw new TypeError(
+            'Array.prototype.forEach called on null or undefined'
+        );
+    }
+    // callbackfn must be a function
+    if (typeof callbackfn !== 'function') {
+        throw new TypeError(callbackfn + ' is not a function');
+    }
+
+    var O = Object(this);
+    var len = O.length >>> 0;
+
+    var k = 0;
+    // iterate array
+    if (thisArg === undefined) {
+        for (; k < len; k++) {
+            if (k in O) {
+                var kValue = O[k];
+                callbackfn(kValue, k, O);
+            }
+        }
+    } else {
+        for (; k < len; k++) {
+            if (k in O) {
+                var kValue = O[k];
+                callbackfn.call(thisArg, kValue, k, O);
+            }
+        }
+    }
+
+    return undefined;
+};
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.map/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.map/index.html" new file mode 100644 index 0000000..a362a95 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.map/index.html" @@ -0,0 +1,127 @@ +手写Array.prototype.map | Welcome to Alex's Midway

手写Array.prototype.map

May 20, 2020


前端知识复习 code snippet

+

废话少说,先看 array.prototype.map 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. +
  7. Let A be ? ArraySpeciesCreate(O, len).
  8. +
  9. Let k be 0.
  10. +
  11. +

    Repeat, while k < len,

    +
      +
    • Let Pk be ! ToString(k).
    • +
    • Let kPresent be ? HasProperty(O, Pk).
    • +
    • +

      If kPresent is true, then

      +
        +
      • Let kValue be ? Get(O, Pk).
      • +
      • Let mappedValue be ? Call(callbackfn, thisArg, « kValue, k, O »).
      • +
      • Perform ? CreateDataPropertyOrThrow(A, Pk, mappedValue).
      • +
      • Set k to k +1.
      • +
      +
    • +
    +
  12. +
  13. Return A.
  14. +
+
+

代码

+
Array.prototype.myMap = function(callbackfn, thisArg) {
+  // this cannot be null or undefined
+  if (this == null) {
+    throw new TypeError('this is null or undefined');
+  }
+  var O = Object(this);
+// convert O.length to integer 0
+// e.g. undefined >>> 0 => 0
+  var len = O.length >>> 0;
+  // callbackfn must be a function
+  if (typeof callbackfn != 'function') {
+    throw new TypeError(callbackfn + ' is not a function');
+  }
+  var T = thisArg != undefined ? thisArg : undefined;
+  var A = new Array(len);
+
+  for (var k = 0; k < len; k++) {
+    // iterate all property of O, including props in prototype chain
+    if (k in O) {
+      var kValue = O[k];
+      var mappedValue = callbackfn.call(T, kValue, k, O);
+      A[k] = mappedValue;
+    }
+  }
+  return A;
+};
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.pop/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.pop/index.html" new file mode 100644 index 0000000..338a513 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.pop/index.html" @@ -0,0 +1,114 @@ +手写Array.prototype.pop | Welcome to Alex's Midway

手写Array.prototype.pop

May 24, 2020


前端知识复习 code snippet

+

array.prototype.pop 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. +

    If len is zero, then

    +
      +
    • Perform ? Set(O, "length", 0, true).
    • +
    • Return undefined.
    • +
    +
  6. +
  7. +

    Else,

    +
      +
    • Assert: len > 0.
    • +
    • Let newLen be len - 1.
    • +
    • Let index be ! ToString(newLen).
    • +
    • Let element be ? Get(O, index).
    • +
    • Perform ? DeletePropertyOrThrow(O, index).
    • +
    • Perform ? Set(O, "length", newLen, true).
    • +
    • Return element.
    • +
    +
  8. +
+
+

代码

+
Array.prototype.myPop = function () {
+    var O = Object(this);
+    var len = O.length >>> 0;
+
+    if (len == 0) {
+        O.length = 0;
+        return undefined;
+    } else {
+        var element = O[--len];
+        delete O[len];
+        O.length = newLen;
+        return element;
+    }
+};
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.push/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.push/index.html" new file mode 100644 index 0000000..6fafe09 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.push/index.html" @@ -0,0 +1,111 @@ +手写Array.prototype.push | Welcome to Alex's Midway

手写Array.prototype.push

May 24, 2020


前端知识复习 code snippet

+

array.prototype.push 标准

+
+
    +
  1. t O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. Let items be a List whose elements are, in left to right order, the arguments that were passed to this function invocation.
  6. +
  7. Let argCount be the number of elements in items.
  8. +
  9. If len + argCount > 253 - 1, throw a TypeError exception.
  10. +
  11. +

    Repeat, while items is not empty,

    +
      +
    • Remove the first element from items and let E be the value of the element.
    • +
    • Perform ? Set(O, ! ToString(len), E, true).
    • +
    • Set len to len + 1.
    • +
    +
  12. +
  13. Perform ? Set(O, "length", len, true).
  14. +
  15. Return len.
  16. +
+
+

代码

+
Array.prototype.myPush = function(){
+    var O = Object(this);
+    var len = O.length >>> 0;
+    var argCount = arguments.length;
+    // argCount or len may exceed MAX_SAFE_INTEGER, therefore argCount+len may not be safe
+    // do not use argCount + len > Number.MAX_SAFE_INTEGER
+    if(argCount > Number.MAX_SAFE_INTEGER - len){
+        throw TypeError('Invalid array length')
+    }
+
+    for(var k=0;k<argCount;k++){
+        O[len+k] = arguments[k];
+    };
+    len = len + argCount;
+    O.length = len;
+    return len;
+}
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.reduce/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.reduce/index.html" new file mode 100644 index 0000000..1b74593 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.reduce/index.html" @@ -0,0 +1,160 @@ +手写Array.prototype.reduce | Welcome to Alex's Midway

手写Array.prototype.reduce

May 21, 2020


前端知识复习 code snippet

+

先看 array.prototype.reduce 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. +
  7. If len is 0 and initialValue is not present, throw a TypeError exception.
  8. +
  9. Let k be 0.
  10. +
  11. Let accumulator be undefined.
  12. +
  13. +

    If initialValue is present, then

    +
      +
    • Set accumulator to initialValue.
    • +
    +
  14. +
  15. +

    Else,

    +
      +
    • Let kPresent be false.
    • +
    • +

      Repeat, while kPresent is false and k < len,

      +
        +
      • Let Pk be ! ToString(k).
      • +
      • Set kPresent to ? HasProperty(O, Pk).
      • +
      • If kPresent is true, then
      • +
      • Set accumulator to ? Get(O, Pk).
      • +
      +
    • +
    • Set k to k + 1.
    • +
    • If kPresent is false, throw a TypeError exception.
    • +
    +
  16. +
  17. +

    Repeat, while k < len,

    +
      +
    • Let Pk be ! ToString(k).
    • +
    • Let kPresent be ? HasProperty(O, Pk).
    • +
    • +

      If kPresent is true, then

      +
        +
      • Let kValue be ? Get(O, Pk).
      • +
      • Set accumulator to ? Call(callbackfn, undefined, « accumulator, kValue, k, O »).
      • +
      +
    • +
    • Set k to k + 1.
    • +
    +
  18. +
  19. Return accumulator.
  20. +
+
+

代码

+
Array.prototype.myReduce = function(callbackfn, initialValue) {
+  // this must not be null or undefined
+  if (this == null) {
+    throw new TypeError('Array.prototype.reduce called on null or undefined');
+  }
+  // callbackfn must be a function
+  if (typeof callbackfn !== 'function') {
+    throw new TypeError(callbackfn + ' is not a function');
+  }
+
+  var O = Object(this);
+  var len = O.length >>> 0;
+
+  var k = 0,
+    accumulator = initialValue;
+  // get initialValue
+  find_initial: if (accumulator == undefined) {
+    for (; k < len; k++) {
+      if (k in O) {
+        accumulator = O[k++];
+        break find_initial;
+      }
+    }
+    // end of iteration with no initialValue found, throw empty array error
+    throw new TypeError('myReduce of empty array with no initial value');
+  }
+
+  // iterate array and merge results
+  for (; k < len; k++) {
+    if (k in O) {
+      var kValue = O[k];
+      accumulator = callbackfn(accumulator, kValue, k, O);
+    }
+  }
+  return accumulator;
+};
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231Array.prototype.some/index.html" "b/Blog/\346\211\213\345\206\231Array.prototype.some/index.html" new file mode 100644 index 0000000..8159e68 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231Array.prototype.some/index.html" @@ -0,0 +1,118 @@ +手写Array.prototype.some | Welcome to Alex's Midway

手写Array.prototype.some

May 24, 2020


前端知识复习 code snippet

+

array.prototype.some 标准

+
+
    +
  1. Let O be ? ToObject(this value).
  2. +
  3. Let len be ? LengthOfArrayLike(O).
  4. +
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. +
  7. Let k be 0.
  8. +
  9. +

    Repeat, while k < len,

    +
      +
    • Let Pk be ! ToString(k).
    • +
    • Let kPresent be ? HasProperty(O, Pk).
    • +
    • +

      If kPresent is true, then

      +
        +
      • Let kValue be ? Get(O, Pk).
      • +
      • Let testResult be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, O »)).
      • +
      • If testResult is true, return true.
      • +
      +
    • +
    +
  10. +
  11. Set k to k + 1.
  12. +
  13. Return false.
  14. +
+
+

代码

+
Array.prototype.mySome = function(callbackfn, thisArg){
+    if(this == undefined){
+        throw TypeError('Cannot read property filter of '+ this);
+    }
+    if(typeof callbackfn !== 'function'){
+        throw TypeError(callbackfn + ' is not a function')
+    }
+
+    var O = Object(this);
+    var len = O.length >>> 0;
+    for(var k=0;k<len;k++){
+        if(k in O){
+            var kValue = O[k];
+            if(callbackfn.call(thisArg, kValue,k,O)) return true;
+        }
+    }
+    return false;
+}
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231bind/index.html" "b/Blog/\346\211\213\345\206\231bind/index.html" new file mode 100644 index 0000000..fdc1863 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231bind/index.html" @@ -0,0 +1,142 @@ +手写bind | Welcome to Alex's Midway

手写bind

June 17, 2020


前端知识复习 code snippet

+

Function.prototype.bind 标准

+
+

When the bind method is called with argument thisArg and zero or more args, it performs the following steps:

+
    +
  1. Let Target be the this value.
  2. +
  3. If IsCallable(Target) is false, throw a TypeError exception.
  4. +
  5. Let F be ? BoundFunctionCreate(Target, thisArg, args).
  6. +
  7. Let L be 0.
  8. +
  9. Let targetHasLength be ? HasOwnProperty(Target, "length").
  10. +
  11. +

    If targetHasLength is true, then +a. Let targetLen be ? Get(Target, "length"). +b. If Type(targetLen) is Number, then

    +
      +
    • If targetLen is +∞𝔽, set L to +∞.
    • +
    • Else if targetLen is -∞𝔽, set L to 0.
    • +
    • +

      Else,

      +
        +
      • Let targetLenAsInt be ! ToIntegerOrInfinity(targetLen).
      • +
      • Assert: targetLenAsInt is finite.
      • +
      • Let argCount be the number of elements in args.
      • +
      • Set L to max(targetLenAsInt - argCount, 0).
      • +
      +
    • +
    +
  12. +
  13. Perform ! SetFunctionLength(F, L).
  14. +
  15. Let targetName be ? Get(Target, "name").
  16. +
  17. If Type(targetName) is not String, set targetName to the empty String.
  18. +
  19. Perform SetFunctionName(F, targetName, "bound").
  20. +
  21. Return F.
  22. +
+
+

代码

+
function myBind(thisArg,...args){
+    var target = this;
+    if(!isCallable(target)){
+        throw new Type Error(target+'.bind is not a function')
+    }
+
+    var bound = function () {};
+    var fBound = function () {
+        var bindArgs = Array.prototype.slice.call(arguments);
+
+        if (this instanceof bound) {
+            // constructor
+            var result = target.apply(this, args.concat(bindArgs));
+            if(Object(result)===result){
+                // constructor call returns a object
+                return result;
+            }
+            // returns an instance
+            return this;
+        } else {
+            // ordinary function call
+            return target.apply(thisArg, args.concat(bindArgs));
+        }
+    };
+    // keep prototype chain
+    bound.prototype = target.prototype;
+    fBound.prototype = new bound();
+    return fBound;
+    
+}
+
+function isCallable(obj){
+    return typeof obj === 'function';
+}
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231instanceof/index.html" "b/Blog/\346\211\213\345\206\231instanceof/index.html" new file mode 100644 index 0000000..6781c43 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231instanceof/index.html" @@ -0,0 +1,122 @@ +手写instanceof | Welcome to Alex's Midway

手写instanceof

June 15, 2020


前端知识复习 code snippet

+

instanceof 标准

+
+
    +
  1. If Type(target) is not Object, throw a TypeError exception.
  2. +
  3. Let instOfHandler be ? GetMethod(target, @@hasInstance).
  4. +
  5. +

    If instOfHandler is not undefined, then

    +
      +
    • Return ! ToBoolean(? Call(instOfHandler, target, « V »)).
    • +
    +
  6. +
  7. If IsCallable(target) is false, throw a TypeError exception.
  8. +
  9. Return ? OrdinaryHasInstance(target, V).
  10. +
+
+

代码

+
function myInstanceof(left,right){
+    if(!isObject(right)){
+        throw new Error('right-hand side of instanceof is not an object')
+    }
+    var instOfHandler = right[Symbol.hasInstance];
+    if(instOfHandler){
+        return Boolean(instOfHandler.call(right, left));
+    };
+    if(!isFunction(right)){
+        throw new Error('right-hand side of instanceof is not callable');
+    }
+    if(!isObject(left)) return false;
+
+    var proto = Object.getPrototypeOf(left);
+    if(!isObject(proto)){
+        throw new Error('prototype must be an object')
+    }
+    while(proto){
+        if(proto === right.prototype){
+            return true;
+        }
+        proto = Object.getPrototypeOf(proto);
+    }
+    return false;
+}
+
+function isFunction(obj){
+    return typeof obj === 'function';
+}
+
+function isObject(obj){
+    return obj !== null && typeof obj === 'object' || isFunction(obj);
+}
\ No newline at end of file diff --git "a/Blog/\346\211\213\345\206\231new/index.html" "b/Blog/\346\211\213\345\206\231new/index.html" new file mode 100644 index 0000000..a7e0804 --- /dev/null +++ "b/Blog/\346\211\213\345\206\231new/index.html" @@ -0,0 +1,103 @@ +手写new | Welcome to Alex's Midway

手写new

May 28, 2020


前端知识复习 code snippet

+

根据MDN,new主要做了4件事情

+
+

The new keyword does the following things:

+
    +
  1. Creates a blank, plain JavaScript object;
  2. +
  3. Links (sets the constructor of) this object to another object;
  4. +
  5. Passes the newly created object from Step 1 as the this context;
  6. +
  7. Returns this if the function doesn't return an object.
  8. +
+
+

因为new是操作符,没有办法直接实现,只有写一个function myNew(constructor[, arguments])的方法
+第一个参数是要构造函数,剩下的是待传入的parameter(也可以为空)

+

代码

+
function myNew(){
+    var constructor = Array.prototype.shift.call(arguments);
+    // constructor不是函数,抛出错误
+    if(typeof constructor != 'function'){
+        throw TypeError(constructor+'is not a constructor');
+    }
+    // 取得要返回的this
+    var instance = Object.create(constructor.prototype);
+    // 取得constructor自身执行的返回值
+    var ret = constructor.apply(instance, arguments);
+
+    return typeof ret == 'object' && ret != null ? ret : instance;
+
+}
+

一点问题

+

上面代码还是有个比较明显的问题: +Object.create是一个基于new的语法糖方法,所以myNew本质上还是调用了new,有点循环论证的意思

\ No newline at end of file diff --git "a/Blog/\346\220\255\345\273\272RN\345\274\200\345\217\221\347\216\257\345\242\203/index.html" "b/Blog/\346\220\255\345\273\272RN\345\274\200\345\217\221\347\216\257\345\242\203/index.html" new file mode 100644 index 0000000..c3997b1 --- /dev/null +++ "b/Blog/\346\220\255\345\273\272RN\345\274\200\345\217\221\347\216\257\345\242\203/index.html" @@ -0,0 +1,76 @@ +搭建RN开发环境 | Welcome to Alex's Midway
\ No newline at end of file diff --git "a/Blog/\347\224\250Gatsby\351\207\215\345\206\231\344\272\206\345\215\232\345\256\242/index.html" "b/Blog/\347\224\250Gatsby\351\207\215\345\206\231\344\272\206\345\215\232\345\256\242/index.html" new file mode 100644 index 0000000..a3a1e57 --- /dev/null +++ "b/Blog/\347\224\250Gatsby\351\207\215\345\206\231\344\272\206\345\215\232\345\256\242/index.html" @@ -0,0 +1,75 @@ +用Gatsby重写了博客 | Welcome to Alex's Midway

用Gatsby重写了博客

December 16, 2018


花了 3,4 天,用 Gatsby 断断续续的重写了之前的博客,现在是 SPA 了,哈哈哈。Gatsby 包装了各种插件,用起来挺方便,最关键是不用自己配置 webpack 了,省事不少。当然了,新东西 bug 和偏门也挺多的,改造这个博客就踩了不少坑。

+

发布到了个人 github page 上,用 lighthouse 测试了下性能,评分很高。PWA 和 Accessibility 的部分没来得及做完,现在只有基本内容,以后慢慢折腾。

+

嗯,暂时就这些。

\ No newline at end of file diff --git "a/Blog/\347\233\270\347\255\211\346\223\215\344\275\234\347\254\246/index.html" "b/Blog/\347\233\270\347\255\211\346\223\215\344\275\234\347\254\246/index.html" new file mode 100644 index 0000000..ff6097e --- /dev/null +++ "b/Blog/\347\233\270\347\255\211\346\223\215\344\275\234\347\254\246/index.html" @@ -0,0 +1,249 @@ +相等操作符 | Welcome to Alex's Midway

相等操作符

September 15, 2018


+
+

引子

+

在网上看到了几个关于相等操作符的面试题,除了 1,其他都一头雾水。 +再次证明基础不牢固,有必要深入学习一下。

+
1. []==[]     //false
+2. []==![]    //true
+3. {}==!{}    //false
+4. {}==![]    //Uncaught SyntaxError: Unexpected token ==
+5. ![]=={}    //false
+6. []==!{}    //true
+7. undefined==null //true
+

操作符运算规则

+
+

相等操作符: == +全等操作符: ===

+
+

根据 JS 高程里的定义,操作符如上所示,但高程里全等操作符的计算规则有点语焉不详,查询 ECMA 后列举如下:

+
全等操作符判定规则 - Strict Equality Comparison(SEC)
+
    +
  1. 如果x, y类型不同,返回false
  2. +
  3. 如果x, yundefined,返回true
  4. +
  5. 如果x, ynull,返回true
  6. +
  7. +

    如果x, ynumber类型,那么:

    +
      +
    1. 如果x, y其中之一,或二者均为NaN,返回false
    2. +
    3. 如果xy的值相同,返回true
    4. +
    5. 如果x+0y-0,返回true
    6. +
    7. 如果x-0y+0,返回true
    8. +
    9. 其他情况返回false
    10. +
    +
  8. +
  9. 如果x, ystring类型,那么当二者长度相同且字符顺序也一致时,返回true;否则返回false
  10. +
  11. 如果x, yBoolean类型,那么当x, y均为true或均为false时,返回 true;否则返回false
  12. +
  13. x, y为对象,二者指向同一对象时返回true;否则返回false
  14. +
+

例 1

+
1 === []; //false
+//1为number,[]为对象,类型不同,根据SEC-1返回false
+
+undefined === undefined; //true
+//类型相同,根据SEC-2返回true
+
+null === null; //true
+//类型相同,根据SEC-3返回true
+
+null === undefined; // false
+//null为object,undefinedw为undefined,类型不同,根据SEC-1返回false
+
+NaN === 1; //false
+//类型相同,根据SEC-4.1返回false
+
+NaN === NaN; //false
+//类型相同,根据SEC-4.1返回false
+//NaN是唯一与自身不相等的数
+
+1 === true; //false
+//1为number,true为Boolean,类型不同,返回false
+
+'' === false; //false
+//''为string,false为Boolean,类型不同,返回false
+
相等操作符判定规则 - Abstract Equality Comparison(AEC)
+
    +
  1. 如果 x, y 类型相同,按全等操作符判定规则进行比较
  2. +
  3. 如果 x, y 一方为undefined,另一方为null,返回true
  4. +
  5. 如果 x, y 一方为number,另一方为string,将string转换为number后再做比较
  6. +
  7. 如果 x, y 一方为Boolean,将其转换为number后再做比较
  8. +
  9. 如果 x, y 一方为对象,另一方为string, number, symbol,将对象转换为基本类型后再做比较
  10. +
  11. 其他情况返回false
  12. +
+

AEC-5中涉及对象与基本类型的转换,ECMA中由内置方法ToPrimitive(x)实现,基本规则如下:

+
对象转换基本类型规则 - Object To Primitive(OTP)
+
    +
  1. 如果x为日期Date类型,调用x.toString()返回日期字符串
  2. +
  3. x为其他类型对象,首先调用x.valueOf(),如结果为基本类型,返回该值
  4. +
  5. 如果2不满足,继续调用x.toString(),如结果为基本类型,返回该值
  6. +
  7. +

    3不满足,抛出TypeError异常

    +
    +

    注:

    +
      +
    1. 对象的valueOf()方法通常返回自身,因此绝大多数情况,转换为基本类型调用的是toString()方法
    2. +
    3. 对象的默认toString()方法为Object.prototype.toString(),其输出值为字符串'[object objType]',其中objType为对象的类型,所以空对象{}.toString()的输出为'[object Object]'(注意一个是小写o,一个是大写O)
    4. +
    5. 数组对象Array重写了toString()方法,其输出为Array.join('');如果不重写,其输出应为'[object Array]'
    6. +
    +
    +
  8. +
+

例 2

+
undefined == null; //true
+//根据AEC-2,返回true
+
+1 == true; //true
+//根据AEC-4,将Boolean转换为number,Number(true)为1,变为1 == 1
+//根据AEC-1及SEC-4.2,返回true
+
+'' == false; //true
+//根据AEC-4,将Boolean一方转换为number,Number(false)为0,变为'' == 0
+//根据AEC-3,将''转换为number,Number('')为0, 变为0 == 0
+//根据AEC-1及SEC-4.2,返回true
+
+'' == []; //true
+//根据AEC-3, OTP-注-2, OTP-注-3,空数组对象[]调用toString()方法
+//[].toString()输出为'',变为'' == ''
+//根据AEC-1及SEC-5,返回true
+
+'' == {}; //false
+//根据AEC-3, OTP-注-2,空对象{}调用toString()方法,
+//{}.toString()输出为'[object Object]',变为'' == '[object Object]'
+//根据AEC-1及SEC-5,返回false
+

解题及分析

+

规则介绍完了,下面根据规则解题

+

题 1

+
[] == []; //false
+

分析:

+
    +
  • 二者均为数组对象,类型相同
  • +
  • 二个空数组分别指向2个数组,根据SEC-7,返回false
  • +
+

题 2

+
[] == ![]; //true
+

分析:

+
    +
  • !逻辑非运算符先计算,![]值为false,表达式变为[] == false
  • +
  • 类型不同,一方为Boolean类型,应用AEC-4,表达式变为[] == 0
  • +
  • 一方为对象,应用AEC-5OTP-3OTP-注-3,表达式变为'' == 0
  • +
  • 继续应用AEC-3,表达式变为0 == 0,返回true
  • +
+

题 3

+
{}==!{}    //false
+

分析:

+
    +
  • !逻辑非运算符先计算,表达式变为{} == false
  • +
  • 类型不同,且一方为Boolean类型,根据AEC-4,表达式变为{} == 0
  • +
  • 一方为对象,应用AEC-5OTP-3OTP-注-2,表达式变为'[object Object]' == 0
  • +
  • 一方为number,应用AEC-3,表达式变为NaN == 0
  • +
  • 二者同为number类型,应用SEC-4.1,返回false
  • +
+

题 4

+
{}==![]    //Uncaught SyntaxError: Unexpected token ==
+

分析:

+
    +
  • 浏览器会将{}部分解析为代码块,表达式等效为==![],因此报错
  • +
  • 如果将表达式修改为({}) == ![],浏览器将能正确解析,分析过程及结果同题3
  • +
+

题 5

+
![] == {}; //false
+

分析:

+
    +
  • !逻辑非运算符先计算,表达式变为false == {}
  • +
  • 剩余分析步骤同题3,表达式返回false
  • +
+

题 6

+
[] == !{}; //true
+

分析:

+
    +
  • !逻辑非运算符先计算,表达式变为[] == false
  • +
  • 剩余分析步骤同题2,返回true
  • +
+

题 7

+
undefined == null; //true
+

分析:

+
    +
  • 类型不同,应用AEC-2,返回true
  • +
\ No newline at end of file diff --git "a/Blog/\347\247\273\345\212\250\347\253\257\347\275\221\351\241\265\350\260\203\350\257\225\346\212\200\345\267\247/index.html" "b/Blog/\347\247\273\345\212\250\347\253\257\347\275\221\351\241\265\350\260\203\350\257\225\346\212\200\345\267\247/index.html" new file mode 100644 index 0000000..3807ae7 --- /dev/null +++ "b/Blog/\347\247\273\345\212\250\347\253\257\347\275\221\351\241\265\350\260\203\350\257\225\346\212\200\345\267\247/index.html" @@ -0,0 +1,230 @@ +移动端网页调试技巧 | Welcome to Alex's Midway

移动端网页调试技巧

September 08, 2019


写在前面

+

这是4个月前的一篇工作记录,是上一篇Charles使用的扩展版。

+

因为平时用Mac,所以只列出了Mac调试不同移动端的情况,windows没有涉及。

+

在Mac下调试App常用3种手段:

+
    +
  1. USB调试
  2. +
  3. 使用腾讯开源的vConsole
  4. +
  5. 使用Charles调试
  6. +
+

USB调试

+

iOS USB调试

+

功能强大,可以修改网页元素,但有限制挺多的:

+
    +
  1. 只能在Mac系统调试移动端,windows的开发环境就不行了
  2. +
  3. 要么调试浏览器打开的网页,要么是Xcode编译运行中的App内页,非编译版的App内页无法调试
  4. +
+

如果以上条件满足的话,那么可以按以下步骤开启调试:

+
    +
  1. USB连接手机,手机弹出的对话框选择信任当前电脑
  2. +
  3. 在Mac上打开Safari,找到 Develop(或“开发”)->your iphone(即用户给手机取的名字),就能看到当前可调试的网页,任选一个打开就能在Safari中调试当前网页
  4. +
+

可以直接修改/插入DOM元素,也可以改样式,和直接调试网页一摸一样,所见即得,简直可以说是为所欲为

+

Android USB调试

+

Android调试也有一些限制条件:

+
    +
  1. Android版本在4.4以上,手机要打开USB调试模式,电脑端必须使用chrome浏览器
  2. +
  3. 要么调试手机端浏览器打开的网页,要么调试开启了webview调试模式的App内页(WebView.setWebContentsDebuggingEnabled设为true,也就是测试版的App)
  4. +
+

可以按以下步骤开启调试:

+
    +
  1. 手机切换为开发者模式(不同手机开启方式差异太大,不细说了)
  2. +
  3. 按照此链接内容完成后续配置:google官方文档: remote debugging
  4. +
+

之后就可以打开浏览器愉快的调试了,happy debugging~

+

小结

+ + + + + + + + + + + + + + + + + + + + + + + +
平台要求适用情景是否需要修改代码
iOS只能在MacOS桌面端调试Safari网页
Xcode编译运行的App内页,不可用于真机App内页
AndroidAndroid 4.4以上
手机打开USB调试模式
使用Chrome浏览器调试
Chrome网页
测试版App内页(WebView.setWebContentsDebuggingEnabled设为true)
+

+

vConsole调试

+

vConsole是腾讯开源调试工具,使用需要修改代码,有一定的侵入性。但是这个代价换来了所有平台的调试能力,在上面2种USB调试条件不满足的情况下,还是很值得使用的。

+

事实上,因为大多数情况并不需要USB调试那种修改DOM的能力,目前我在需要调试App内页的时候,用的最多的就是vConsole。查看内嵌页的console输出和api接口返回都很省事,而且通过后端渲染也能控制只在测试环境使用vConsole,对线上环境没有任何影响。

+

多数情况下,我觉得它是首要的调试手段。

+

小结

+ + + + + + + + + + + + + + + + + + + + + + + +
平台要求适用情景是否需要修改代码
iOS各种浏览器网页
App内页
Android各种浏览器网页
App内页
+

+

Charles调试

+

前一篇谈到了:使用Charles抓包移动端网络请求

+

接口请求、文件下载请求都可以通过抓包查看,但Charles能做的还不止于此。

+

打开Charles->Tools,如下图,红框中的3个工具算是Charles的高级功能了

+

+ + + web debugging + +

+

Map Local - 映射到本地文件

+

可以配置代理,将特定链接的访问指向本地文件(夹),将本地文件转发回移动端

+

使用场景:

+
    +
  1. mock接口返回数据:把按照协议规定的数据保存为json文件,在请求接口地址时,返回这个json文件,就可以当作接口的数据返回
  2. +
  3. 替换文件,查看模拟展示效果:比如某个页面开发完成但还没有发布,又想看线上的数据展示效果,就可以把对那个页面的请求重定向会本地修改完毕的文件,这样就可以实现用线上数据加载未发布的文件的效果
  4. +
+

Rewrite - 改写接口返回数据

+

配置代理,可以针对特定的接口修改其返回数据,可以修改返回数据本身、cookie、请求头等等

+

使用场景:mock接口

+

Map Remote - 映射到远程代理

+

其实就是重定向,通过配置代理,将对指定URL的请求重定向到配置的另一个远程地址

+

使用场景:这个功能没用过,感觉如果用起来和map local的第二种场景差不多

+

小结

+ + + + + + + + + + + + + + + + + + + + + +
调试功能使用场景
映射到本地文件mock接口
替换文件,查看模拟展示效果
改写接口返回数据mock接口
映射到远程代理替换文件,查看模拟展示效果
\ No newline at end of file diff --git "a/Blog/\350\207\252\345\267\261\345\256\236\347\216\260Promise/index.html" "b/Blog/\350\207\252\345\267\261\345\256\236\347\216\260Promise/index.html" new file mode 100644 index 0000000..40b7591 --- /dev/null +++ "b/Blog/\350\207\252\345\267\261\345\256\236\347\216\260Promise/index.html" @@ -0,0 +1,73 @@ +自己实现Promise | Welcome to Alex's Midway \ No newline at end of file diff --git "a/Blog/\350\257\221-\345\206\231\347\273\231\346\201\220\351\276\231\347\232\204\347\216\260\344\273\243Javascript\346\214\207\345\215\227/index.html" "b/Blog/\350\257\221-\345\206\231\347\273\231\346\201\220\351\276\231\347\232\204\347\216\260\344\273\243Javascript\346\214\207\345\215\227/index.html" new file mode 100644 index 0000000..705afee --- /dev/null +++ "b/Blog/\350\257\221-\345\206\231\347\273\231\346\201\220\351\276\231\347\232\204\347\216\260\344\273\243Javascript\346\214\207\345\215\227/index.html" @@ -0,0 +1,378 @@ +[译]写给恐龙的现代Javascript指南 | Welcome to Alex's Midway

[译]写给恐龙的现代Javascript指南

December 08, 2018


写在前面:这是一篇译文,是原作者系列文章的第一篇,第二篇主题是 CSS , 第三篇是 HTML。

+
+

作者:Peter Jang
+原文名:Modern JavaScript Explained For Dinosaurs
+原文于 2017 年 10 月 19 日发表于 medium

+
+ +

写给恐龙的现代 JavaScript 指南

+

+Images from Dinosaur Comics by Ryan North

+

如果没有一直关注的话,学习现代 JavaScript 并非易事。它的语言生态发展和变化太快,甚至让人难以理解不同工具期望解决的问题。我从 1998 年就开始编程了,但直到 2014 年才开始认真学习 JavaScript。我还记得当时偶然看到Browserify,它的标语是

+
+

"Browserify 负责打包所有依赖,实现在浏览器中引入各种模块"

+
+

我完全不懂这句话什么意思,还在拼命想这东西对开发者有什么用。

+

本文会介绍 JavaScript 发展的历史背景,说明 JavaScript 工具是怎样发展到 2017 年现在这种状态的。我们会从头开始,只用 HTML 和 JavaScript 开发一个示例网站。然后逐步引入各种不同工具,逐个说明每个工具试图解决的问题。当了解历史轨迹之后,你会更好的学习并适应未来不断变化的 JavaScript 生态。开始吧!

+

传统 JavaScript 方式

+

我们先从只含 HTML 和 JavaScript 的传统网站开始,它需要手动下载和链接文件。下面是一个链接到 JS 文件的简单的index.html文件:

+
<!-- index.html -->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>JavaScript Example</title>
+    <script src="index.js"></script>
+  </head>
+  <body>
+    <h1>Hello from HTML!</h1>
+  </body>
+</html>
+

<script src="index.js"></script>这一行引用了同文件夹内的另一个 JavaScript 文件,名为index.js

+
// index.js
+console.log('Hello from JavaScript!');
+

这就是一个网站了!现在假设你想导入别人写的库,比如说moment.js(它把时间格式化为可读形式)。 假设你可以像下面这样使用moment

+
moment()
+  .startOf('day')
+  .fromNow(); // 20 hours ago
+

但你首先得在网站里引入 moment.js。在 moment.js 首页上能看到以下说明:

+

+

右侧Install这一栏里有很多内容。暂时先忽略,我们可以下载moment.min.js文件到网站文件夹里,并在index.html里引用它。

+
<!-- index.html -->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>Example</title>
+    <link rel="stylesheet" href="index.css" />
+    <script src="moment.min.js"></script>
+    <script src="index.js"></script>
+  </head>
+  <body>
+    <h1>Hello from HTML!</h1>
+  </body>
+</html>
+

注意moment.min.jsindex.js先加载,这样你就可以在index.js里使用moment函数:

+
// index.js
+console.log('Hello from JavaScript!');
+console.log(
+  moment()
+    .startOf('day')
+    .fromNow()
+);
+

这就是使用 JS 库开发网站的方式!好处是非常容易理解。不足在于每次库更新都要下载它的新版本,这很繁琐。

+

使用 JavaScript 包管理器(npm)

+

2010 年开始,一批互相竞争的 JavaScript 包管理器出现,通过从中心仓库下载和更新库实现了这个过程的自动化。Bower可以说是 2013 年最受欢迎的包管理器,但最终在 2015 年左右被npm取代。(2016 年下半年,yarn作为 npm 的替代品吸引了大量关注,但本质上它仍然使用 npm 包管理技术)
+说明一下,npm 起初只是node.js的专用包管理器。node 运行在服务端,不是前端。前端的包管理器选择运行在服务器端的库,有点不正常啊。

+
+

注:使用包管理器需要掌握命令行,过去的前端开发中并没有这个要求。如果你从来没用过,可以从这个入门指南开始。总而言之,掌握命令行是现代 JavaScript 中一项重要内容(命令行也让其它领域的开发成为可能)。

+
+

看一下如何使用 npm 自动安装 moment.js。如果你已经安装了 node.js,你就有了 npm。你就可以通过命令行访问index.html的文件夹并输入:

+
$ npm init
+

之后会弹出一系列问题(直接选默认就行,一直点回车),并生成package.json文件。这是 npm 用来保存项目信息的配置文件。默认选项的package.json的内容如下:

+
{
+  "name": "your-project-name",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC"
+}
+

我们现在可以按照 moment.js 主页的说明安装了,命令行输入下面这条命令:

+
$ npm install moment --save
+

这条命令做了 2 件事情:一,它下载 moment.js 的所有代码,并保存在node_modules文件夹里。二,它自动修改package.json文件,把 moment.js 作为项目依赖。

+
{
+  "name": "modern-javascript-example",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {    "moment": "^2.22.2"  }}
+

这在后面与他人共享项目时很有用——不再共享node_modules文件夹(这个文件夹可能很大),只需要共享package.json文件,其他人就能通过npm install自动安装需要的包。

+

我们再也不用手动下载 moment.js 了,可以使用 npm 自动下载和更新。打开node_modules文件夹,可以看到moment.min.js文件出现在node_modules/moment/min文件夹。这样就可以在index.html中链接下载好的moment.min.js版本:

+
<!-- index.html -->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>JavaScript Example</title>
+    <script src="node_modules/moment/min/moment.min.js"></script>    <script src="index.js"></script>
+  </head>
+  <body>
+    <h1>Hello from HTML!</h1>
+  </body>
+</html>
+

优点是我们现在可以通过命令行使用 npm 下载和更新包。不足是现在得从node_modules里找到每个包的路径并手动添加到 HTML 中。太麻烦了,下面会谈到怎么让这个过程也实现自动化。

+

+

使用 JavaScript 模块打包工具(webpack)

+

大多数编程语言支持将一个文件的代码导入到另一个文件。JavaScript 开始并没有这个功能,因为 JavaScript 开始只在浏览器运行,没有访问客户端电脑文件系统的权限(因为安全原因)。所以一直以来,组织多文件的 JavaScript 代码需要将各文件变量作为全局导入。

+

我们在上面 moment.js 例子里也是这么做的——HTML 加载整个moment.min.js文件,定义了一个全局变量moment,这样后加载的文件都可以访问它(不管他们是否需要访问这个变量)

+

2009 年,名为 CommonJS 的项目启动了。它旨在规范浏览器端以外的 JavaScript 生态。CommonJS 的大部分内容是关于模块的标准,它让 JavaScript 像其他编程语言一样,最终实现了跨文件导入和导出代码的功能,结束了依赖全局变量的时代。CommonJS 标准最广为人知的实现是 node.js 。

+

+

之前提过,node.js 是在服务端运行的 JavaScript。之前的例子用 node.js 模块表示的话,是这样的。HTML 不再通过 script 标签加载moment.min.js,而是直接在 JavaScript 文件中导入:

+
// index.js
+var moment = require('moment');
+
+console.log('Hello from JavaScript!');
+console.log(
+  moment()
+    .startOf('day')
+    .fromNow()
+);
+

这是 node.js 里加载模块的方式。它在 node.js 中一切正常,因为 node 是服务端语言,能够访问计算机文件系统。node.js 也知道每个 npm 模块的路径,因此只需要使用require('moment')语句,而不再需要require('./node_modules/moment/min/moment.min.js)(译注:即指明模块具体路径)——非常好。

+

但这也只在 node.js 里行的通了,如果你在浏览器里使用这种方式,得到的只是“require未定义”的错误。浏览器没有访问文件系统的权限,因此通过这种方式加载模块非常困难——文件加载只能动态完成,要么是同步的(这会降低执行速度),要么是异步的(会出现时间不一致的问题)。

+

于是模块打包工具应运而生。JavaScript 模块打包工具通过构建过程(过程中有文件访问权限)绕开了这个问题,它输出一个兼容浏览器的最终文件(即不需要访问文件系统)。这样就需要打包工具找到所有浏览器不兼容的require语句,将其替换成依赖文件的真实内容。最终输出是单个打包好的 JavaScript 文件(并且没有 require 语句)!

+

曾经最流行的打包工具是Browserify,它在 2011 年发布,首先在前端支持 node.js 格式的 require 语句(这最终成就了 npm,让它成了前端包管理器)。2015 年左右,webpack后来居上,成为最广泛使用的打包工具(前端框架 React 的普及推动了这一过程,因为 React 充分利用了 webpack 的各种特性)。

+

看看 webpack 怎么让前面require('moment')这个例子实现兼容浏览器的。首先需要在项目中安装 webpack。webpack 自身就是一个 npm 包,可以通过命令行安装:

+
$ npm install webpack webpack-cli --save-dev
+

注意安装的是 2 个包——webpack 和 webpack-cli(后者支持通过命令行使用 webpack)。再看 --save-dev参数——这个参数表示将安装包作为开发依赖保存,意思是安装包在开发环境中使用,但不会部署在生产服务器上。可以在package.json文件中看到,文件会自动更新:

+
{
+  "name": "modern-javascript-example",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "moment": "^2.19.1"
+  },
+  "devDependencies": {    "webpack": "^4.17.1",    "webpack-cli": "^3.1.0"  }}
+

现在node_modules文件夹里安装好了 webpack 和 webpack-cli 包。你可以在命令行里使用 webpack-cli:

+
$ ./node_modules/.bin/webpack index.js --mode=development
+

这条命令将会运行安装好的 webpack,从index.js文件开始,搜索全部require语句,将它替换为合适的代码,最终创建单个输出文件(默认路径是dist/main.js)。--mode=development参数让 JavaScript 代码保持可读性,而--mode=production参数则会输出(不可读的)最小化的文件。

+

得到 webpack 的dist/main.js输出文件后,我们就可以在浏览器中用它取代index.js,因为后者还包含非法的 require 语句。这个过程也能在index.html文件中体现:

+
<!-- index.html -->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <title>JavaScript Example</title>
+    <script src="dist/main.js"></script>  </head>
+  <body>
+    <h1>Hello from HTML!</h1>
+  </body>
+</html>
+

刷新浏览器就能发现现在和之前一样了!

+

注意每次更改index.js,我们都需要运行 webpack 命令。这样很繁琐,并且在使用 webpack 高级功能时会变得更糟(比如从转换后的代码中生成source map辅助调试初始代码)。webpack 可以从项目根目录的配置文件中读取配置,配置文件名为webpack.config.js,在本文的例子是这样的:

+
// webpack.config.js
+module.exports = {
+  mode: 'development',
+  entry: './index.js',
+  output: {
+    filename: 'main.js',
+    publicPath: 'dist',
+  },
+};
+

现在每次修改index.js时,可以哦那个过下面这条命令运行 webpack:

+
$ ./node_modules/.bin/webpack
+

我们不再需要指定index.js--mode=development设置了,因为 webpack 会从webpack.config.js加载这些配置。现在好些了,但仍显得繁琐,每次修改代码还是需要输入这串命令——下面会让这个过程更简单一些。

+

总之,上面这些步骤看起来并不多,但这种流程有巨大的优势。我们不再需要以全局变量的形式加载外部文件了。不必在 HTML 文件里增加<script>标签了,所有 JavaScript 的新库都能通过 JavaScript 的require语句加载。单一的 JS 打包文件也意味着更好的性能。加入构建过程之后,还可以在工作流中加入其他的强大功能。

+

+

转换代码以支持新语言特性(babel)

+

代码转换是指将一种语言的代码转换为另一种相似语言的代码。这是前端开发的一个重要部分——因为浏览器对新特性的支持进展缓慢,所以新语言的实验性功能得转译为兼容浏览器的语言。

+

对 CSS 来说,现在有SassLessStylus,等等。对 JavaScript 来说,曾经有红极一时的CoffeScript(大约发布于 2010 年),而现在人们用得最多的则是babelTypeScript。CoffeeScript 这门语言,通过显著改变 JavaScript 来实现优化后者的目的——可选括号,有意义的留白,等等。babel 并不是一个新语言,而是一个转换器,它将所有浏览器尚未支持的新一代 JavaScript 特性(ES2015及之后的版本)转换为更兼容的 ES5 JavaScript 版本。TypeScript 本质上与新一代 JavaScript 相同,但还支持可选的静态类型。很多人选择使用 babel,因为它与原生 JavaScript 最相似。

+

看看如何在 webpack 构建过程中使用 babel。首先需要在项目中通过命令行安装 babel(它是个 npm 包):

+
$ npm install @babel/core @babel/preset-env babel-loader --save-dev
+

注意,作为开发依赖,我们安装了 3 个独立的包——@babel/core是 babel 的主题,@babel/preset-env是预设,决定转换 JavaScript 的哪些新特性,而babel-loader是让 babel 能与 webpack 协同的包。可以编辑webpack.config.js来设置 webpack 使用babel-loader,方法如下:

+
// webpack.config.js
+module.exports = {
+  mode: 'development',
+  entry: './index.js',
+  output: {
+    filename: 'main.js',
+    publicPath: 'dist',
+  },
+  module: {    rules: [      {        test: /\.js$/,        exclude: /node_modules/,        use: {          loader: 'babel-loader',          options: {            presets: ['@babel/preset-env'],          },        },      },    ],  },};
+

语法很不清晰(幸好我们不必经常修改)。基本上就是告诉 webpack 查找每个.js 文件(node_modules文件夹里的除外)并使用babel-loader通过@babel/preset-env的预设进行转换。这里有更多关于 webpack 配置的内容。

+

配置好了所有东西,现在可以用 ES2015 的语法写 JavaScript 了!下面是在index.html中使用 ES2015 模板字符串(template string)语法的例子:

+
// index.js
+var moment = require('moment');
+console.log('Hello from JavaScript!');
+console.log(
+  moment()
+    .startOf('day')
+    .fromNow()
+);
+var name = 'Bob',  time = 'today';console.log(`Hello ${name}, how are you ${time}?`);
+

还可以使用ES2015 import语句代替require加载模块,这在目前的代码库中很常见。

+
// index.js
+import moment from 'moment';
+console.log('Hello from JavaScript!');
+console.log(
+  moment()
+    .startOf('day')
+    .fromNow()
+);
+var name = 'Bob',
+  time = 'today';
+console.log(`Hello ${name}, how are you ${time}?`);
+

上例中,import语法和require没什么区别,但import在复杂情况下更灵活。修改index.js之后,我们需要通过命令行再运行一次 webpack。

+
$ ./node_modules/.bin/webpack
+

现在浏览器里刷新index.html。在我写这篇文章的时候,大多数现代浏览器已支持 ES2015 的全部特性,所以证实 babel 是否起作用有点难。你可以尝试用老浏览器比如 IE9,或者在bundle.js里搜索转换后的代码:

+
// bundle.js
+// ...
+console.log('Hello ' + name + ', how are you ' + time + '?');
+// ...
+

这段代码可以看到,为了兼容浏览器, babel 把 ES2015 的模板字符串转换为了普通 JavaScript 字符串拼接。可能这个例子没什么大不了的,但代码转换这个功能真的非常强大。比如async/await这种让人激动的 JavaScript 新功能,能够让你写出更好的代码。尽管代码转换有时显得既繁琐又痛苦,但在过去几年中它确实大大改善了 JavaScript 这门语言,因为它让开发者能够在当下测试未来的语言特性。

+

还有一些没提到的内容,马上就完了。如果关注性能,我们应该压缩(minifying)打包后的文件。考虑到已经引入了构建过程,实现这个目标应该不难。我们每次修改代码后,也必须重新运行 webpack 命令行。下一步,我们将关注有哪些工具能够帮助我们。

+

使用任务管理工具(npm scripts)

+

我们已经使用构建过程来处理 JavaScript 模块了,自然也该使用任务管理工具。它能够自动化构建过程中的各个步骤。对前端开发来说,任务包括压缩代码,优化图片,执行测试等等。

+

2013 年,grunt 是最普及的任务管理工具,随后出现了 gulp 。二者都依赖内置了其他命令行工具的插件。现在最受欢迎的工具似乎是 npm 包管理器内置的脚本,它不需要插件,直接调用其他命令行工具。

+

写几个 npm 脚本,方便我们使用 webpack。只需要简单修改package.json文件:

+
{
+  "name": "modern-javascript-example",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "build": "webpack --progress --mode=production",    "watch": "webpack --progress --watch"  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "moment": "^2.22.2"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.0.0",
+    "@babel/preset-env": "^7.0.0",
+    "babel-loader": "^8.0.2",
+    "webpack": "^4.17.1",
+    "webpack-cli": "^3.1.0"
+  }
+}
+

我们增加了 2 个新脚本,buildwatch。执行 build 脚本,可以在命令行输入:

+
$ npm run build
+

这条命令会运行 webpack(使用wepack.config.js的配置),其中--progress参数会显示进度百分比,而--mode=production参数会为生产环境压缩代码。要执行watch脚本:

+
$ npm run watch
+

这条命令使用--watch参数,每次有 JavaScript 文件修改时,就自动重新运行 webpack。开发的福音。

+

注意在package.json中的脚本执行时,不必指定完整路径,因为 node.js 知道每个 npm 模块的路径。太方便了!我们还可以安装 webpack-dev-server 让事情变得更方便,它是一个独立工具,能够创建一个实时加载的 web 服务器。把它作为开发依赖安装,输入以下命令:

+
$ npm install webpack-dev-server --save-dev
+

随后在package.json中添加一条 npm 脚本:

+
{
+  "name": "modern-javascript-example",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "build": "webpack --progress -p",
+    "watch": "webpack --progress --watch",
+    "server": "webpack-dev-server --open"  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "moment": "^2.19.1"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.0.0",
+    "@babel/preset-env": "^7.0.0",
+    "babel-loader": "^8.0.2",
+    "webpack": "^3.7.1",
+    "webpack-dev-server": "^3.1.6"
+  }
+}
+

现在可以通过命令来启动开发服务器了:

+
$ npm run server
+

这条命令默认通过localhost:8080,自动在浏览器打开index.html网站。每次在index.js文件中修改代码,wepack-dev-server 都会重新构建打包文件,并自动刷新浏览器。它能大大节约我们的时间,因为这让我们只关注代码,而不必在浏览器效果与代码之间不断切换。

+

上面的内容只是一点皮毛,关于 webpack 和 webpack-dev-server 还有很多设置(更多内容看这里)。你当然也可以使用 npm 脚本完成其他任务,比如把 Sass 转换为 CSS,压缩图片,执行测试——所有可以通过命令行完成的任务。npm 脚本自身还有一些高级设置和技巧——Kate Hudson这个演讲很不错:

+

+

结语

+

总而言之,这就是现代 JavaScript。我们从只用 HTML 和 JS,到了使用包管理器自动下载第三方包,到使用模块打包工具创建单一脚本文件,再到使用转换器使用未来 JavaScript 特性,最后到使用任务管理工具自动化构建过程的各个步骤。内容很多,对新手尤甚。web 开发曾经是一个对新手友好的领域,主要是因为它易于上手;但现在却让人望而却步,尤其是各种快速变化的工具。

+

但它并没有看起来那么可怕。生态正在稳定,特别是在前端拥抱 node 生态之后。npm 包管理器、node 模块中的 require 和 import 语句、还有任务管理工具 npm 脚本,他们都容易上手并且很少出差错。现在的工作流相比一两年之前已经大大简化了。

+

现在的框架对新手和老手开发者一视同仁,通常自带初始配置工具。Ember 有ember-cli,它对 Angular 的angular-cli产生了极大影响,还有 React 的create-react-app,Vue 的vue-cli等等。这些工具会配置好一个项目的所有依赖——你可以直接开始写代码。但是,这些工具并非奇迹,它们也只是按照一定规则和可用性配置好了全部东西——你可能经常遇到需要额外配置 webpack,babel 的情况。所以理解每个工具的作用仍然至关重要,这正是本文所介绍的内容。

+

现代 JavaScript 时常令人沮丧,因为它还在不停变化和升级。尽管看起来像是在不停的“造轮子”,但 JavaScript 的快速升级确实推动了一系列创新,比如 hot-reloading、real-time linting 和 time-travel debugging 等。开发是一项令人兴奋的工作,希望本文的内容能够帮助你在开发道路上走得更远。 +

\ No newline at end of file diff --git "a/Blog/\350\275\254-\345\246\202\344\275\225\346\234\211\346\225\210\345\234\260\345\206\231\347\256\227\346\263\225\351\242\230/index.html" "b/Blog/\350\275\254-\345\246\202\344\275\225\346\234\211\346\225\210\345\234\260\345\206\231\347\256\227\346\263\225\351\242\230/index.html" new file mode 100644 index 0000000..c22c770 --- /dev/null +++ "b/Blog/\350\275\254-\345\246\202\344\275\225\346\234\211\346\225\210\345\234\260\345\206\231\347\256\227\346\263\225\351\242\230/index.html" @@ -0,0 +1,189 @@ +[转] 如何有效地写算法题 | Welcome to Alex's Midway

[转] 如何有效地写算法题

February 14, 2019


这是一篇转载的文章,来自支付宝技术专家侯振宇
+原文链接

+ +
+

这篇文章最早发在我团队的文档中。我的团队鼓励每个同学都在业余时间多做算法题,特别是新人。个人认为在编程能力的提升上比做 side project 更有用,对职业发展也是如此。当然出于兴趣做的 side project 另当别论。转到这里,希望对各位读者有用。

+

如何有效地写算法题

+

目的

+

持续做算法题的目的仍然是自身能力提升。可以继续细化成三点:

+
    +
  • 保持思维敏捷。非常重要,状态好才能保持对编程的热情。
  • +
  • 对基础的数据结构、查找和排序保持熟练。能解决日常开发中的性能相关问题。
  • +
  • 积累对问题域的探索。只有对问题域有足够的探索,才可能举一反三,迸发灵感。
  • +
+

方法

+

为了更有效地实现上面的目标。推荐用下面的方式来做题:

+

严格使用番茄时钟进行规划

+

在刷题的过程中非常最容易产生挫败感,无法坚持。原因是,长时间的思考导致疲倦,多次积累的疲倦使得自己产生了 抵触记忆。以至于会下意识觉得做题就是 刻苦。 +推荐大家在开始之前看看《意志力》。里面指出 喜好 是会被记忆操控的,如果每次做一件事最后留下的映像都是轻松愉快的,那么人就会越来越喜欢做此事,反之厌恶。所以为了能保持做题的兴趣,务必每次要主动给自己留下好的记忆。 +番茄时钟能够很好地保障不会出现 长时间 的思考,同时也能保障不容易 疲倦。如果你已经能很熟练的使用番茄时钟,请跳过。如果你对番茄时钟的印象仍然只是 20 分钟休息一次。那么请继续阅读。 +番茄时钟有两个重点,一是通过长期的训练,让大脑习惯在一段时间内保持高效。二是通过要求每次在开始前有规划和每次结束后有总结,保障产出。当把这两点应用到做算法的过程中时,应该采取以下的方式:

+

用一个番茄时钟对题目进行彻底的分析

+

目前 leetcode 上的题大致可分为两种类型:

+
    +
  • 对某种复杂规则的彻底解析,很有可能要构造状态机,充分考虑边界情况。
  • +
  • 对某种数据结构及算法的应用。
  • +
  • 对数学概念、遍历、动态规划等的综合应用。
  • +
+

在这个分析过程中首先要大致判断出属于哪一类。在掌握了基本的数据结构和算法后,应该能很好的判断是不是属于前两类。如果判断不出说明需要回头先重新复习基本数据结构。推荐《算法》一书。不要强行刷题。算法书的每种数据结构及算法的大概思路、解决的问题以及相应的时间和空间复杂度了解之后可以再回来。

+

第一种情况

+

例子:https://leetcode.com/problems/valid-number/description/

+

这个番茄时钟内的目标是:

+
    +
  • 理清题目背后解法要用的技术
  • +
  • 充分收集可能涉及到的边界
  • +
+

完成后应该有的总结是:

+
    +
  • 是否理清了要用的技术
  • +
  • 是否有不确定的地方
  • +
  • 收集到的边界是否能覆盖所有情况
  • +
+

如果发现在要用的技术中有不熟悉的地方,应该立即中断,开启另一个番茄时钟进行学习。切忌盲目尝试。当发现有不确定的地方时,重新开启一个番茄时钟,按照当前思路把不确定地方当成一个单独的算法问题进行解决。

+

第二种情况

+

例子:https://leetcode.com/problems/reverse-pairs/

+

这一类题目通常采取遍历的方法一定都能找到解法。重点是找到最优解,因此需要提前有足够的数据结构的知识。数据结构可大致分为链(数组、栈、队列)、树、图。在这三类数据中要分别掌握排序和查找算法。特别是相应的时间复杂度。 +这类题目很好判断,通常题目中会描述了几个数据或者状态的关联的关系,然后需要你找出符合条件的某些数据。那么将题目中的关联关系转换成相应的数据结构,再使用对应算法就够了。要对数据结构的足够熟悉,才能知道如何转化。 +这种情况下番茄时钟的目标是:

+
    +
  • 将问题转化为对相应数据结构的问题。
  • +
+

总结是:

+
    +
  • 需不需要分情况讨论,需要一种数据结构还是多种
  • +
  • 相应数据结构是否能完全覆盖题目问题中的所有情况
  • +
+

第三种情况

+

例子:https://leetcode.com/problems/minimum-window-substring/

+

这一类情况最好用排除法,发现不是第一种或者第二种,那么再往这种情况下考虑。这类题的特点是通常是发散性质,刚看到题目容易有思路,但不太容易找到最优解。这种情况下,也要先判断题目子类型。

+
    +
  • 如果发现题目能从遍历的角度解决问题,那么可以往遍历的优化上去想。例如是否在遍历的时候能够排除掉一些情况。或者通过排序等手段之后,能实现遍历时排除某些情况。
  • +
  • 如果发现题目中存在多种约束关系,然后求某个值,那么可以往数学方程组上去想。
  • +
  • 如果发现问题可以被递归解决,并且能够将递归方式转化成顺序方式,可以往动态规划上去想。
  • +
+

在这种情况下,番茄时钟的目标:

+
    +
  • 判断出题目类型。
  • +
+

总结:

+
    +
  • 是否有其他类型更适合。
  • +
  • 是否需要多种手段结合。
  • +
+

执行时的番茄时钟

+

当分析完之后,建议不要开始写代码,一定要休息片刻。执行阶段是对我们平时写代码状态的一种锻炼,应该非常珍惜。如果一个番茄时钟执行不完,应该拆分成多个。在这段时间中,设定的番茄时钟目标应该是:

+
    +
  • 高效地验证分析阶段的思路 +要实现执行高效,最重要的是养成良好的编码习惯,不要犯小错误。要始终朝着只要想清楚了,一次写好,不要调试的状态要求自己。这里常见的小错误有:
  • +
  • 拼写错误。变量命名要足够清楚,不要用单个字母或者语意不明的单词。
  • +
  • 数组边界未考虑。
  • +
  • 空值未考虑。
  • +
  • 用 Math.ceil 之类函数时未考虑清楚上下界。
  • +
+

调试超过写代码时间 30% 时说明状态非常有问题。在这个阶段的总结是:

+
    +
  • 是否完成了对分析的验证
  • +
  • 编码过程是否足够高效
  • +
+

如果中间发现了分析阶段的错误或者疏漏。应该立即结束编码,休息。并且重新开启分析阶段的时钟。切忌边写边改方案。如果发现编码过程状态不够好,应该加长休息时间,或者干脆结束掉。不要给自己留下低效的映像。将任务留到第二天其实也可以检验自己第一天的思路是否足够系统化,如果是,那么第二天应该能很快的重新找回思路。

+

任一番茄时钟结束时

+

一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。 +在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。经过总结,这样题目才会变成你在此问题域中的积累。 +做好总结,让每道题都有最大的收获。一个月之后自己的状态应该会有很大变化。

+

如何分享

+

在这个仓库中进行解题分享时,建议大家就把自己番茄时钟的执行记录进行分享。最后标准的解法以及思路其实在 discussion 中都有。对他人有用的分享不是结果,而是:

+
    +
  • 你在番茄时钟中是如何规划的,也就是番茄时钟的目标。
  • +
  • 你是如何分析,也就是思路。
  • +
  • 你的结论是什么,或者是你在执行时除了什么问题。
  • +
  • 你所总结出的题目的关键部分。也就是对问题域进行探索的经验。
  • +
+

祝各位成长快乐。

\ No newline at end of file diff --git "a/Blog/\351\203\250\347\275\262node\347\256\241\347\220\206\345\220\216\345\217\260\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\351\227\256\351\242\230/index.html" "b/Blog/\351\203\250\347\275\262node\347\256\241\347\220\206\345\220\216\345\217\260\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\351\227\256\351\242\230/index.html" new file mode 100644 index 0000000..c2de8f6 --- /dev/null +++ "b/Blog/\351\203\250\347\275\262node\347\256\241\347\220\206\345\220\216\345\217\260\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\351\227\256\351\242\230/index.html" @@ -0,0 +1,260 @@ +部署node管理后台遇到的几个问题 | Welcome to Alex's Midway

部署node管理后台遇到的几个问题

October 10, 2019


写在前面

+

核心服务扩容,之前预定分配给node管理后台用的服务器不能用了。

+

不得不重新申请了一台服务器部署,结果部署成功后业务一直运行不起来,花了3天才排查到原因,真是尴尬。

+

这里记录一下,留作备忘。

+

背景信息

+

开始安装又卸载node的操作直接导致了后续业务运行失败,当然这是后话了

+

部署流程: 申请服务器 -> 配置CI和发布系统 -> 服务器安装node10 -> 兼容性考虑卸载node10 -> 安装node7 -> 发布业务

+

问题一: CI打包文件过期,发布失败

+

进入发布系统配置gitlab的发布分支,本以为这样就ok了,结果居然发布失败 - -!

+

查发布日志发现Request failed with status code 404

+

排查过程

+
    +
  1. 查看gitlab-ci,执行正常
  2. +
  3. 重新打包,再次发布,继续报404
  4. +
  5. 下载gitlab-ci的文件,查看内容ok
  6. +
  7. 场外求助大佬,结果大佬查了一下jobs,告诉我因为过期,artifacts被移除了,所以发布失败...
  8. +
+
+

// 菜鸡和大佬的对话

+

大佬: 这个job id对应的artifacts被移除了,应该过期了
+菜鸡: 为什么再次打包生成了artifacts,发布还是失败呢?明明可以从gitlab里下载到最新打包的artifacts
+大佬: 因为gitlab的API不保证多次打包取最新结果,它只是按job id取artifacts
+大佬: 重新提交一次,重新生成一个commit id就可以了
+菜鸡: (似懂非懂)谢谢大佬!

+
+

解决方案

+
    +
  1. 重新提交,刷新commit id,重新ci打包
  2. +
  3. 再次发布成功
  4. +
+

原因分析

+

再次问了大佬之后,终于弄明白了原因。
+gitlab只能通过API下载artifacts,而不是保存在固定文件路径里。所以公司自己弄了一个组件,通过拼接参数获得artifacts的下载地址,规则如下:

+
    +
  1. +

    根据commit ID取最新的Pipeline ID

    +
    +

    API - Get a single commit

    +

    Get a specific commit identified by the commit hash or name of a branch or tag.

    +
    GET /projects/:id/repository/commits/:sha
    +

    返回的字段中的last_pipeline就是最新的pipeline id

    +
    +
  2. +
  3. +

    根据最新的Pipeline ID取第一个成功的Job ID

    +
    +

    API - List pipeline jobs

    +

    Get a list of jobs for a pipeline.

    +
    GET /projects/:id/pipelines/:pipeline_id/jobs
    +

    返回一个数组,根据status字段过滤掉执行失败Jobs,然后再取response[0]就是第一个成功的Job

    +
    +
  4. +
  5. +

    根据Job ID下载对应的artifacts

    +
    +

    API - Download a single artifact file by job ID

    +

    Download a single artifact file from a job with a specified ID from within the job’s artifacts zipped archive. The file is extracted from the archive and streamed to the client.

    +
    GET /projects/:id/jobs/:job_id/artifacts/*artifact_path
    +

    返回要下载的artifacts文件流

    +
    +
  6. +
+

结论: 当有多次打包的时候,因为pipeline id不会变化,只要之前有成功的jobs生成artifacts,那么按照上面的规则,artifacts下载API就会指向它。当artifacts过期被清除后,自然就无法找到文件了,因此接口状态返回404失败,如下表所示:

+
+

API - Download a single artifact file by job ID 接口返回状态码

+ + + + + + + + + + + + + + + + + + + + + +
StatusDescription
200Sends a single artifact file
400Invalid path provided
404Build not found or no file/artifacts
+
+

问题二:忘记配置线上数据库

+
+

这个实在是有点尴尬,但是部署的时候真的忘记了配置线上数据库

+
+

发布成功后打开线上地址,发现迎接我的是nginx欢迎页,当时就知道完蛋了

+

排查过程

+
    +
  1. 登陆服务器,pm2 list,发现所有node进程状态都是errored
  2. +
  3. pm2 show app_name,查pm2的out和error日志
  4. +
  5. 发现error log里一堆 Cannot read property 'models' of undefined
  6. +
  7. 然后排查数据库相关的所有文件,发现没配置线上数据库- -
  8. +
  9. 因为数据库没配置,数据库对象为undefined,然后脚本自动生成的数据库表对象统统变成了 property of undefined,自然无法运行。
  10. +
+

解决方案

+

配置好线上数据库,然后再次发布,错误消失,终于看到业务界面了

+

问题三:多个PM2守护进程互相干扰

+

进入业务界面后,发现首页列表接口一直报错,提示api request error. Request failed with status code 403

+

403显然是没有权限,这个错误消息看的我一脸懵逼...

+

排查过程

+
    +
  1. +

    错误消息显然不是我包装的,那只能来自其他地方

    +

    因为列表请求分为2个步骤,第一步取数据库数据,第二步请求接口服务的数据,所以最可能的地方有2个:一是数据库请求报错了;二是列表接口调用的公司接口服务报错了

    +
  2. +
  3. +

    排查数据库错误

    +

    进一步试验发现不仅列表接口报错,新建接口也报了同样的错误。

    +
      +
    • 难以确定是否是数据库错误的情况下,查了数据库的数据,发现尽管新建接口报错,但是新建的数据都已经写入了数据库,似乎与数据库没关系
    • +
    • 登陆服务器,继续排查列表接口,数据库请求操作那里打印数据,重启业务应用pm2 restart app_name,再次请求后查看日志,发现数据库请求能正常返回数据,基本排除数据库错误
    • +
    +
  4. +
  5. +

    排查接口服务错误

    +

    既然数据库错误可以排除,那么自然开始排查接口服务错误

    +
      +
    • 在接口服务请求前后打印日志,做个标记,看看是否请求会报错,以及如果请求成功会返回什么数据
    • +
    • 重启业务应用,再次请求接口后查看日志,发现日志只有接口服务请求前的输出,然后就报错了
    • +
    • 基本上可以确定是请求接口服务导致的错误
    • +
    +
  6. +
  7. +

    接口服务大佬帮忙看日志

    +

    到这一步我已经没什么办法了,只能跪求负责接口服务的大佬帮我看一下他那边的日志。

    +
    +

    这个接口服务是需要授权的,线上和测试环境都有独立的授权key,通过key+请求时间,应该就可以找到原因

    +
    +

    结果接口服务的日志里根本没有业务应用的任何请求,我当时的内心是崩溃的...

    +
      +
    • 大佬继续帮忙排查授权key,没发现问题
    • +
    • 排查接口服务初始化的代码,没发现问题
    • +
    • 排查传入接口服务的参数,没发现问题
    • +
    • 大佬上服务器直接用node调用代码请求接口服务,居然好了,可以获取数据,同时接口服务的日志也记录到了这个请求
    • +
    +

    到这里,接口服务肯定是正常的,我的代码应该也是正常的,基本上只能是业务应用部署环境的原因了

    +
  8. +
  9. +

    停止pm2,裸跑node

    +

    考虑到大佬直接用node调用代码请求是成功的,我也照猫画虎,先停掉所有pm2的服务pm2 stop app_name,然后用node启动业务应用NODE_ENV=production node app_server.js

    +

    见证奇迹的时刻到了,这样启动的业务完全正常,没有报任何错误,那么可以肯定问题来自于pm2了,下面继续排查

    +
  10. +
  11. +

    起动单进程pm2

    +

    为了排除pm2多进程间互相影响的可能性,我修改了pm2生产环境的配置文件,把它的进程数限制为1。

    +

    然后就是套路操作,为了避免缓存影响,先停止服务,再删除当前应用,最后重新启动应用。

    +

    访问应用页面,依然报错...我又崩溃了

    +

    不过这一步再次确认了pm2就是问题根源,继续排查

    +
  12. +
  13. +

    终于排查到错误

    +

    经过大佬提示,查看了pm2相关的所有进程ps aux | grep pm2,发现居然有2个pm2 God Daemon守护进程

    +

    大佬说很有可能问题就在这里了。

    +
  14. +
+

解决方案

+

杀掉多余的pm2 God Daemon守护进程,重启pm2服务,再次访问,终于不报错了...

+

原因分析

+

都是最开始安装再卸载node10的锅。

+

咨询了运维大佬,告诉我服务器安装node的时候会安装nodejs,pm2和pm2-logrotate日志切片服务,卸载的时候会直接卸载nodejs服务,同时删除pm2的目录,但好像不会杀掉pm2的进程

+

所以安装node7的时候,前一个pm2的进程还在运行,安装完成后2个pm2进程互相干扰。细节就不清楚了,反正对接口服务的请求在这样的情况下根本就没发出去。哎...

+

总耗时:断断续续花了3天

+

反馈运维:bug重现试验

+

为了得到确切的结论:

+
- 服务器卸载时是否会杀掉pm2进程
+- 遗漏杀掉前一个pm2进程,而直接安装新的node是否导致了问题三的bug
+

和运维大佬沟通了一下,决定试试能否重现bug,这样运维大佬可以有针对性的更改部署脚本,避免下次还有人跟我踩一样的坑。

+

一共做了2次试验,第一次是为了复现bug,第二次是为了排除bug,确定具体bug源究竟在哪里。

+
    +
  1. 第一次:复原bug过程
  2. +
  3. 准备工作:停止pm2服务,杀掉所有pm2关联进程,卸载node及相关组件服务
  4. +
  5. 恢复初始状态:安装node10 -> 卸载node10 -> 手动安装node7失败 -> 运维人工介入 -> 发布业务
  6. +
  7. bug复现
  8. +
  9. 第二次:每次安装卸载都杀掉进程,观察是否bug复现
  10. +
  11. 准备工作: 在第一次的基础上,停止pm2服务,杀掉所有pm2关联进程,卸载node及相关组件服务
  12. +
  13. 安装node10
  14. +
  15. 停止所有pm2相关服务,杀掉pm2关联进程,卸载node10
  16. +
  17. 安装node7,自动安装失败,运维人工介入
  18. +
  19. 发布业务
  20. +
  21. bug消失
  22. +
\ No newline at end of file diff --git "a/Blog/\351\205\215\347\275\256Nginx\345\222\214WebpackDevServer\346\224\257\346\214\201\345\274\200\345\217\221\347\216\257\345\242\203\347\203\255\346\233\264\346\226\260\345\222\214https\345\237\237\345\220\215\350\256\277\351\227\256/index.html" "b/Blog/\351\205\215\347\275\256Nginx\345\222\214WebpackDevServer\346\224\257\346\214\201\345\274\200\345\217\221\347\216\257\345\242\203\347\203\255\346\233\264\346\226\260\345\222\214https\345\237\237\345\220\215\350\256\277\351\227\256/index.html" new file mode 100644 index 0000000..23bdc9d --- /dev/null +++ "b/Blog/\351\205\215\347\275\256Nginx\345\222\214WebpackDevServer\346\224\257\346\214\201\345\274\200\345\217\221\347\216\257\345\242\203\347\203\255\346\233\264\346\226\260\345\222\214https\345\237\237\345\220\215\350\256\277\351\227\256/index.html" @@ -0,0 +1,199 @@ +配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问 | Welcome to Alex's Midway

配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问

January 07, 2020


开始之前,先推荐一个工具网站

+
+

用于测试配置文件中location匹配,感觉很方便

+

Nginx location match tester: https://nginx.viraptor.info/

+
+

背景

+

node接入层+前端,新老业务共用域名

+

新业务通过地址前缀来区分请求

+

问题

+

经过配置生产环境下可以正常访问,但:

+
    +
  1. 开发模式下无法从webpack-dev-server获取静态资源
  2. +
  3. 无法实现dev-server热更新
  4. +
+

原因

+

通过域名访问时,Nginx把新对应的业务请求转发给node

+
    +
  1. 因为开发模式下静态资源保存在webpack-dev-server里,其端口号与node监听端口不同,所以node无法找到静态资源,表现为资源请求失败
  2. +
  3. +

    webpack-dev-server热更新是基于websocket实现的,但是:

    +
      +
    • 请求的域名不同,Nginx无法响应
    • +
    • Nginx不能响应websocket请求,也无法响应
    • +
    +
  4. +
+

解决方案

+
    +
  1. 开发模式下静态资源请求反向代理到webpack-dev-server
  2. +
  3. 开发模式下修改webpack配置,使其热更新websocket请求域名与业务域名相同
  4. +
  5. Nginx配置websocket响应规则,反向代理到webpack-dev-server
  6. +
+

具体代码

+
//webpack config 追加配置
+// 静态资源发布配置
+publicPath: DEV ? 'https://www.example.com/dev' : 'https://www.example.com',
+// webpack-dev-server配置
+devServer: {
+	port,
+	host,
+  // Invalid Host/Origin Header
+  disableHostCheck: true,
+  // 修改web socket端口和域名,让nginx可以解析响应
+  sockPort: 443,
+  sockHost: 'www.example.com'
+},
+
server
+{
+    listen 80;
+
+    server_name www.example.com;
+    return  301 https://$host$request_uri;
+}
+server
+{
+    listen 443 ssl;
+    server_name www.example.com;
+    index index.html index.htm index.php;
+    root /path/to/your/project;
+	
+	# ssl             on;
+    ssl_certificate /path/to/your/cert;
+    ssl_certificate_key /path/to/your/key;
+
+    error_log /path/to/your/error/log;
+    access_log /path/to/your/access/log combined;    
+
+
+    if ($host ~* ^example\.com$)
+    {
+        rewrite ^/(.*)$ https://www.$host$request_uri  permanent;
+        break;
+    }
+    
+    #生产环境,node站点静态资源请求转发到node
+    location ^~ /node/assets {
+        proxy_pass http://node_proxy;
+    }
+
+    #开发环境下静态资源反向代理到 Webpack devServer
+    location ^~ /dev {
+        proxy_pass http://webpack_dev_server;
+    }
+		
+    location ~* \.(css|js)$ {
+	    add_header Access-Control-Allow-Credentials  true;
+        add_header Access-Control-Allow-Origin https://www.example.com;
+    }
+
+    
+    ##websocket反向代理,支持dev-server热更新
+    location /sockjs-node {
+        proxy_set_header X-Real-IP  $remote_addr;
+        proxy_set_header X-Forwarded-For $remote_addr;
+        proxy_set_header Host $host;
+        proxy_pass http://webpack_dev_server;
+        proxy_redirect off;
+      	proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";  
+    }
+
+    
+		#node服务
+    location /node {
+        proxy_store off;
+        proxy_redirect off;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-Proto $scheme;
+        proxy_set_header Remote-Host $remote_addr;
+        proxy_set_header X-Nginx-Proxy true;
+        proxy_pass http://node_proxy;
+    }
+}
+upstream node_proxy {
+    server 127.0.0.1:10110;
+}
+#webpack-dev-server服务器地址
+upstream webpack_dev_server {
+   server 127.0.0.1:10100;
+}
+

总结

+

其他方案:webpack-dev-server代理转发到Nginx

+

这样在本地开发时就可以实现https访问+webpack-dev-server热更新了

+

Done

\ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 5169a5e..0000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 gatsbyjs - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/Portfolio/index.html b/Portfolio/index.html new file mode 100644 index 0000000..10b483a --- /dev/null +++ b/Portfolio/index.html @@ -0,0 +1,75 @@ +Portfolio | Welcome to Alex's Midway \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 9912277..0000000 --- a/README.md +++ /dev/null @@ -1,97 +0,0 @@ -

- - Gatsby - -

-

- Gatsby's default starter -

- -Kick off your project with this default boilerplate ([live demo](https://gatsby-starter-default-demo.netlify.com/)). This barebones starter ships with the main Gatsby configuration files you might need. - -_Have another more specific idea? You may want to check out our vibrant collection of [official and community-created starters](https://www.gatsbyjs.org/docs/gatsby-starters/)._ - -## 🚀 Quick start - -1. **Create a Gatsby site.** - - Use the Gatsby CLI to create a new site, specifying the default starter. - - ```sh - # create a new Gatsby site using the default starter - npx gatsby new my-default-starter - ``` - -1. **Start developing.** - - Navigate into your new site’s directory and start it up. - - ```sh - cd my-default-starter/ - gatsby develop - ``` - -1. **Open the source code and start editing!** - - Your site is now running at `http://localhost:8000`! - - *Note: You'll also see a second link: `http://localhost:8000/___graphql`. This is a tool you can use to experiment with querying your data. Learn more about using this tool in the [Gatsby tutorial](https://www.gatsbyjs.org/tutorial/part-five/#introducing-graphiql).* - - Open the `my-default-starter` directory in your code editor of choice and edit `src/pages/index.js`. Save your changes and the browser will update in real time! - -## 🧐 What's inside? - -A quick look at the top-level files and directories you'll see in a Gatsby project. - - . - ├── node_modules - ├── src - ├── .gitignore - ├── .prettierrc - ├── gatsby-browser.js - ├── gatsby-config.js - ├── gatsby-node.js - ├── gatsby-ssr.js - ├── LICENSE - ├── package-lock.json - ├── package.json - ├── README.md - └── yarn.lock - - 1. **`/node_modules`**: This directory contains all of the modules of code that your project depends on (npm packages) are automatically installed. - - 2. **`/src`**: This directory will contain all of the code related to what you will see on the front-end of your site (what you see in the browser) such as your site header or a page template. `src` is a convention for “source code”. - - 3. **`.gitignore`**: This file tells git which files it should not track / not maintain a version history for. - - 4. **`.prettierrc`**: This is a configuration file for [Prettier](https://prettier.io/). Prettier is a tool to help keep the formatting of your code consistent. - - 5. **`gatsby-browser.js`**: This file is where Gatsby expects to find any usage of the [Gatsby browser APIs](https://www.gatsbyjs.org/docs/browser-apis/) (if any). These allow customization/extension of default Gatsby settings affecting the browser. - - 6. **`gatsby-config.js`**: This is the main configuration file for a Gatsby site. This is where you can specify information about your site (metadata) like the site title and description, which Gatsby plugins you’d like to include, etc. (Check out the [config docs](https://www.gatsbyjs.org/docs/gatsby-config/) for more detail). - - 7. **`gatsby-node.js`**: This file is where Gatsby expects to find any usage of the [Gatsby Node APIs](https://www.gatsbyjs.org/docs/node-apis/) (if any). These allow customization/extension of default Gatsby settings affecting pieces of the site build process. - - 8. **`gatsby-ssr.js`**: This file is where Gatsby expects to find any usage of the [Gatsby server-side rendering APIs](https://www.gatsbyjs.org/docs/ssr-apis/) (if any). These allow customization of default Gatsby settings affecting server-side rendering. - - 9. **`LICENSE`**: Gatsby is licensed under the MIT license. - - 10. **`package-lock.json`** (See `package.json` below, first). This is an automatically generated file based on the exact versions of your npm dependencies that were installed for your project. **(You won’t change this file directly).** - - 11. **`package.json`**: A manifest file for Node.js projects, which includes things like metadata (the project’s name, author, etc). This manifest is how npm knows which packages to install for your project. - - 12. **`README.md`**: A text file containing useful reference information about your project. - - 13. **`yarn.lock`**: [Yarn](https://yarnpkg.com/) is a package manager alternative to npm. You can use either yarn or npm, though all of the Gatsby docs reference npm. This file serves essentially the same purpose as `package-lock.json`, just for a different package management system. - -## 🎓 Learning Gatsby - -Looking for more guidance? Full documentation for Gatsby lives [on the website](https://www.gatsbyjs.org/). Here are some places to start: - -- **For most developers, we recommend starting with our [in-depth tutorial for creating a site with Gatsby](https://www.gatsbyjs.org/tutorial/).** It starts with zero assumptions about your level of ability and walks through every step of the process. - -- **To dive straight into code samples, head [to our documentation](https://www.gatsbyjs.org/docs/).** In particular, check out the _Guides_, _API Reference_, and _Advanced Tutorials_ sections in the sidebar. - -## 💫 Deploy - -[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/gatsbyjs/gatsby-starter-default) diff --git a/app-94413d7bd23b40a803ee.js b/app-94413d7bd23b40a803ee.js new file mode 100644 index 0000000..45d0fff --- /dev/null +++ b/app-94413d7bd23b40a803ee.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{"+VNo":function(t,e){t.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},"+ZDr":function(t,e,n){"use strict";n("n7j8"),n("OeI1"),n("JHok"),n("sC2a");var r=n("TqRt");e.__esModule=!0,e.withPrefix=d,e.withAssetPrefix=function(t){return[""].concat([t.replace(/^\//,"")]).join("/")},e.navigateTo=e.replace=e.push=e.navigate=e.default=void 0;var o=r(n("8OQS")),i=r(n("pVnL")),a=r(n("PJYZ")),u=r(n("VbXa")),c=r(n("lSNA")),s=r(n("17x9")),l=r(n("q1tI")),f=n("YwZP"),p=n("cu4x");function d(t){return function(t){return t.replace(/\/+/g,"/")}(["",t].join("/"))}e.parsePath=p.parsePath;var h={activeClassName:s.default.string,activeStyle:s.default.object,partiallyActive:s.default.bool},v=function(t){function e(e){var n;n=t.call(this,e)||this,(0,c.default)((0,a.default)(n),"defaultGetProps",(function(t){var e=t.isPartiallyCurrent,r=t.isCurrent;return(n.props.partiallyActive?e:r)?{className:[n.props.className,n.props.activeClassName].filter(Boolean).join(" "),style:(0,i.default)({},n.props.style,{},n.props.activeStyle)}:null}));var r=!1;return"undefined"!=typeof window&&window.IntersectionObserver&&(r=!0),n.state={IOSupported:r},n.handleRef=n.handleRef.bind((0,a.default)(n)),n}(0,u.default)(e,t);var n=e.prototype;return n.componentDidUpdate=function(t,e){this.props.to===t.to||this.state.IOSupported||___loader.enqueue((0,p.parsePath)(this.props.to).pathname)},n.componentDidMount=function(){this.state.IOSupported||___loader.enqueue((0,p.parsePath)(this.props.to).pathname)},n.componentWillUnmount=function(){if(this.io){var t=this.io,e=t.instance,n=t.el;e.unobserve(n),e.disconnect()}},n.handleRef=function(t){var e,n,r,o=this;this.props.innerRef&&this.props.innerRef.hasOwnProperty("current")?this.props.innerRef.current=t:this.props.innerRef&&this.props.innerRef(t),this.state.IOSupported&&t&&(this.io=(e=t,n=function(){___loader.enqueue((0,p.parsePath)(o.props.to).pathname)},(r=new window.IntersectionObserver((function(t){t.forEach((function(t){e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(r.unobserve(e),r.disconnect(),n())}))}))).observe(e),{instance:r,el:e}))},n.render=function(){var t=this,e=this.props,n=e.to,r=e.getProps,a=void 0===r?this.defaultGetProps:r,u=e.onClick,c=e.onMouseEnter,s=(e.activeClassName,e.activeStyle,e.innerRef,e.partiallyActive,e.state),h=e.replace,v=(0,o.default)(e,["to","getProps","onClick","onMouseEnter","activeClassName","activeStyle","innerRef","partiallyActive","state","replace"]);var g=d(n);return l.default.createElement(f.Link,(0,i.default)({to:g,state:s,getProps:a,innerRef:this.handleRef,onMouseEnter:function(t){c&&c(t),___loader.hovering((0,p.parsePath)(n).pathname)},onClick:function(e){return u&&u(e),0!==e.button||t.props.target||e.defaultPrevented||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey||(e.preventDefault(),y(n,{state:s,replace:h})),!0}},v))},e}(l.default.Component);v.propTypes=(0,i.default)({},h,{onClick:s.default.func,to:s.default.string.isRequired,replace:s.default.bool,state:s.default.object});var g=function(t,e,n){return console.warn('The "'+t+'" method is now deprecated and will be removed in Gatsby v'+n+'. Please use "'+e+'" instead.')},m=l.default.forwardRef((function(t,e){return l.default.createElement(v,(0,i.default)({innerRef:e},t))}));e.default=m;var y=function(t,e){window.___navigate(d(t),e)};e.navigate=y;var b=function(t){g("push","navigate",3),window.___push(d(t))};e.push=b;e.replace=function(t){g("replace","navigate",3),window.___replace(d(t))};e.navigateTo=function(t){return g("navigateTo","navigate",3),b(t)}},"+i7v":function(t,e,n){"use strict";var r=n("TqRt");e.__esModule=!0,e.default=function(t,e){var n=(0,o.default)(t);if(void 0===e)return n?"pageXOffset"in n?n.pageXOffset:n.document.documentElement.scrollLeft:t.scrollLeft;n?n.scrollTo(e,"pageYOffset"in n?n.pageYOffset:n.document.documentElement.scrollTop):t.scrollLeft=e};var o=r(n("8Y+z"));t.exports=e.default},"+iOX":function(t,e){t.exports=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e}},"+wZX":function(t,e){t.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},"/+AL":function(t,e,n){var r=n("nONw"),o=n("DFzH"),i=n("U2V1"),a=n("kiRH");t.exports=function(t,e,n,u,c){r(e);var s=o(t),l=i(s),f=a(s.length),p=c?f-1:0,d=c?-1:1;if(n<2)for(;;){if(p in l){u=l[p],p+=d;break}if(p+=d,c?p<0:f<=p)throw TypeError("Reduce of empty array with no initial value")}for(;c?p>=0:f>p;p+=d)p in l&&(u=e(u,l[p],p,s));return u}},"13lr":function(t,e,n){var r=n("qDzq"),o=n("5SQf"),i=n("Ar2q")(!1),a=n("oMtz")("IE_PROTO");t.exports=function(t,e){var n,u=o(t),c=0,s=[];for(n in u)n!=a&&r(u,n)&&s.push(n);for(;e.length>c;)r(u,n=e[c++])&&(~i(s,n)||s.push(n));return s}},"16Xr":function(t,e,n){"use strict";var r=n("nONw"),o=n("BjK0"),i=n("+wZX"),a=[].slice,u={},c=function(t,e,n){if(!(e in u)){for(var r=[],o=0;o0?r:n)(t)}},"1a8y":function(t,e,n){var r=n("BjK0");t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},"1dPr":function(t,e,n){var r=n("P8UN");r(r.S,"Date",{now:function(){return(new Date).getTime()}})},"1fHE":function(t,e,n){"use strict";e.__esModule=!0,e.default=void 0;var r=function(){function t(){}var e=t.prototype;return e.read=function(t,e){var n=this.getStateKey(t,e);try{var r=window.sessionStorage.getItem(n);return JSON.parse(r)}catch(o){return window&&window.___GATSBY_REACT_ROUTER_SCROLL&&window.___GATSBY_REACT_ROUTER_SCROLL[n]?window.___GATSBY_REACT_ROUTER_SCROLL[n]:{}}},e.save=function(t,e,n){var r=this.getStateKey(t,e),o=JSON.stringify(n);try{window.sessionStorage.setItem(r,o)}catch(i){window&&window.___GATSBY_REACT_ROUTER_SCROLL||(window.___GATSBY_REACT_ROUTER_SCROLL={}),window.___GATSBY_REACT_ROUTER_SCROLL[r]=JSON.parse(o)}},e.getStateKey=function(t,e){var n="@@scroll|"+(t.key||t.pathname);return null==e?n:n+"|"+e},t}();e.default=r},"2mBY":function(t,e,n){var r=n("13lr"),o=n("U33C");t.exports=Object.keys||function(t){return r(t,o)}},"3WpW":function(t,e,n){t.exports=n("4dA+")("native-function-to-string",Function.toString)},"444f":function(t,e,n){"use strict";var r=n("TqRt");e.__esModule=!0,e.default=void 0;var o=r(n("PJYZ")),i=r(n("VbXa")),a=r(n("lSNA")),u=r(n("q1tI")),c=r(n("LHMV")),s=r(n("17x9")),l=n("9Xx/"),f=r(n("1fHE")),p={shouldUpdateScroll:s.default.func,children:s.default.element.isRequired,location:s.default.object.isRequired},d={scrollBehavior:s.default.object.isRequired},h=function(t){function e(e,n){var r;return r=t.call(this,e,n)||this,(0,a.default)((0,o.default)(r),"shouldUpdateScroll",(function(t,e){var n=r.props.shouldUpdateScroll;return!n||n.call(r.scrollBehavior,t,e)})),(0,a.default)((0,o.default)(r),"registerElement",(function(t,e,n){r.scrollBehavior.registerElement(t,e,n,r.getRouterProps())})),(0,a.default)((0,o.default)(r),"unregisterElement",(function(t){r.scrollBehavior.unregisterElement(t)})),r.scrollBehavior=new c.default({addTransitionHook:l.globalHistory.listen,stateStorage:new f.default,getCurrentLocation:function(){return r.props.location},shouldUpdateScroll:r.shouldUpdateScroll}),r}(0,i.default)(e,t);var n=e.prototype;return n.getChildContext=function(){return{scrollBehavior:this}},n.componentDidUpdate=function(t){var e=this.props.location;if(e!==t.location){var n={location:t.location};this.scrollBehavior.updateScroll(n,{history:l.globalHistory,location:e})}},n.componentWillUnmount=function(){this.scrollBehavior.stop()},n.getRouterProps=function(){return{location:this.props.location,history:l.globalHistory}},n.render=function(){return u.default.Children.only(this.props.children)},e}(u.default.Component);h.propTypes=p,h.childContextTypes=d;var v=h;e.default=v},"4DPX":function(t,e,n){"use strict";var r=n("emib"),o=n("qDzq"),i=n("QPJK"),a=n("P8UN"),u=n("IYdN"),c=n("N+BI").KEY,s=n("96qb"),l=n("4dA+"),f=n("dSuk"),p=n("UEZ0"),d=n("sOol"),h=n("PjVt"),v=n("ovV4"),g=n("m8CP"),m=n("tuyV"),y=n("1a8y"),b=n("BjK0"),w=n("DFzH"),_=n("5SQf"),S=n("kxs/"),P=n("pSXQ"),x=n("nsRs"),E=n("AfxU"),O=n("Drra"),R=n("lHo0"),j=n("rjfK"),k=n("2mBY"),C=O.f,T=j.f,A=E.f,I=r.Symbol,L=r.JSON,U=L&&L.stringify,N=d("_hidden"),q=d("toPrimitive"),M={}.propertyIsEnumerable,F=l("symbol-registry"),D=l("symbols"),W=l("op-symbols"),H=Object.prototype,B="function"==typeof I&&!!R.f,K=r.QObject,Y=!K||!K.prototype||!K.prototype.findChild,V=i&&s((function(){return 7!=x(T({},"a",{get:function(){return T(this,"a",{value:7}).a}})).a}))?function(t,e,n){var r=C(H,e);r&&delete H[e],T(t,e,n),r&&t!==H&&T(H,e,r)}:T,z=function(t){var e=D[t]=x(I.prototype);return e._k=t,e},G=B&&"symbol"==typeof I.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof I},J=function(t,e,n){return t===H&&J(W,e,n),y(t),e=S(e,!0),y(n),o(D,e)?(n.enumerable?(o(t,N)&&t[N][e]&&(t[N][e]=!1),n=x(n,{enumerable:P(0,!1)})):(o(t,N)||T(t,N,P(1,{})),t[N][e]=!0),V(t,e,n)):T(t,e,n)},Z=function(t,e){y(t);for(var n,r=g(e=_(e)),o=0,i=r.length;i>o;)J(t,n=r[o++],e[n]);return t},Q=function(t){var e=M.call(this,t=S(t,!0));return!(this===H&&o(D,t)&&!o(W,t))&&(!(e||!o(this,t)||!o(D,t)||o(this,N)&&this[N][t])||e)},X=function(t,e){if(t=_(t),e=S(e,!0),t!==H||!o(D,e)||o(W,e)){var n=C(t,e);return!n||!o(D,e)||o(t,N)&&t[N][e]||(n.enumerable=!0),n}},$=function(t){for(var e,n=A(_(t)),r=[],i=0;n.length>i;)o(D,e=n[i++])||e==N||e==c||r.push(e);return r},tt=function(t){for(var e,n=t===H,r=A(n?W:_(t)),i=[],a=0;r.length>a;)!o(D,e=r[a++])||n&&!o(H,e)||i.push(D[e]);return i};B||(u((I=function(){if(this instanceof I)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),e=function(n){this===H&&e.call(W,n),o(this,N)&&o(this[N],t)&&(this[N][t]=!1),V(this,t,P(1,n))};return i&&Y&&V(H,t,{configurable:!0,set:e}),z(t)}).prototype,"toString",(function(){return this._k})),O.f=X,j.f=J,n("chL8").f=E.f=$,n("BnbX").f=Q,R.f=tt,i&&!n("939K")&&u(H,"propertyIsEnumerable",Q,!0),h.f=function(t){return z(d(t))}),a(a.G+a.W+a.F*!B,{Symbol:I});for(var et="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),nt=0;et.length>nt;)d(et[nt++]);for(var rt=k(d.store),ot=0;rt.length>ot;)v(rt[ot++]);a(a.S+a.F*!B,"Symbol",{for:function(t){return o(F,t+="")?F[t]:F[t]=I(t)},keyFor:function(t){if(!G(t))throw TypeError(t+" is not a symbol!");for(var e in F)if(F[e]===t)return e},useSetter:function(){Y=!0},useSimple:function(){Y=!1}}),a(a.S+a.F*!B,"Object",{create:function(t,e){return void 0===e?x(t):Z(x(t),e)},defineProperty:J,defineProperties:Z,getOwnPropertyDescriptor:X,getOwnPropertyNames:$,getOwnPropertySymbols:tt});var it=s((function(){R.f(1)}));a(a.S+a.F*it,"Object",{getOwnPropertySymbols:function(t){return R.f(w(t))}}),L&&a(a.S+a.F*(!B||s((function(){var t=I();return"[null]"!=U([t])||"{}"!=U({a:t})||"{}"!=U(Object(t))}))),"JSON",{stringify:function(t){for(var e,n,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);if(n=e=r[1],(b(e)||void 0!==t)&&!G(t))return m(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!G(e))return e}),r[1]=e,U.apply(L,r)}}),I.prototype[q]||n("8wc8")(I.prototype,q,I.prototype.valueOf),f(I,"Symbol"),f(Math,"Math",!0),f(r.JSON,"JSON",!0)},"4dA+":function(t,e,n){var r=n("Phdo"),o=n("emib"),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n("939K")?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},"5SQf":function(t,e,n){var r=n("U2V1"),o=n("ap2Z");t.exports=function(t){return r(o(t))}},"5yr3":function(t,e,n){"use strict";n("AqHK"),n("sc67"),n("pS08");var r=function(t){return t=t||Object.create(null),{on:function(e,n){(t[e]||(t[e]=[])).push(n)},off:function(e,n){t[e]&&t[e].splice(t[e].indexOf(n)>>>0,1)},emit:function(e,n){(t[e]||[]).slice().map((function(t){t(n)})),(t["*"]||[]).slice().map((function(t){t(e,n)}))}}}();e.a=r},"6MXi":function(t,e,n){"use strict";var r=n("TqRt");e.__esModule=!0,e.onRouteUpdate=e.onRouteUpdateDelayed=e.onClientEntry=void 0;var o=r(n("pVnL")),i=r(n("Mj6V")),a={color:"#29d"};e.onClientEntry=function(t,e){void 0===e&&(e={});var n=(0,o.default)({},a,{},e),r="\n #nprogress {\n pointer-events: none;\n }\n #nprogress .bar {\n background: "+n.color+";\n position: fixed;\n z-index: 1031;\n top: 0;\n left: 0;\n width: 100%;\n height: 2px;\n }\n #nprogress .peg {\n display: block;\n position: absolute;\n right: 0px;\n width: 100px;\n height: 100%;\n box-shadow: 0 0 10px "+n.color+", 0 0 5px "+n.color+";\n opacity: 1.0;\n -webkit-transform: rotate(3deg) translate(0px, -4px);\n -ms-transform: rotate(3deg) translate(0px, -4px);\n transform: rotate(3deg) translate(0px, -4px);\n }\n #nprogress .spinner {\n display: block;\n position: fixed;\n z-index: 1031;\n top: 15px;\n right: 15px;\n }\n #nprogress .spinner-icon {\n width: 18px;\n height: 18px;\n box-sizing: border-box;\n border: solid 2px transparent;\n border-top-color: "+n.color+";\n border-left-color: "+n.color+";\n border-radius: 50%;\n -webkit-animation: nprogress-spinner 400ms linear infinite;\n animation: nprogress-spinner 400ms linear infinite;\n }\n .nprogress-custom-parent {\n overflow: hidden;\n position: relative;\n }\n .nprogress-custom-parent #nprogress .spinner,\n .nprogress-custom-parent #nprogress .bar {\n position: absolute;\n }\n @-webkit-keyframes nprogress-spinner {\n 0% {\n -webkit-transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(360deg);\n }\n }\n @keyframes nprogress-spinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n ",u=document.createElement("style");u.id="nprogress-styles",u.innerHTML=r,document.head.appendChild(u),i.default.configure(n)};e.onRouteUpdateDelayed=function(){i.default.start()};e.onRouteUpdate=function(){i.default.done()}},"6PSD":function(t,e,n){"use strict";var r=n("rjfK").f,o=n("nsRs"),i=n("rj/q"),a=n("ot9L"),u=n("xa9o"),c=n("yde8"),s=n("ZFV6"),l=n("xlXC"),f=n("to/b"),p=n("QPJK"),d=n("N+BI").fastKey,h=n("O1i0"),v=p?"_s":"size",g=function(t,e){var n,r=d(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};t.exports={getConstructor:function(t,e,n,s){var l=t((function(t,r){u(t,l,e,"_i"),t._t=e,t._i=o(null),t._f=void 0,t._l=void 0,t[v]=0,null!=r&&c(r,n,t[s],t)}));return i(l.prototype,{clear:function(){for(var t=h(this,e),n=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];t._f=t._l=void 0,t[v]=0},delete:function(t){var n=h(this,e),r=g(n,t);if(r){var o=r.n,i=r.p;delete n._i[r.i],r.r=!0,i&&(i.n=o),o&&(o.p=i),n._f==r&&(n._f=o),n._l==r&&(n._l=i),n[v]--}return!!r},forEach:function(t){h(this,e);for(var n,r=a(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!g(h(this,e),t)}}),p&&r(l.prototype,"size",{get:function(){return h(this,e)[v]}}),l},def:function(t,e,n){var r,o,i=g(t,e);return i?i.v=n:(t._l=i={i:o=d(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[v]++,"F"!==o&&(t._i[o]=i)),t},getEntry:g,setStrong:function(t,e,n){s(t,e,(function(t,n){this._t=h(t,e),this._k=n,this._l=void 0}),(function(){for(var t=this._k,e=this._l;e&&e.r;)e=e.p;return this._t&&(this._l=e=e?e.n:this._t._f)?l(0,"keys"==t?e.k:"values"==t?e.v:[e.k,e.v]):(this._t=void 0,l(1))}),n?"entries":"values",!n,!0),f(e)}}},"6kNP":function(t,e,n){"use strict";var r,o,i,a,u=n("939K"),c=n("emib"),s=n("ot9L"),l=n("aHWV"),f=n("P8UN"),p=n("BjK0"),d=n("nONw"),h=n("xa9o"),v=n("yde8"),g=n("Ioy3"),m=n("Tgxb").set,y=n("jJtK")(),b=n("WfYH"),w=n("JWvD"),_=n("CL53"),S=n("Vce4"),P=c.TypeError,x=c.process,E=x&&x.versions,O=E&&E.v8||"",R=c.Promise,j="process"==l(x),k=function(){},C=o=b.f,T=!!function(){try{var t=R.resolve(1),e=(t.constructor={})[n("sOol")("species")]=function(t){t(k,k)};return(j||"function"==typeof PromiseRejectionEvent)&&t.then(k)instanceof e&&0!==O.indexOf("6.6")&&-1===_.indexOf("Chrome/66")}catch(r){}}(),A=function(t){var e;return!(!p(t)||"function"!=typeof(e=t.then))&&e},I=function(t,e){if(!t._n){t._n=!0;var n=t._c;y((function(){for(var r=t._v,o=1==t._s,i=0,a=function(e){var n,i,a,u=o?e.ok:e.fail,c=e.resolve,s=e.reject,l=e.domain;try{u?(o||(2==t._h&&N(t),t._h=1),!0===u?n=r:(l&&l.enter(),n=u(r),l&&(l.exit(),a=!0)),n===e.promise?s(P("Promise-chain cycle")):(i=A(n))?i.call(n,c,s):c(n)):s(r)}catch(f){l&&!a&&l.exit(),s(f)}};n.length>i;)a(n[i++]);t._c=[],t._n=!1,e&&!t._h&&L(t)}))}},L=function(t){m.call(c,(function(){var e,n,r,o=t._v,i=U(t);if(i&&(e=w((function(){j?x.emit("unhandledRejection",o,t):(n=c.onunhandledrejection)?n({promise:t,reason:o}):(r=c.console)&&r.error&&r.error("Unhandled promise rejection",o)})),t._h=j||U(t)?2:1),t._a=void 0,i&&e.e)throw e.v}))},U=function(t){return 1!==t._h&&0===(t._a||t._c).length},N=function(t){m.call(c,(function(){var e;j?x.emit("rejectionHandled",t):(e=c.onrejectionhandled)&&e({promise:t,reason:t._v})}))},q=function(t){var e=this;e._d||(e._d=!0,(e=e._w||e)._v=t,e._s=2,e._a||(e._a=e._c.slice()),I(e,!0))},M=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw P("Promise can't be resolved itself");(e=A(t))?y((function(){var r={_w:n,_d:!1};try{e.call(t,s(M,r,1),s(q,r,1))}catch(o){q.call(r,o)}})):(n._v=t,n._s=1,I(n,!1))}catch(r){q.call({_w:n,_d:!1},r)}}};T||(R=function(t){h(this,R,"Promise","_h"),d(t),r.call(this);try{t(s(M,this,1),s(q,this,1))}catch(e){q.call(this,e)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n("rj/q")(R.prototype,{then:function(t,e){var n=C(g(this,R));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=j?x.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&I(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r;this.promise=t,this.resolve=s(M,t,1),this.reject=s(q,t,1)},b.f=C=function(t){return t===R||t===a?new i(t):o(t)}),f(f.G+f.W+f.F*!T,{Promise:R}),n("dSuk")(R,"Promise"),n("to/b")("Promise"),a=n("Phdo").Promise,f(f.S+f.F*!T,"Promise",{reject:function(t){var e=C(this);return(0,e.reject)(t),e.promise}}),f(f.S+f.F*(u||!T),"Promise",{resolve:function(t){return S(u&&this===a?R:this,t)}}),f(f.S+f.F*!(T&&n("vUMq")((function(t){R.all(t).catch(k)}))),"Promise",{all:function(t){var e=this,n=C(e),r=n.resolve,o=n.reject,i=w((function(){var n=[],i=0,a=1;v(t,!1,(function(t){var u=i++,c=!1;n.push(void 0),a++,e.resolve(t).then((function(t){c||(c=!0,n[u]=t,--a||r(n))}),o)})),--a||r(n)}));return i.e&&o(i.v),n.promise},race:function(t){var e=this,n=C(e),r=n.reject,o=w((function(){v(t,!1,(function(t){e.resolve(t).then(n.resolve,r)}))}));return o.e&&r(o.v),n.promise}})},"7hJ6":function(t,e,n){"use strict";var r=n("TqRt"),o=r(n("444f")),i=r(n("IVHb"));e.ScrollContainer=i.default,e.ScrollContext=o.default},"83Ih":function(t,e,n){"use strict";n("AqcI");var r=n("IYdN"),o=n("8wc8"),i=n("96qb"),a=n("ap2Z"),u=n("sOol"),c=n("veur"),s=u("species"),l=!i((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")})),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var p=u(t),d=!i((function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})),h=d?!i((function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[s]=function(){return n}),n[p](""),!e})):void 0;if(!d||!h||"replace"===t&&!l||"split"===t&&!f){var v=/./[p],g=n(a,p,""[t],(function(t,e,n,r,o){return e.exec===c?d&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}})),m=g[0],y=g[1];r(String.prototype,t,m),o(RegExp.prototype,p,2==e?function(t,e){return y.call(t,this,e)}:function(t){return y.call(t,this)})}}},"8OQS":function(t,e){t.exports=function(t,e){if(null==t)return{};var n,r,o={},i=Object.keys(t);for(r=0;r=0||(o[n]=t[n]);return o}},"8Y+z":function(t,e,n){"use strict";e.__esModule=!0,e.default=function(t){return t===t.window?t:9===t.nodeType&&(t.defaultView||t.parentWindow)},t.exports=e.default},"8npG":function(t,e,n){"use strict";var r=n("aHWV"),o={};o[n("sOol")("toStringTag")]="z",o+""!="[object z]"&&n("IYdN")(Object.prototype,"toString",(function(){return"[object "+r(this)+"]"}),!0)},"8wc8":function(t,e,n){var r=n("rjfK"),o=n("pSXQ");t.exports=n("QPJK")?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},"939K":function(t,e){t.exports=!1},"939a":function(t,e,n){var r=n("P8UN"),o=n("Phdo"),i=n("96qb");t.exports=function(t,e){var n=(o.Object||{})[t]||Object[t],a={};a[t]=e(n),r(r.S+r.F*i((function(){n(1)})),"Object",a)}},"94Pd":function(t,e,n){"use strict";var r=n("emib"),o=n("P8UN"),i=n("IYdN"),a=n("rj/q"),u=n("N+BI"),c=n("yde8"),s=n("xa9o"),l=n("BjK0"),f=n("96qb"),p=n("vUMq"),d=n("dSuk"),h=n("TUPI");t.exports=function(t,e,n,v,g,m){var y=r[t],b=y,w=g?"set":"add",_=b&&b.prototype,S={},P=function(t){var e=_[t];i(_,t,"delete"==t||"has"==t?function(t){return!(m&&!l(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!l(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof b&&(m||_.forEach&&!f((function(){(new b).entries().next()})))){var x=new b,E=x[w](m?{}:-0,1)!=x,O=f((function(){x.has(1)})),R=p((function(t){new b(t)})),j=!m&&f((function(){for(var t=new b,e=5;e--;)t[w](e,e);return!t.has(-0)}));R||((b=e((function(e,n){s(e,b,t);var r=h(new y,e,b);return null!=n&&c(n,g,r[w],r),r}))).prototype=_,_.constructor=b),(O||j)&&(P("delete"),P("has"),g&&P("get")),(j||E)&&P(w),m&&_.clear&&delete _.clear}else b=v.getConstructor(e,t,g,w),a(b.prototype,n),u.NEED=!0;return d(b,t),S[t]=b,o(o.G+o.W+o.F*(b!=y),S),m||v.setStrong(b,t,g),b}},"94VI":function(t,e){e.polyfill=function(t){return t}},"96qb":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},"9IMR":function(t,e,n){var r=n("1a8y");t.exports=function(t,e,n,o){try{return o?e(r(n)[0],n[1]):e(n)}catch(a){var i=t.return;throw void 0!==i&&r(i.call(t)),a}}},"9Xx/":function(t,e,n){"use strict";n.r(e),n.d(e,"globalHistory",(function(){return c})),n.d(e,"navigate",(function(){return s})),n.d(e,"createHistory",(function(){return i})),n.d(e,"createMemorySource",(function(){return a}));n("HQhv"),n("sc67"),n("JHok"),n("6kNP"),n("8npG"),n("1dPr"),n("sC2a"),n("OeI1"),n("sPse"),n("E5k/");var r=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},s=c.state,l=c.replace,f=void 0!==l&&l;if("number"==typeof e)t.history.go(e);else{s=r({},s,{key:Date.now()+""});try{a||f?t.history.replaceState(s,null,e):t.history.pushState(s,null,e)}catch(d){t.location[f?"replace":"assign"](e)}}i=o(t),a=!0;var p=new Promise((function(t){return u=t}));return n.forEach((function(t){return t({location:i,action:"PUSH"})})),p}}},a=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",e=t.indexOf("?"),n={pathname:e>-1?t.substr(0,e):t,search:e>-1?t.substr(e):""},r=0,o=[n],i=[null];return{get location(){return o[r]},addEventListener:function(t,e){},removeEventListener:function(t,e){},history:{get entries(){return o},get index(){return r},get state(){return i[r]},pushState:function(t,e,n){var a=n.split("?"),u=a[0],c=a[1],s=void 0===c?"":c;r++,o.push({pathname:u,search:s.length?"?"+s:s}),i.push(t)},replaceState:function(t,e,n){var a=n.split("?"),u=a[0],c=a[1],s=void 0===c?"":c;o[r]={pathname:u,search:s},i[r]=t},go:function(t){var e=r+t;e<0||e>i.length-1||(r=e)}}}},u=!("undefined"==typeof window||!window.document||!window.document.createElement),c=i(u?window:a()),s=c.navigate},"9hXx":function(t,e,n){"use strict";n("TAD1"),n("v9g0"),e.__esModule=!0,e.default=void 0;e.default=function(t,e){if(!Array.isArray(e))return"manifest.webmanifest";var n=e.find((function(e){return t.startsWith(e.start_url)}));return n?"manifest_"+n.lang+".webmanifest":"manifest.webmanifest"}},AfxU:function(t,e,n){var r=n("5SQf"),o=n("chL8").f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?function(t){try{return o(t)}catch(e){return a.slice()}}(t):o(r(t))}},AqHK:function(t,e,n){"use strict";var r=n("P8UN"),o=n("Wadk")(1);r(r.P+r.F*!n("h/qr")([].map,!0),"Array",{map:function(t){return o(this,t,arguments[1])}})},AqcI:function(t,e,n){"use strict";var r=n("veur");n("P8UN")({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},Ar2q:function(t,e,n){var r=n("5SQf"),o=n("kiRH"),i=n("dTG6");t.exports=function(t){return function(e,n,a){var u,c=r(e),s=o(c.length),l=i(a,s);if(t&&n!=n){for(;s>l;)if((u=c[l++])!=u)return!0}else for(;s>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}}},BOnt:function(t,e,n){"use strict";var r=n("TqRt"),o=n("Wbzz"),i=r(n("hqbx"));e.onClientEntry=function(t,e){void 0===e&&(e={}),(0,i.default)(window,e,(function(t){(0,o.navigate)(t)}))}},BjK0:function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},BnbX:function(t,e){e.f={}.propertyIsEnumerable},Bp9Y:function(t,e,n){"use strict";e.__esModule=!0,e.default=void 0;var r=!("undefined"==typeof window||!window.document||!window.document.createElement);e.default=r,t.exports=e.default},BuzY:function(t,e,n){var r=n("m+kh"),o=n("sOol")("iterator"),i=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||i[o]===t)}},"CCE/":function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},CL53:function(t,e,n){var r=n("emib").navigator;t.exports=r&&r.userAgent||""},DFzH:function(t,e,n){var r=n("ap2Z");t.exports=function(t){return Object(r(t))}},"Dq+y":function(t,e,n){"use strict";var r=n("Dq1/"),o=n("xlXC"),i=n("m+kh"),a=n("5SQf");t.exports=n("ZFV6")(Array,"Array",(function(t,e){this._t=a(t),this._i=0,this._k=e}),(function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},"Dq1/":function(t,e,n){var r=n("sOol")("unscopables"),o=Array.prototype;null==o[r]&&n("8wc8")(o,r,{}),t.exports=function(t){o[r][t]=!0}},Drra:function(t,e,n){var r=n("BnbX"),o=n("pSXQ"),i=n("5SQf"),a=n("kxs/"),u=n("qDzq"),c=n("KEMg"),s=Object.getOwnPropertyDescriptor;e.f=n("QPJK")?s:function(t,e){if(t=i(t),e=a(e,!0),c)try{return s(t,e)}catch(n){}if(u(t,e))return o(!r.f.call(t,e),t[e])}},"E5k/":function(t,e,n){var r=n("P8UN");r(r.S+r.F,"Object",{assign:n("k5Iv")})},"EU/P":function(t,e,n){var r=n("P8UN"),o=n("ap2Z"),i=n("96qb"),a=n("+VNo"),u="["+a+"]",c=RegExp("^"+u+u+"*"),s=RegExp(u+u+"*$"),l=function(t,e,n){var o={},u=i((function(){return!!a[t]()||"​…"!="​…"[t]()})),c=o[t]=u?e(f):a[t];n&&(o[n]=c),r(r.P+r.F*u,"String",o)},f=l.trim=function(t,e){return t=String(o(t)),1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(s,"")),t};t.exports=l},Fgx0:function(t,e,n){"use strict";var r=n("rjfK"),o=n("pSXQ");t.exports=function(t,e,n){e in t?r.f(t,e,o(0,n)):t[e]=n}},Ftjc:function(t,e,n){var r=n("BjK0"),o=n("1a8y"),i=function(t,e){if(o(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,r){try{(r=n("ot9L")(Function.call,n("Drra").f(Object.prototype,"__proto__").set,2))(t,[]),e=!(t instanceof Array)}catch(o){e=!0}return function(t,n){return i(t,n),e?t.__proto__=n:r(t,n),t}}({},!1):void 0),check:i}},GddB:function(t,e){},Ggvi:function(t,e,n){var r=n("DFzH"),o=n("2mBY");n("939a")("keys",(function(){return function(t){return o(r(t))}}))},HQhv:function(t,e,n){"use strict";var r=n("mhTz"),o=n("1a8y"),i=n("Ioy3"),a=n("fhoV"),u=n("kiRH"),c=n("YEpu"),s=n("veur"),l=n("96qb"),f=Math.min,p=[].push,d="length",h=!l((function(){RegExp(4294967295,"y")}));n("83Ih")("split",2,(function(t,e,n,l){var v;return v="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[d]||2!="ab".split(/(?:ab)*/)[d]||4!=".".split(/(.?)(.?)/)[d]||".".split(/()()/)[d]>1||"".split(/.?/)[d]?function(t,e){var o=String(this);if(void 0===t&&0===e)return[];if(!r(t))return n.call(o,t,e);for(var i,a,u,c=[],l=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),f=0,h=void 0===e?4294967295:e>>>0,v=new RegExp(t.source,l+"g");(i=s.call(v,o))&&!((a=v.lastIndex)>f&&(c.push(o.slice(f,i.index)),i[d]>1&&i.index=h));)v.lastIndex===i.index&&v.lastIndex++;return f===o[d]?!u&&v.test("")||c.push(""):c.push(o.slice(f)),c[d]>h?c.slice(0,h):c}:"0".split(void 0,0)[d]?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,r){var o=t(this),i=null==n?void 0:n[e];return void 0!==i?i.call(n,o,r):v.call(String(o),n,r)},function(t,e){var r=l(v,t,this,e,v!==n);if(r.done)return r.value;var s=o(t),p=String(this),d=i(s,RegExp),g=s.unicode,m=(s.ignoreCase?"i":"")+(s.multiline?"m":"")+(s.unicode?"u":"")+(h?"y":"g"),y=new d(h?s:"^(?:"+s.source+")",m),b=void 0===e?4294967295:e>>>0;if(0===b)return[];if(0===p.length)return null===c(y,p)?[p]:[];for(var w=0,_=0,S=[];_ does not support changing scrollKey.")},n.componentWillUnmount=function(){this.context.scrollBehavior.unregisterElement(this.scrollKey)},n.render=function(){return this.props.children},e}(u.default.Component);d.propTypes=f,d.contextTypes=p;var h=d;e.default=h},IYdN:function(t,e,n){var r=n("emib"),o=n("8wc8"),i=n("qDzq"),a=n("UEZ0")("src"),u=n("3WpW"),c=(""+u).split("toString");n("Phdo").inspectSource=function(t){return u.call(t)},(t.exports=function(t,e,n,u){var s="function"==typeof n;s&&(i(n,"name")||o(n,"name",e)),t[e]!==n&&(s&&(i(n,a)||o(n,a,t[e]?""+t[e]:c.join(String(e)))),t===r?t[e]=n:u?t[e]?t[e]=n:o(t,e,n):(delete t[e],o(t,e,n)))})(Function.prototype,"toString",(function(){return"function"==typeof this&&this[a]||u.call(this)}))},Ioy3:function(t,e,n){var r=n("1a8y"),o=n("nONw"),i=n("sOol")("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},JHok:function(t,e,n){"use strict";var r=n("P8UN"),o=n("Wadk")(0),i=n("h/qr")([].forEach,!0);r(r.P+r.F*!i,"Array",{forEach:function(t){return o(this,t,arguments[1])}})},JWvD:function(t,e){t.exports=function(t){try{return{e:!1,v:t()}}catch(e){return{e:!0,v:e}}}},KEMg:function(t,e,n){t.exports=!n("QPJK")&&!n("96qb")((function(){return 7!=Object.defineProperty(n("YGZZ")("div"),"a",{get:function(){return 7}}).a}))},Kz6e:function(t,e,n){n("QPJK")&&"g"!=/./g.flags&&n("rjfK").f(RegExp.prototype,"flags",{configurable:!0,get:n("lb9j")})},LHMV:function(t,e,n){"use strict";n("MIFh"),n("rzGZ"),n("Dq+y"),n("Ggvi"),n("JHok"),n("6kNP"),n("8npG"),e.__esModule=!0,e.default=void 0;var r=s(n("c0Fl")),o=s(n("raBC")),i=s(n("+i7v")),a=s(n("ZfQF")),u=s(n("q5+k")),c=(s(n("QLaP")),n("OysZ"));function s(t){return t&&t.__esModule?t:{default:t}}var l=function(){function t(t){var e=this,n=t.addTransitionHook,r=t.stateStorage,s=t.getCurrentLocation,l=t.shouldUpdateScroll;if(this._restoreScrollRestoration=function(){if(e._oldScrollRestoration)try{window.history.scrollRestoration=e._oldScrollRestoration}catch(t){}},this._onWindowScroll=function(){if(!e._ignoreScrollEvents&&(e._saveWindowPositionHandle||(e._saveWindowPositionHandle=(0,u.default)(e._saveWindowPosition)),e._windowScrollTarget)){var t=e._windowScrollTarget,n=t[0],r=t[1],o=(0,i.default)(window),c=(0,a.default)(window);o===n&&c===r&&(e._windowScrollTarget=null,e._cancelCheckWindowScroll())}},this._saveWindowPosition=function(){e._saveWindowPositionHandle=null,e._savePosition(null,window)},this._checkWindowScrollPosition=function(){return e._checkWindowScrollHandle=null,e._windowScrollTarget?(e.scrollToTarget(window,e._windowScrollTarget),++e._numWindowScrollAttempts,e._numWindowScrollAttempts>=2?(e._windowScrollTarget=null,Promise.resolve()):new Promise((function(t){e._checkWindowScrollHandle=(0,u.default)((function(){return t(e._checkWindowScrollPosition())}))}))):Promise.resolve()},this._stateStorage=r,this._getCurrentLocation=s,this._shouldUpdateScroll=l,"scrollRestoration"in window.history&&!(0,c.isMobileSafari)()){this._oldScrollRestoration=window.history.scrollRestoration;try{window.history.scrollRestoration="manual",(0,o.default)(window,"beforeunload",this._restoreScrollRestoration)}catch(f){this._oldScrollRestoration=null}}else this._oldScrollRestoration=null;this._saveWindowPositionHandle=null,this._checkWindowScrollHandle=null,this._windowScrollTarget=null,this._numWindowScrollAttempts=0,this._ignoreScrollEvents=!1,this._scrollElements={},(0,o.default)(window,"scroll",this._onWindowScroll),this._removeTransitionHook=n((function(){u.default.cancel(e._saveWindowPositionHandle),e._saveWindowPositionHandle=null,Object.keys(e._scrollElements).forEach((function(t){var n=e._scrollElements[t];u.default.cancel(n.savePositionHandle),n.savePositionHandle=null,e._ignoreScrollEvents||e._saveElementPosition(t)}))}))}var e=t.prototype;return e.registerElement=function(t,e,n,r){var i=this;this._scrollElements[t]&&invariant(!1);var a=function(){i._saveElementPosition(t)},c={element:e,shouldUpdateScroll:n,savePositionHandle:null,onScroll:function(){c.savePositionHandle||i._ignoreScrollEvents||(c.savePositionHandle=(0,u.default)(a))}};c.savePositionHandle||this._ignoreScrollEvents||(c.savePositionHandle=(0,u.default)(a)),this._scrollElements[t]=c,(0,o.default)(e,"scroll",c.onScroll),this._updateElementScroll(t,null,r)},e.unregisterElement=function(t){this._scrollElements[t]||invariant(!1);var e=this._scrollElements[t],n=e.element,o=e.onScroll,i=e.savePositionHandle;(0,r.default)(n,"scroll",o),u.default.cancel(i),delete this._scrollElements[t]},e.updateScroll=function(t,e){var n=this;this._updateWindowScroll(t,e).then((function(){n._saveWindowPositionHandle||(n._saveWindowPositionHandle=(0,u.default)(n._saveWindowPosition))})),Object.keys(this._scrollElements).forEach((function(r){n._updateElementScroll(r,t,e)}))},e.stop=function(){this._restoreScrollRestoration(),(0,r.default)(window,"scroll",this._onWindowScroll),this._cancelCheckWindowScroll(),this._removeTransitionHook()},e.startIgnoringScrollEvents=function(){this._ignoreScrollEvents=!0},e.stopIgnoringScrollEvents=function(){this._ignoreScrollEvents=!1},e._cancelCheckWindowScroll=function(){u.default.cancel(this._checkWindowScrollHandle),this._checkWindowScrollHandle=null},e._saveElementPosition=function(t){var e=this._scrollElements[t];e.savePositionHandle=null,this._savePosition(t,e.element)},e._savePosition=function(t,e){this._stateStorage.save(this._getCurrentLocation(),t,[(0,i.default)(e),(0,a.default)(e)])},e._updateWindowScroll=function(t,e){return this._cancelCheckWindowScroll(),this._windowScrollTarget=this._getScrollTarget(null,this._shouldUpdateScroll,t,e),this._numWindowScrollAttempts=0,this._checkWindowScrollPosition()},e._updateElementScroll=function(t,e,n){var r=this._scrollElements[t],o=r.element,i=r.shouldUpdateScroll,a=this._getScrollTarget(t,i,e,n);a&&this.scrollToTarget(o,a)},e._getDefaultScrollTarget=function(t){var e=t.hash;return e&&"#"!==e?"#"===e.charAt(0)?e.slice(1):e:[0,0]},e._getScrollTarget=function(t,e,n,r){var o=!e||e.call(this,n,r);if(!o||Array.isArray(o)||"string"==typeof o)return o;var i=this._getCurrentLocation();return this._getSavedScrollTarget(t,i)||this._getDefaultScrollTarget(i)},e._getSavedScrollTarget=function(t,e){return"PUSH"===e.action?null:this._stateStorage.read(e,t)},e.scrollToTarget=function(t,e){if("string"==typeof e){var n=document.getElementById(e)||document.getElementsByName(e)[0];if(n)return void n.scrollIntoView();e=[0,0]}var r=e,o=r[0],u=r[1];(0,i.default)(t,o),(0,a.default)(t,u)},t}();e.default=l,t.exports=e.default},LYrO:function(t,e,n){"use strict";n.d(e,"f",(function(){return i})),n.d(e,"c",(function(){return a})),n.d(e,"b",(function(){return u})),n.d(e,"d",(function(){return c})),n.d(e,"a",(function(){return s})),n.d(e,"g",(function(){return l})),n.d(e,"e",(function(){return b}));n("MIFh"),n("rzGZ"),n("Dq+y"),n("8npG"),n("Ggvi"),n("sC2a"),n("U6Bt"),n("OeI1"),n("zGcK"),n("sc67"),n("AqHK"),n("HQhv");var r=n("QLaP"),o=n.n(r),i=function(t,e){return t.substr(0,e.length)===e},a=function(t,e){for(var n=void 0,r=void 0,i=e.split("?")[0],a=g(i),u=""===a[0],c=v(t),s=0,l=c.length;se.score?-1:t.index-e.index}))},g=function(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")},m=function(t,e){return t+(e?"?"+e:"")},y=["uri","path"],b=function(t,e){var n=Object.keys(t);return n.length===Object.keys(e).length&&n.every((function(n){return e.hasOwnProperty(n)&&t[n]===e[n]}))}},LagC:function(t,e,n){var r=n("P8UN");r(r.S,"Object",{setPrototypeOf:n("Ftjc").set})},LeKB:function(t,e,n){t.exports=[{plugin:n("q9nr"),options:{plugins:[],maxWidth:1200}},{plugin:n("hUyl"),options:{plugins:[]}},{plugin:n("BOnt"),options:{plugins:[]}},{plugin:n("npZl"),options:{plugins:[],name:"Alex's Midway",short_name:"Midway",start_url:"/",background_color:"#242121",theme_color:"#242121",display:"minimal-ui",icon:"src/images/favicon.png"}},{plugin:n("pWkz"),options:{plugins:[],trackingId:"UA-131355293-1"}},{plugin:n("6MXi"),options:{plugins:[],color:"#d45c54",showSpinner:!1}},{plugin:n("e/UW"),options:{plugins:[]}},{plugin:n("GddB"),options:{plugins:[]}}]},Ll4R:function(t,e,n){"use strict";var r=n("1a8y"),o=n("kiRH"),i=n("fhoV"),a=n("YEpu");n("83Ih")("match",1,(function(t,e,n,u){return[function(n){var r=t(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r):new RegExp(n)[e](String(r))},function(t){var e=u(n,t,this);if(e.done)return e.value;var c=r(t),s=String(this);if(!c.global)return a(c,s);var l=c.unicode;c.lastIndex=0;for(var f,p=[],d=0;null!==(f=a(c,s));){var h=String(f[0]);p[d]=h,""===h&&(c.lastIndex=i(s,o(c.lastIndex),l)),d++}return 0===d?null:p}]}))},MIFh:function(t,e,n){var r=n("P8UN");r(r.S,"Array",{isArray:n("tuyV")})},MMVs:function(t,e,n){n("sc67"),t.exports=function(){var t=!1;-1!==navigator.appVersion.indexOf("MSIE 10")&&(t=!0);var e,n=[],r="object"==typeof document&&document,o=t?r.documentElement.doScroll("left"):r.documentElement.doScroll,i=r&&(o?/^loaded|^c/:/^loaded|^i|^c/).test(r.readyState);return!i&&r&&r.addEventListener("DOMContentLoaded",e=function(){for(r.removeEventListener("DOMContentLoaded",e),i=1;e=n.shift();)e()}),function(t){i?setTimeout(t,0):n.push(t)}}()},MgzW:function(t,e,n){"use strict";n("rzGZ"),n("Dq+y"),n("8npG"),n("Ggvi"),n("HQhv"),n("JHok"),n("AqHK"),n("E5k/"),n("4DPX");var r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}t.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(t){r[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(o){return!1}}()?Object.assign:function(t,e){for(var n,u,c=a(t),s=1;s
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var c=n.render(!e),s=c.querySelector(r.barSelector),l=r.speed,f=r.easing;return c.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),u(s,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(u(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){u(c,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){return n.status||n.set(0),r.trickle&&function t(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)}(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");s(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),c=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return u(a,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&s(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),u=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function c(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function s(t,e){var n=f(t),r=n+e;c(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},"N+BI":function(t,e,n){var r=n("UEZ0")("meta"),o=n("BjK0"),i=n("qDzq"),a=n("rjfK").f,u=0,c=Object.isExtensible||function(){return!0},s=!n("96qb")((function(){return c(Object.preventExtensions({}))})),l=function(t){a(t,r,{value:{i:"O"+ ++u,w:{}}})},f=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!e)return"E";l(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!c(t))return!0;if(!e)return!1;l(t)}return t[r].w},onFreeze:function(t){return s&&f.NEED&&c(t)&&!i(t,r)&&l(t),t}}},NSX3:function(t,e,n){"use strict";n.r(e);var r=n("xtsi");"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/sw.js").then((function(t){t.addEventListener("updatefound",(function(){Object(r.apiRunner)("onServiceWorkerUpdateFound",{serviceWorker:t});var e=t.installing;console.log("installingWorker",e),e.addEventListener("statechange",(function(){switch(e.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,Object(r.apiRunner)("onServiceWorkerUpdateReady",{serviceWorker:t}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),Object(r.apiRunner)("onServiceWorkerInstalled",{serviceWorker:t}));break;case"redundant":console.error("The installing service worker became redundant."),Object(r.apiRunner)("onServiceWorkerRedundant",{serviceWorker:t});break;case"activated":Object(r.apiRunner)("onServiceWorkerActive",{serviceWorker:t})}}))}))})).catch((function(t){console.error("Error during service worker registration:",t)}))},O1i0:function(t,e,n){var r=n("BjK0");t.exports=function(t,e){if(!r(t)||t._t!==e)throw TypeError("Incompatible receiver, "+e+" required!");return t}},OeI1:function(t,e,n){"use strict";var r=n("P8UN"),o=n("Wadk")(2);r(r.P+r.F*!n("h/qr")([].filter,!0),"Array",{filter:function(t){return o(this,t,arguments[1])}})},OysZ:function(t,e,n){"use strict";e.__esModule=!0,e.isMobileSafari=function(){return/iPad|iPhone|iPod/.test(window.navigator.platform)&&/^((?!CriOS).)*Safari/.test(window.navigator.userAgent)}},P8UN:function(t,e,n){var r=n("emib"),o=n("Phdo"),i=n("8wc8"),a=n("IYdN"),u=n("ot9L"),c=function(t,e,n){var s,l,f,p,d=t&c.F,h=t&c.G,v=t&c.S,g=t&c.P,m=t&c.B,y=h?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,b=h?o:o[e]||(o[e]={}),w=b.prototype||(b.prototype={});for(s in h&&(n=e),n)f=((l=!d&&y&&void 0!==y[s])?y:n)[s],p=m&&l?u(f,r):g&&"function"==typeof f?u(Function.call,f):f,y&&a(y,s,f,t&c.U),b[s]!=f&&i(b,s,p),g&&w[s]!=f&&(w[s]=f)};r.core=o,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},PJYZ:function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}},Phdo:function(t,e){var n=t.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},PjVt:function(t,e,n){e.f=n("sOol")},QLaP:function(t,e,n){"use strict";n("pJf4"),n("sC2a");t.exports=function(t,e,n,r,o,i,a,u){if(!t){var c;if(void 0===e)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=[n,r,o,i,a,u],l=0;(c=new Error(e.replace(/%s/g,(function(){return s[l++]})))).name="Invariant Violation"}throw c.framesToPop=1,c}}},QPJK:function(t,e,n){t.exports=!n("96qb")((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},TAD1:function(t,e,n){"use strict";var r=n("P8UN"),o=n("kiRH"),i=n("YdGP"),a="".startsWith;r(r.P+r.F*n("h+B4")("startsWith"),"String",{startsWith:function(t){var e=i(this,t,"startsWith"),n=o(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),r=String(t);return a?a.call(e,r,n):e.slice(n,n+r.length)===r}})},TUPI:function(t,e,n){var r=n("BjK0"),o=n("Ftjc").set;t.exports=function(t,e,n){var i,a=e.constructor;return a!==n&&"function"==typeof a&&(i=a.prototype)!==n.prototype&&r(i)&&o&&o(t,i),t}},Tgxb:function(t,e,n){var r,o,i,a=n("ot9L"),u=n("+wZX"),c=n("ZvP9"),s=n("YGZZ"),l=n("emib"),f=l.process,p=l.setImmediate,d=l.clearImmediate,h=l.MessageChannel,v=l.Dispatch,g=0,m={},y=function(){var t=+this;if(m.hasOwnProperty(t)){var e=m[t];delete m[t],e()}},b=function(t){y.call(t.data)};p&&d||(p=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return m[++g]=function(){u("function"==typeof t?t:Function(t),e)},r(g),g},d=function(t){delete m[t]},"process"==n("CCE/")(f)?r=function(t){f.nextTick(a(y,t,1))}:v&&v.now?r=function(t){v.now(a(y,t,1))}:h?(i=(o=new h).port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r="onreadystatechange"in s("script")?function(t){c.appendChild(s("script")).onreadystatechange=function(){c.removeChild(this),y.call(t)}}:function(t){setTimeout(a(y,t,1),0)}),t.exports={set:p,clear:d}},ToIb:function(t,e,n){"use strict";var r=n("6PSD"),o=n("O1i0");t.exports=n("94Pd")("Set",(function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(t){return r.def(o(this,"Set"),t=0===t?0:t,t)}},r)},TqRt:function(t,e){t.exports=function(t){return t&&t.__esModule?t:{default:t}}},U2V1:function(t,e,n){var r=n("CCE/");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},U33C:function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},U6Bt:function(t,e,n){"use strict";var r=n("P8UN"),o=n("/+AL");r(r.P+r.F*!n("h/qr")([].reduce,!0),"Array",{reduce:function(t){return o(this,t,arguments.length,arguments[1],!1)}})},"U9/z":function(t,e,n){var r=n("aHWV"),o=n("sOol")("iterator"),i=n("m+kh");t.exports=n("Phdo").getIteratorMethod=function(t){if(null!=t)return t[o]||t["@@iterator"]||i[r(t)]}},UEZ0:function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},UxWs:function(t,e,n){"use strict";n.r(e);n("sPse"),n("Ll4R"),n("E5k/");var r=n("xtsi"),o=n("q1tI"),i=n.n(o),a=n("i8i4"),u=n.n(a),c=n("YwZP"),s=n("7hJ6"),l=n("MMVs"),f=n.n(l),p=n("emEt"),d=n("YLt+"),h=n("5yr3"),v={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"},g=n("9Xx/"),m=n("+ZDr");function y(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}var b=d.reduce((function(t,e){return t[e.fromPath]=e,t}),{});function w(t){var e=b[t];return null!=e&&(window.___replace(e.toPath),!0)}var _=function(t,e){w(t.pathname)||Object(r.apiRunner)("onPreRouteUpdate",{location:t,prevLocation:e})},S=function(t,e){w(t.pathname)||Object(r.apiRunner)("onRouteUpdate",{location:t,prevLocation:e})},P=function(t,e){void 0===e&&(e={});var n=Object(m.parsePath)(t).pathname,o=b[n];if(o&&(t=o.toPath,n=Object(m.parsePath)(t).pathname),window.___swUpdated)window.location=n;else{var i=setTimeout((function(){h.a.emit("onDelayedLoadPageResources",{pathname:n}),Object(r.apiRunner)("onRouteUpdateDelayed",{location:window.location})}),1e3);p.default.loadPage(n).then((function(r){if(!r||r.status===p.PageResourceStatus.Error)return window.history.replaceState({},"",location.href),window.location=n,void clearTimeout(i);r&&r.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),console.log("Site has changed on server. Reloading browser"),window.location=n),Object(c.navigate)(t,e),clearTimeout(i)}))}};function x(t,e){var n=this,o=e.location,i=o.pathname,a=o.hash,u=Object(r.apiRunner)("shouldUpdateScroll",{prevRouterProps:t,pathname:i,routerProps:{location:o},getSavedScrollPosition:function(t){return n._stateStorage.read(t)}});if(u.length>0)return u[u.length-1];if(t&&t.location.pathname===i)return a?decodeURI(a.slice(1)):[0,0];return!0}var E=function(t){function e(e){var n;return(n=t.call(this,e)||this).announcementRef=i.a.createRef(),n}y(e,t);var n=e.prototype;return n.componentDidUpdate=function(t,e){var n=this;requestAnimationFrame((function(){var t="new page at "+n.props.location.pathname;document.title&&(t=document.title);var e=document.querySelectorAll("#gatsby-focus-wrapper h1");e&&e.length&&(t=e[0].textContent);var r="Navigated to "+t;n.announcementRef.current.innerText!==r&&(n.announcementRef.current.innerText=r)}))},n.render=function(){return i.a.createElement("div",Object.assign({},v,{ref:this.announcementRef}))},e}(i.a.Component),O=function(t){function e(e){var n;return n=t.call(this,e)||this,_(e.location,null),n}y(e,t);var n=e.prototype;return n.componentDidMount=function(){S(this.props.location,null)},n.componentDidUpdate=function(t,e,n){n&&S(this.props.location,t.location)},n.getSnapshotBeforeUpdate=function(t){return this.props.location.pathname!==t.location.pathname&&(_(this.props.location,t.location),!0)},n.render=function(){return i.a.createElement(i.a.Fragment,null,this.props.children,i.a.createElement(E,{location:location}))},e}(i.a.Component),R=n("IOVJ"),j=n("pCP8"),k=n.n(j);function C(t,e){for(var n in t)if(!(n in e))return!0;for(var r in e)if(t[r]!==e[r])return!0;return!1}var T=function(t){var e,n;function r(e){var n;n=t.call(this)||this;var r=e.location,o=e.pageResources;return n.state={location:Object.assign({},r),pageResources:o||p.default.loadPageSync(r.pathname)},n}n=t,(e=r).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,r.getDerivedStateFromProps=function(t,e){var n=t.location;return e.location.href!==n.href?{pageResources:p.default.loadPageSync(n.pathname),location:Object.assign({},n)}:{location:Object.assign({},n)}};var o=r.prototype;return o.loadResources=function(t){var e=this;p.default.loadPage(t).then((function(n){n&&n.status!==p.PageResourceStatus.Error?e.setState({location:Object.assign({},window.location),pageResources:n}):(window.history.replaceState({},"",location.href),window.location=t)}))},o.shouldComponentUpdate=function(t,e){return e.pageResources?this.state.pageResources!==e.pageResources||(this.state.pageResources.component!==e.pageResources.component||(this.state.pageResources.json!==e.pageResources.json||(!(this.state.location.key===e.location.key||!e.pageResources.page||!e.pageResources.page.matchPath&&!e.pageResources.page.path)||function(t,e,n){return C(t.props,e)||C(t.state,n)}(this,t,e)))):(this.loadResources(t.location.pathname),!1)},o.render=function(){return this.props.children(this.state)},r}(i.a.Component),A=n("cSJ8"),I=n("vf9c");var L=new p.ProdLoader(k.a,I);Object(p.setLoader)(L),L.setApiRunner(r.apiRunner),window.asyncRequires=k.a,window.___emitter=h.a,window.___loader=p.publicLoader,g.globalHistory.listen((function(t){t.location.action=t.action})),window.___push=function(t){return P(t,{replace:!1})},window.___replace=function(t){return P(t,{replace:!0})},window.___navigate=function(t,e){return P(t,e)},w(window.location.pathname),Object(r.apiRunnerAsync)("onClientEntry").then((function(){Object(r.apiRunner)("registerServiceWorker").length>0&&n("NSX3");var t=function(t){return i.a.createElement(c.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},i.a.createElement(R.a,t))},e=function(e){var n,r;function o(){return e.apply(this,arguments)||this}return r=e,(n=o).prototype=Object.create(r.prototype),n.prototype.constructor=n,n.__proto__=r,o.prototype.render=function(){var e=this,n=this.props.location;return i.a.createElement(T,{location:n},(function(n){var r=n.pageResources,o=n.location;return i.a.createElement(O,{location:o},i.a.createElement(s.ScrollContext,{location:o,shouldUpdateScroll:x},i.a.createElement(c.Router,{basepath:"",location:o,id:"gatsby-focus-wrapper"},i.a.createElement(t,Object.assign({path:"/404.html"===r.page.path?Object(A.a)(o.pathname,""):encodeURI(r.page.matchPath||r.page.path)},e.props,{location:o,pageResources:r},r.json)))))}))},o}(i.a.Component),o=window,a=o.pagePath,l=o.location;a&&""+a!==l.pathname&&!(L.findMatchPath(Object(A.a)(l.pathname,""))||"/404.html"===a||a.match(/^\/404\/?$/)||a.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&Object(c.navigate)(""+a+l.search+l.hash,{replace:!0}),p.publicLoader.loadPage(l.pathname).then((function(t){if(!t||t.status===p.PageResourceStatus.Error)throw new Error("page resources for "+l.pathname+" not found. Not rendering React");window.___webpackCompilationHash=t.page.webpackCompilationHash;var n=function(){return i.a.createElement(c.Location,null,(function(t){return i.a.createElement(e,t)}))},o=Object(r.apiRunner)("wrapRootElement",{element:i.a.createElement(n,null)},i.a.createElement(n,null),(function(t){return{element:t.result}})).pop(),a=function(){return o},s=Object(r.apiRunner)("replaceHydrateFunction",void 0,u.a.hydrate)[0];f()((function(){s(i.a.createElement(a,null),"undefined"!=typeof window?document.getElementById("___gatsby"):void 0,(function(){Object(r.apiRunner)("onInitialClientRender")}))}))}))}))},VbXa:function(t,e){t.exports=function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}},Vce4:function(t,e,n){var r=n("1a8y"),o=n("BjK0"),i=n("WfYH");t.exports=function(t,e){if(r(t),o(e)&&e.constructor===t)return e;var n=i.f(t);return(0,n.resolve)(e),n.promise}},Wadk:function(t,e,n){var r=n("ot9L"),o=n("U2V1"),i=n("DFzH"),a=n("kiRH"),u=n("ytzU");t.exports=function(t,e){var n=1==t,c=2==t,s=3==t,l=4==t,f=6==t,p=5==t||f,d=e||u;return function(e,u,h){for(var v,g,m=i(e),y=o(m),b=r(u,h,3),w=a(y.length),_=0,S=n?d(e,w):c?d(e,0):void 0;w>_;_++)if((p||_ in y)&&(g=b(v=y[_],_,m),t))if(n)S[_]=g;else if(g)switch(t){case 3:return!0;case 5:return v;case 6:return _;case 2:S.push(v)}else if(l)return!1;return f?-1:s||l?l:S}}},Wbzz:function(t,e,n){"use strict";n.r(e),n.d(e,"graphql",(function(){return h})),n.d(e,"StaticQueryContext",(function(){return l})),n.d(e,"StaticQuery",(function(){return p})),n.d(e,"useStaticQuery",(function(){return d})),n.d(e,"prefetchPathname",(function(){return s}));n("YBKJ");var r=n("q1tI"),o=n.n(r),i=n("+ZDr"),a=n.n(i);n.d(e,"Link",(function(){return a.a})),n.d(e,"withAssetPrefix",(function(){return i.withAssetPrefix})),n.d(e,"withPrefix",(function(){return i.withPrefix})),n.d(e,"parsePath",(function(){return i.parsePath})),n.d(e,"navigate",(function(){return i.navigate})),n.d(e,"push",(function(){return i.push})),n.d(e,"replace",(function(){return i.replace})),n.d(e,"navigateTo",(function(){return i.navigateTo}));var u=n("lw3w"),c=n.n(u);n.d(e,"PageRenderer",(function(){return c.a}));var s=n("emEt").default.enqueue,l=o.a.createContext({});function f(t){var e=t.staticQueryData,n=t.data,r=t.query,i=t.render,a=n?n.data:e[r]&&e[r].data;return o.a.createElement(o.a.Fragment,null,a&&i(a),!a&&o.a.createElement("div",null,"Loading (StaticQuery)"))}var p=function(t){var e=t.data,n=t.query,r=t.render,i=t.children;return o.a.createElement(l.Consumer,null,(function(t){return o.a.createElement(f,{data:e,query:n,render:r||i,staticQueryData:t})}))},d=function(t){o.a.useContext;var e=o.a.useContext(l);if(isNaN(Number(t)))throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql`"+t+"`);\n");if(e[t]&&e[t].data)return e[t].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")};function h(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},WevN:function(t,e,n){"use strict";var r=n("P8UN"),o=n("kiRH"),i=n("YdGP"),a="".endsWith;r(r.P+r.F*n("h+B4")("endsWith"),"String",{endsWith:function(t){var e=i(this,t,"endsWith"),n=arguments.length>1?arguments[1]:void 0,r=o(e.length),u=void 0===n?r:Math.min(o(n),r),c=String(t);return a?a.call(e,c,u):e.slice(u-c.length,u)===c}})},WfYH:function(t,e,n){"use strict";var r=n("nONw");function o(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)}t.exports.f=function(t){return new o(t)}},YBKJ:function(t,e,n){"use strict";var r=n("emib"),o=n("qDzq"),i=n("CCE/"),a=n("TUPI"),u=n("kxs/"),c=n("96qb"),s=n("chL8").f,l=n("Drra").f,f=n("rjfK").f,p=n("EU/P").trim,d=r.Number,h=d,v=d.prototype,g="Number"==i(n("nsRs")(v)),m="trim"in String.prototype,y=function(t){var e=u(t,!1);if("string"==typeof e&&e.length>2){var n,r,o,i=(e=m?e.trim():p(e,3)).charCodeAt(0);if(43===i||45===i){if(88===(n=e.charCodeAt(2))||120===n)return NaN}else if(48===i){switch(e.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+e}for(var a,c=e.slice(2),s=0,l=c.length;so)return NaN;return parseInt(c,r)}}return+e};if(!d(" 0o1")||!d("0b1")||d("+0x1")){d=function(t){var e=arguments.length<1?0:t,n=this;return n instanceof d&&(g?c((function(){v.valueOf.call(n)})):"Number"!=i(n))?a(new h(y(e)),n,d):y(e)};for(var b,w=n("QPJK")?s(h):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),_=0;w.length>_;_++)o(h,b=w[_])&&!o(d,b)&&f(d,b,l(h,b));d.prototype=v,v.constructor=d,n("IYdN")(r,"Number",d)}},YEpu:function(t,e,n){"use strict";var r=n("aHWV"),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},YGZZ:function(t,e,n){var r=n("BjK0"),o=n("emib").document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},"YLt+":function(t){t.exports=JSON.parse("[]")},YbXK:function(t,e,n){"use strict";var r=n("ouCZ")(!0);n("ZFV6")(String,"String",(function(t){this._t=String(t),this._i=0}),(function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})}))},YdGP:function(t,e,n){var r=n("mhTz"),o=n("ap2Z");t.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(t))}},YmeT:function(t,e,n){var r=n("rjfK"),o=n("1a8y"),i=n("2mBY");t.exports=n("QPJK")?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),u=a.length,c=0;u>c;)r.f(t,n=a[c++],e[n]);return t}},YwZP:function(t,e,n){"use strict";n.r(e),n.d(e,"Link",(function(){return T})),n.d(e,"Location",(function(){return y})),n.d(e,"LocationProvider",(function(){return b})),n.d(e,"Match",(function(){return q})),n.d(e,"Redirect",(function(){return N})),n.d(e,"Router",(function(){return S})),n.d(e,"ServerLocation",(function(){return w})),n.d(e,"createHistory",(function(){return l.createHistory})),n.d(e,"createMemorySource",(function(){return l.createMemorySource})),n.d(e,"isRedirect",(function(){return I})),n.d(e,"navigate",(function(){return l.navigate})),n.d(e,"redirectTo",(function(){return L})),n.d(e,"globalHistory",(function(){return l.globalHistory})),n.d(e,"matchPath",(function(){return s.b})),n.d(e,"useLocation",(function(){return M})),n.d(e,"useNavigate",(function(){return F})),n.d(e,"useParams",(function(){return D})),n.d(e,"useMatch",(function(){return W})),n.d(e,"BaseContext",(function(){return _}));n("AqHK"),n("sC2a"),n("U6Bt"),n("6kNP"),n("8npG"),n("LagC"),n("pS08"),n("sc67"),n("E5k/");var r=n("q1tI"),o=n.n(r),i=(n("17x9"),n("QLaP")),a=n.n(i),u=o.a.createContext,c=n("94VI"),s=n("LYrO"),l=n("9Xx/"),f=Object.assign||function(t){for(var e=1;e=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function h(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var g=function(t,e){var n=u(e);return n.displayName=t,n},m=g("Location"),y=function(t){var e=t.children;return o.a.createElement(m.Consumer,null,(function(t){return t?e(t):o.a.createElement(b,null,e)}))},b=function(t){function e(){var n,r;d(this,e);for(var o=arguments.length,i=Array(o),a=0;a-1?(i=e.substring(0,r),a=e.substring(r)):i=e,o.a.createElement(m.Provider,{value:{location:{pathname:i,search:a,hash:""},navigate:function(){throw new Error("You can't call navigate on the server.")}}},n)},_=g("Base",{baseuri:"/",basepath:"/"}),S=function(t){return o.a.createElement(_.Consumer,null,(function(e){return o.a.createElement(y,null,(function(n){return o.a.createElement(P,f({},e,n,t))}))}))},P=function(t){function e(){return d(this,e),h(this,t.apply(this,arguments))}return v(e,t),e.prototype.render=function(){var t=this.props,e=t.location,n=t.navigate,r=t.basepath,i=t.primary,a=t.children,u=(t.baseuri,t.component),c=void 0===u?"div":u,l=p(t,["location","navigate","basepath","primary","children","baseuri","component"]),d=o.a.Children.toArray(a).reduce((function(t,e){var n=B(r)(e);return t.concat(n)}),[]),h=e.pathname,v=Object(s.c)(d,h);if(v){var g=v.params,m=v.uri,y=v.route,b=v.route.value;r=y.default?r:y.path.replace(/\*$/,"");var w=f({},g,{uri:m,location:e,navigate:function(t,e){return n(Object(s.d)(t,m),e)}}),P=o.a.cloneElement(b,w,b.props.children?o.a.createElement(S,{location:e,primary:i},b.props.children):void 0),x=i?E:c,O=i?f({uri:m,location:e,component:c},l):l;return o.a.createElement(_.Provider,{value:{baseuri:m,basepath:r}},o.a.createElement(x,O,P))}return null},e}(o.a.PureComponent);P.defaultProps={primary:!0};var x=g("Focus"),E=function(t){var e=t.uri,n=t.location,r=t.component,i=p(t,["uri","location","component"]);return o.a.createElement(x.Consumer,null,(function(t){return o.a.createElement(j,f({},i,{component:r,requestFocus:t,uri:e,location:n}))}))},O=!0,R=0,j=function(t){function e(){var n,r;d(this,e);for(var o=arguments.length,i=Array(o),a=0;a1?arguments[1]:void 0,g=void 0!==v,m=0,y=l(p);if(g&&(v=r(v,h>2?arguments[2]:void 0,2)),null==y||d==Array&&u(y))for(n=new d(e=c(p.length));e>m;m++)s(n,m,g?v(p[m],m):p[m]);else for(f=y.call(p),n=new d;!(o=f.next()).done;m++)s(n,m,g?a(f,v,[o.value,m],!0):o.value);return n.length=m,n}})},cSJ8:function(t,e,n){"use strict";e.a=function(t,e){return void 0===e&&(e=""),e?(e+="/",t.substr(0,e.length)===e?t.slice(e.length-1):t):t}},chL8:function(t,e,n){var r=n("13lr"),o=n("U33C").concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},cu4x:function(t,e,n){"use strict";n("sc67"),e.__esModule=!0,e.parsePath=function(t){var e=t||"/",n="",r="",o=e.indexOf("#");-1!==o&&(r=e.substr(o),e=e.substr(0,o));var i=e.indexOf("?");-1!==i&&(n=e.substr(i),e=e.substr(0,i));return{pathname:e,search:"?"===n?"":n,hash:"#"===r?"":r}}},dSuk:function(t,e,n){var r=n("rjfK").f,o=n("qDzq"),i=n("sOol")("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},dTG6:function(t,e,n){var r=n("1Llc"),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},dpYK:function(t,e,n){"use strict";n("sC2a");t.exports=function(){}},"e/UW":function(t,e,n){"use strict";e.registerServiceWorker=function(){return!0};var r=[];e.onServiceWorkerActive=function(t){var e=t.getResourceURLsForPathname,n=t.serviceWorker;if(window.___swUpdated)n.active.postMessage({gatsbyApi:"clearPathResources"});else{var o=document.querySelectorAll("\n head > script[src],\n head > link[href],\n head > style[data-href]\n "),i=[].slice.call(o).map((function(t){return t.src||t.href||t.getAttribute("data-href")})),a=[];r.forEach((function(t){var r=e(t);a.push.apply(a,r),n.active.postMessage({gatsbyApi:"setPathResources",path:t,resources:r})})),[].concat(i,a).forEach((function(t){var e=document.createElement("link");e.rel="prefetch",e.href=t,e.onload=e.remove,e.onerror=e.remove,document.head.appendChild(e)}))}},e.onPostPrefetchPathname=function(t){var e=t.pathname,n=t.getResourceURLsForPathname;if(!window.___swUpdated&&"serviceWorker"in navigator){var o=navigator.serviceWorker;null===o.controller?r.push(e):o.controller.postMessage({gatsbyApi:"setPathResources",path:e,resources:n(e)})}}},emEt:function(t,e,n){"use strict";n.r(e),n.d(e,"PageResourceStatus",(function(){return _})),n.d(e,"BaseLoader",(function(){return R})),n.d(e,"ProdLoader",(function(){return k})),n.d(e,"setLoader",(function(){return C})),n.d(e,"publicLoader",(function(){return T}));n("pJf4"),n("q8oJ"),n("cFtU"),n("m210"),n("4DPX"),n("ToIb"),n("rzGZ"),n("Dq+y"),n("YbXK"),n("xJgp"),n("gu/5"),n("eoYm"),n("E5k/"),n("6kNP"),n("8npG"),n("WevN"),n("Ggvi");var r=function(t){if("undefined"==typeof document)return!1;var e=document.createElement("link");try{if(e.relList&&"function"==typeof e.relList.supports)return e.relList.supports(t)}catch(n){return!1}return!1}("prefetch")?function(t,e){return new Promise((function(n,r){if("undefined"!=typeof document){var o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",t),Object.keys(e).forEach((function(t){o.setAttribute(t,e[t])})),o.onload=n,o.onerror=r,(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(o)}else r()}))}:function(t){return new Promise((function(e,n){var r=new XMLHttpRequest;r.open("GET",t,!0),r.onload=function(){200===r.status?e():n()},r.send(null)}))},o={},i=function(t,e){return new Promise((function(n){o[t]?n():r(t,e).then((function(){n(),o[t]=!0})).catch((function(){}))}))},a=n("5yr3"),u=(n("HQhv"),n("LYrO")),c=n("cSJ8"),s=function(t){return void 0===t?t:"/"===t?"/":"/"===t.charAt(t.length-1)?t.slice(0,-1):t};function l(t){var e=0;if("undefined"==typeof Symbol||null==t[Symbol.iterator]){if(Array.isArray(t)||(t=function(t,e){if(!t)return;if("string"==typeof t)return f(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return f(t,e)}(t)))return function(){return e>=t.length?{done:!0}:{done:!1,value:t[e++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(e=t[Symbol.iterator]()).next.bind(e)}function f(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n1?arguments[1]:void 0)}})},fhoV:function(t,e,n){"use strict";var r=n("ouCZ")(!0);t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},"gu/5":function(t,e,n){"use strict";var r=n("P8UN"),o=n("Ar2q")(!0);r(r.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),n("Dq1/")("includes")},"h+B4":function(t,e,n){var r=n("sOol")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(o){}}return!0}},"h/qr":function(t,e,n){"use strict";var r=n("96qb");t.exports=function(t,e){return!!t&&r((function(){e?t.call(null,(function(){}),1):t.call(null)}))}},hUyl:function(t,e,n){"use strict";n("sC2a");var r=0,o=function(t){var e=window.decodeURI(t.replace("#",""));if(""!==e){var n=document.getElementById(e);if(n){var o=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop,i=document.documentElement.clientTop||document.body.clientTop||0;return n.getBoundingClientRect().top+o-i-r}}return null};e.onInitialClientRender=function(t,e){e.offsetY&&(r=e.offsetY),requestAnimationFrame((function(){var t=o(window.location.hash);null!==t&&window.scrollTo(0,t)}))},e.shouldUpdateScroll=function(t){var e=t.routerProps.location,n=o(e.hash);return null===n||[0,n]}},hqbx:function(t,e,n){"use strict";n("sC2a"),n("klQ5"),n("sPse"),n("gu/5"),n("eoYm");var r=n("TqRt");e.__esModule=!0,e.default=function(t,e,n){var r=v(n,e);return t.addEventListener("click",r),function(){return t.removeEventListener("click",r)}},e.routeThroughBrowserOrApp=e.hashShouldBeFollowed=e.pathIsNotHandledByApp=e.urlsAreOnSameOrigin=e.authorIsForcingNavigation=e.anchorsTargetIsEquivalentToSelf=e.findClosestAnchor=e.navigationWasHandledElsewhere=e.slashedPathname=e.userIsForcingNavigation=void 0;var o=r(n("oxjq")),i=n("Wbzz"),a=function(t){return 0!==t.button||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey};e.userIsForcingNavigation=a;var u=function(t){return"/"===t[0]?t:"/"+t};e.slashedPathname=u;var c=function(t){return t.defaultPrevented};e.navigationWasHandledElsewhere=c;var s=function(t){for(;t.parentNode;t=t.parentNode)if("a"===t.nodeName.toLowerCase())return t;return null};e.findClosestAnchor=s;var l=function(t){return!1===t.hasAttribute("target")||null==t.target||["_self",""].includes(t.target)||"_parent"===t.target&&(!t.ownerDocument.defaultView.parent||t.ownerDocument.defaultView.parent===t.ownerDocument.defaultView)||"_top"===t.target&&(!t.ownerDocument.defaultView.top||t.ownerDocument.defaultView.top===t.ownerDocument.defaultView)};e.anchorsTargetIsEquivalentToSelf=l;var f=function(t){return!0===t.hasAttribute("download")||!1===l(t)};e.authorIsForcingNavigation=f;var p=function(t,e){return t.protocol===e.protocol&&t.host===e.host};e.urlsAreOnSameOrigin=p;var d=function(t,e){return!1===e.test(u(t.pathname))||-1!==t.pathname.search(/^.*\.((?!htm)[a-z0-9]{1,5})$/i)};e.pathIsNotHandledByApp=d;var h=function(t,e){return""!==e.hash&&(""===e.pathname||e.pathname===t.pathname)};e.hashShouldBeFollowed=h;var v=function(t,e){return function(n){if(window.___failedResources)return!0;if(a(n))return!0;if(c(n))return!0;var r=s(n.target);if(null==r)return!0;if(f(r))return!0;var l=document.createElement("a");l.href=r.href,r.href instanceof SVGAnimatedString&&(l.href=r.href.animVal);var v=document.createElement("a");if(v.href=window.location.href,!1===p(v,l))return!0;var g=new RegExp("^"+(0,o.default)((0,i.withPrefix)("/")));if(d(l,g))return!0;if(h(v,l))return!0;if(e.excludePattern&&new RegExp(e.excludePattern).test(l.pathname))return!0;n.preventDefault();var m=u(l.pathname).replace(g,"/");return t(""+m+l.search+l.hash),!1}};e.routeThroughBrowserOrApp=v},jJtK:function(t,e,n){var r=n("emib"),o=n("Tgxb").set,i=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,c="process"==n("CCE/")(a);t.exports=function(){var t,e,n,s=function(){var r,o;for(c&&(r=a.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(i){throw t?n():e=void 0,i}}e=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(s)};else if(!i||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var l=u.resolve(void 0);n=function(){l.then(s)}}else n=function(){o.call(r,s)};else{var f=!0,p=document.createTextNode("");new i(s).observe(p,{characterData:!0}),n=function(){p.data=f=!f}}return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}},k5Iv:function(t,e,n){"use strict";var r=n("QPJK"),o=n("2mBY"),i=n("lHo0"),a=n("BnbX"),u=n("DFzH"),c=n("U2V1"),s=Object.assign;t.exports=!s||n("96qb")((function(){var t={},e={},n=Symbol(),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach((function(t){e[t]=t})),7!=s({},t)[n]||Object.keys(s({},e)).join("")!=r}))?function(t,e){for(var n=u(t),s=arguments.length,l=1,f=i.f,p=a.f;s>l;)for(var d,h=c(arguments[l++]),v=f?o(h).concat(f(h)):o(h),g=v.length,m=0;g>m;)d=v[m++],r&&!p.call(h,d)||(n[d]=h[d]);return n}:s},kiRH:function(t,e,n){var r=n("1Llc"),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},klQ5:function(t,e,n){var r=n("emib"),o=n("TUPI"),i=n("rjfK").f,a=n("chL8").f,u=n("mhTz"),c=n("lb9j"),s=r.RegExp,l=s,f=s.prototype,p=/a/g,d=/a/g,h=new s(p)!==p;if(n("QPJK")&&(!h||n("96qb")((function(){return d[n("sOol")("match")]=!1,s(p)!=p||s(d)==d||"/a/i"!=s(p,"i")})))){s=function(t,e){var n=this instanceof s,r=u(t),i=void 0===e;return!n&&r&&t.constructor===s&&i?t:o(h?new l(r&&!i?t.source:t,e):l((r=t instanceof s)?t.source:t,r&&i?c.call(t):e),n?this:f,s)};for(var v=function(t){t in s||i(s,t,{configurable:!0,get:function(){return l[t]},set:function(e){l[t]=e}})},g=a(l),m=0;g.length>m;)v(g[m++]);f.constructor=s,s.prototype=f,n("IYdN")(r,"RegExp",s)}n("to/b")("RegExp")},"kxs/":function(t,e,n){var r=n("BjK0");t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},lHo0:function(t,e){e.f=Object.getOwnPropertySymbols},lSNA:function(t,e){t.exports=function(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}},lb9j:function(t,e,n){"use strict";var r=n("1a8y");t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},ltAs:function(t,e,n){var r=n("qDzq"),o=n("DFzH"),i=n("oMtz")("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},lw3w:function(t,e,n){var r;t.exports=(r=n("rzlk"))&&r.default||r},"m+kh":function(t,e){t.exports={}},m210:function(t,e,n){n("ovV4")("asyncIterator")},m8CP:function(t,e,n){var r=n("2mBY"),o=n("lHo0"),i=n("BnbX");t.exports=function(t){var e=r(t),n=o.f;if(n)for(var a,u=n(t),c=i.f,s=0;u.length>s;)c.call(t,a=u[s++])&&e.push(a);return e}},mhTz:function(t,e,n){var r=n("BjK0"),o=n("CCE/"),i=n("sOol")("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==o(t))}},n7j8:function(t,e,n){var r=n("P8UN");r(r.P,"Function",{bind:n("16Xr")})},nONw:function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},npZl:function(t,e,n){"use strict";var r=n("TqRt");n("Wbzz"),r(n("9hXx"))},nsRs:function(t,e,n){var r=n("1a8y"),o=n("YmeT"),i=n("U33C"),a=n("oMtz")("IE_PROTO"),u=function(){},c=function(){var t,e=n("YGZZ")("iframe"),r=i.length;for(e.style.display="none",n("ZvP9").appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" - - -

Hello from HTML!

- - -``` - -``这一行引用了同文件夹内的另一个 JavaScript 文件,名为`index.js`。 - -```javascript -// index.js -console.log('Hello from JavaScript!'); -``` - -这就是一个网站了!现在假设你想导入别人写的库,比如说[moment.js](http://momentjs.com/)(它把时间格式化为可读形式)。 假设你可以像下面这样使用`moment`: - -```javascript -moment() - .startOf('day') - .fromNow(); // 20 hours ago -``` - -但你首先得在网站里引入 moment.js。在 moment.js 首页上能看到以下说明: - -![](https://cdn-images-1.medium.com/max/992/1*ef7OX37jr--Jc38ZxO97Iw.png) - -右侧**Install**这一栏里有很多内容。暂时先忽略,我们可以下载`moment.min.js`文件到网站文件夹里,并在`index.html`里引用它。 - -```html - - - - - - Example - - - - - -

Hello from HTML!

- - -``` - -注意`moment.min.js`比`index.js`先加载,这样你就可以在`index.js`里使用`moment`函数: - -```javascript -// index.js -console.log('Hello from JavaScript!'); -console.log( - moment() - .startOf('day') - .fromNow() -); -``` - -这就是使用 JS 库开发网站的方式!好处是非常容易理解。不足在于每次库更新都要下载它的新版本,这很繁琐。 - -#### 使用 JavaScript 包管理器(npm) - -2010 年开始,一批互相竞争的 JavaScript 包管理器出现,通过从中心仓库下载和更新库实现了这个过程的自动化。[Bower](https://bower.io/)可以说是 2013 年最受欢迎的包管理器,但最终在 2015 年左右被[npm](https://www.npmjs.com/)取代。(2016 年下半年,[yarn](https://yarnpkg.com/en/)作为 npm 的替代品吸引了大量关注,但本质上它仍然使用 npm 包管理技术) -说明一下,npm 起初只是[node.js](https://nodejs.org/)的专用包管理器。node 运行在服务端,不是前端。前端的包管理器选择运行在服务器端的库,有点不正常啊。 - -> 注:使用包管理器需要掌握命令行,过去的前端开发中并没有这个要求。如果你从来没用过,可以从这个[入门指南](https://www.learnenough.com/command-line-tutorial)开始。总而言之,掌握命令行是现代 JavaScript 中一项重要内容(命令行也让其它领域的开发成为可能)。 - -看一下如何使用 npm 自动安装 moment.js。如果你已经安装了 node.js,你就有了 npm。你就可以通过命令行访问`index.html`的文件夹并输入: - -```Command Line -$ npm init -``` - -之后会弹出一系列问题(直接选默认就行,一直点回车),并生成`package.json`文件。这是 npm 用来保存项目信息的配置文件。默认选项的`package.json`的内容如下: - -```json -{ - "name": "your-project-name", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC" -} -``` - -我们现在可以按照 moment.js 主页的说明安装了,命令行输入下面这条命令: - -```command line -$ npm install moment --save -``` - -这条命令做了 2 件事情:一,它下载 moment.js 的所有代码,并保存在`node_modules`文件夹里。二,它自动修改`package.json`文件,把 moment.js 作为项目依赖。 - -```json{11-13} -{ - "name": "modern-javascript-example", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "moment": "^2.22.2" - } -} -``` - -这在后面与他人共享项目时很有用——不再共享`node_modules`文件夹(这个文件夹可能很大),只需要共享`package.json`文件,其他人就能通过`npm install`自动安装需要的包。 - -我们再也不用手动下载 moment.js 了,可以使用 npm 自动下载和更新。打开`node_modules`文件夹,可以看到`moment.min.js`文件出现在`node_modules/moment/min`文件夹。这样就可以在`index.html`中链接下载好的`moment.min.js`版本: - -```html - - - - - - JavaScript Example - - -- - - -- - - - - -

Hello from HTML!

- - -``` - -优点是我们现在可以通过命令行使用 npm 下载和更新包。不足是现在得从`node_modules`里找到每个包的路径并手动添加到 HTML 中。太麻烦了,下面会谈到怎么让这个过程也实现自动化。 - -![](https://cdn-images-1.medium.com/max/992/1*GeEETvRqyG4o7SZdbU2Guw.png) - -#### 使用 JavaScript 模块打包工具(webpack) - -大多数编程语言支持将一个文件的代码导入到另一个文件。JavaScript 开始并没有这个功能,因为 JavaScript 开始只在浏览器运行,没有访问客户端电脑文件系统的权限(因为安全原因)。所以一直以来,组织多文件的 JavaScript 代码需要将各文件变量作为全局导入。 - -我们在上面 moment.js 例子里也是这么做的——HTML 加载整个`moment.min.js`文件,定义了一个全局变量`moment`,这样后加载的文件都可以访问它(不管他们是否需要访问这个变量) - -2009 年,名为 CommonJS 的项目启动了。它旨在规范浏览器端以外的 JavaScript 生态。CommonJS 的大部分内容是关于模块的标准,它让 JavaScript 像其他编程语言一样,最终实现了跨文件导入和导出代码的功能,结束了依赖全局变量的时代。CommonJS 标准最广为人知的实现是 node.js 。 - -![](https://cdn-images-1.medium.com/max/992/1*xeF1flp1zDLLJ4j7rDQ6-Q.png) - -之前提过,node.js 是在服务端运行的 JavaScript。之前的例子用 node.js 模块表示的话,是这样的。HTML 不再通过 script 标签加载`moment.min.js`,而是直接在 JavaScript 文件中导入: - -```javascript -// index.js -var moment = require('moment'); - -console.log('Hello from JavaScript!'); -console.log( - moment() - .startOf('day') - .fromNow() -); -``` - -这是 node.js 里加载模块的方式。它在 node.js 中一切正常,因为 node 是服务端语言,能够访问计算机文件系统。node.js 也知道每个 npm 模块的路径,因此只需要使用`require('moment')`语句,而不再需要`require('./node_modules/moment/min/moment.min.js)`(译注:即指明模块具体路径)——非常好。 - -但这也只在 node.js 里行的通了,如果你在浏览器里使用这种方式,得到的只是“`require`未定义”的错误。浏览器没有访问文件系统的权限,因此通过这种方式加载模块非常困难——文件加载只能动态完成,要么是同步的(这会降低执行速度),要么是异步的(会出现时间不一致的问题)。 - -于是模块打包工具应运而生。JavaScript 模块打包工具通过构建过程(过程中有文件访问权限)绕开了这个问题,它输出一个兼容浏览器的最终文件(即不需要访问文件系统)。这样就需要打包工具找到所有浏览器不兼容的`require`语句,将其替换成依赖文件的真实内容。最终输出是单个打包好的 JavaScript 文件(并且没有 require 语句)! - -曾经最流行的打包工具是[Browserify](http://browserify.org/),它在 2011 年发布,首先在前端支持 node.js 格式的 require 语句(这最终成就了 npm,让它成了前端包管理器)。2015 年左右,[webpack](https://webpack.github.io/)后来居上,成为最广泛使用的打包工具(前端框架 React 的普及推动了这一过程,因为 React 充分利用了 webpack 的各种特性)。 - -看看 webpack 怎么让前面`require('moment')`这个例子实现兼容浏览器的。首先需要在项目中安装 webpack。webpack 自身就是一个 npm 包,可以通过命令行安装: - -``` -$ npm install webpack webpack-cli --save-dev -``` - -注意安装的是 2 个包——webpack 和 webpack-cli(后者支持通过命令行使用 webpack)。再看 `--save-dev`参数——这个参数表示将安装包作为开发依赖保存,意思是安装包在开发环境中使用,但不会部署在生产服务器上。可以在`package.json`文件中看到,文件会自动更新: - -
{
-  "name": "modern-javascript-example",
-  "version": "1.0.0",
-  "description": "",
-  "main": "index.js",
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "author": "",
-  "license": "ISC",
-  "dependencies": {
-    "moment": "^2.19.1"
-  },
-  "devDependencies": {
-    "webpack": "^4.17.1",
-    "webpack-cli": "^3.1.0"
-  }
-}
- -现在`node_modules`文件夹里安装好了 webpack 和 webpack-cli 包。你可以在命令行里使用 webpack-cli: - -``` -$ ./node_modules/.bin/webpack index.js --mode=development -``` - -这条命令将会运行安装好的 webpack,从`index.js`文件开始,搜索全部`require`语句,将它替换为合适的代码,最终创建单个输出文件(默认路径是`dist/main.js`)。`--mode=development`参数让 JavaScript 代码保持可读性,而`--mode=production`参数则会输出(不可读的)最小化的文件。 - -得到 webpack 的`dist/main.js`输出文件后,我们就可以在浏览器中用它取代`index.js`,因为后者还包含非法的 require 语句。这个过程也能在`index.html`文件中体现: - -```HTML - - - - - - JavaScript Example - - -- - - -

Hello from HTML!

- - -``` - -刷新浏览器就能发现现在和之前一样了! - -注意每次更改`index.js`,我们都需要运行 webpack 命令。这样很繁琐,并且在使用 webpack 高级功能时会变得更糟(比如从转换后的代码中生成[source map](https://webpack.js.org/guides/development/#using-source-maps)辅助调试初始代码)。webpack 可以从项目根目录的配置文件中读取配置,配置文件名为`webpack.config.js`,在本文的例子是这样的: - -```javascript -// webpack.config.js -module.exports = { - mode: 'development', - entry: './index.js', - output: { - filename: 'main.js', - publicPath: 'dist' - } -}; -``` - -现在每次修改`index.js`时,可以哦那个过下面这条命令运行 webpack: - -``` -$ ./node_modules/.bin/webpack -``` - -我们不再需要指定`index.js`和`--mode=development`设置了,因为 webpack 会从`webpack.config.js`加载这些配置。现在好些了,但仍显得繁琐,每次修改代码还是需要输入这串命令——下面会让这个过程更简单一些。 - -总之,上面这些步骤看起来并不多,但这种流程有巨大的优势。我们不再需要以全局变量的形式加载外部文件了。不必在 HTML 文件里增加`

An Old dog learning new tricks -

Welcome to Alex's Midway

\ No newline at end of file diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 0000000..c87b7de --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1 @@ +{"name":"Alex's Midway","short_name":"Midway","start_url":"/","background_color":"#242121","theme_color":"#242121","display":"minimal-ui","icons":[{"src":"icons/icon-48x48.png?v=c392780086182a7a4b7d7086cef53760","sizes":"48x48","type":"image/png"},{"src":"icons/icon-72x72.png?v=c392780086182a7a4b7d7086cef53760","sizes":"72x72","type":"image/png"},{"src":"icons/icon-96x96.png?v=c392780086182a7a4b7d7086cef53760","sizes":"96x96","type":"image/png"},{"src":"icons/icon-144x144.png?v=c392780086182a7a4b7d7086cef53760","sizes":"144x144","type":"image/png"},{"src":"icons/icon-192x192.png?v=c392780086182a7a4b7d7086cef53760","sizes":"192x192","type":"image/png"},{"src":"icons/icon-256x256.png?v=c392780086182a7a4b7d7086cef53760","sizes":"256x256","type":"image/png"},{"src":"icons/icon-384x384.png?v=c392780086182a7a4b7d7086cef53760","sizes":"384x384","type":"image/png"},{"src":"icons/icon-512x512.png?v=c392780086182a7a4b7d7086cef53760","sizes":"512x512","type":"image/png"}]} \ No newline at end of file diff --git a/offline-plugin-app-shell-fallback/index.html b/offline-plugin-app-shell-fallback/index.html new file mode 100644 index 0000000..f7d5c9d --- /dev/null +++ b/offline-plugin-app-shell-fallback/index.html @@ -0,0 +1,67 @@ +
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3304179..0000000 --- a/package-lock.json +++ /dev/null @@ -1,17835 +0,0 @@ -{ - "name": "gatsby-starter-default", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/core": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.6.tgz", - "integrity": "sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.6", - "@babel/helpers": "^7.1.5", - "@babel/parser": "^7.1.6", - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.6", - "@babel/types": "^7.1.6", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.10", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/generator": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", - "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", - "requires": { - "@babel/types": "^7.1.6", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-builder-react-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz", - "integrity": "sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw==", - "requires": { - "@babel/types": "^7.0.0", - "esutils": "^2.0.0" - } - }, - "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", - "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", - "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", - "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" - }, - "@babel/helper-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", - "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", - "requires": { - "lodash": "^4.17.10" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", - "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", - "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-wrap-function": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz", - "integrity": "sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helpers": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.5.tgz", - "integrity": "sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg==", - "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.1.5" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } - } - }, - "@babel/parser": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", - "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz", - "integrity": "sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.0.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz", - "integrity": "sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/plugin-syntax-class-properties": "^7.0.0" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz", - "integrity": "sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.0.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz", - "integrity": "sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.0.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz", - "integrity": "sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.2.0" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz", - "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz", - "integrity": "sha512-cR12g0Qzn4sgkjrbrzWy2GE7m9vMl/sFkqZ3gIpAQdrvPDnLM8180i+ANDFIXfjHo9aqp0ccJlQ0QNZcFUbf9w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0.tgz", - "integrity": "sha512-Gt9xNyRrCHCiyX/ZxDGOcBnlJl0I3IWicpZRC4CdC0P5a/I07Ya2OAMEBU+J7GmRFVmIetqEYRko6QYRuKOESw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz", - "integrity": "sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz", - "integrity": "sha512-PdmL2AoPsCLWxhIr3kG2+F9v4WH06Q3z+NoGVpQgnUNGcagXHq5sB3OXxkSahKq9TLdNMN/AJzFYSOo8UKDMHg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz", - "integrity": "sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", - "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz", - "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", - "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz", - "integrity": "sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.10" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", - "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.1.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", - "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.3.tgz", - "integrity": "sha512-Mb9M4DGIOspH1ExHOUnn2UUXFOyVTiX84fXCd+6B5iWrQg/QMeeRmSwpZ9lnjYLSXtZwiw80ytVMr3zue0ucYw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz", - "integrity": "sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", - "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz", - "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", - "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz", - "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==", - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", - "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz", - "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==", - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz", - "integrity": "sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==", - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.1.3.tgz", - "integrity": "sha512-PvTxgjxQAq4pvVUZF3mD5gEtVDuId8NtWkJsZLEJZMZAW3TvgQl1pmydLLN1bM8huHFVVU43lf0uvjQj9FRkKw==", - "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz", - "integrity": "sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==", - "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz", - "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz", - "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==", - "requires": { - "@babel/helper-call-delegate": "^7.1.0", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.0.0.tgz", - "integrity": "sha512-BX8xKuQTO0HzINxT6j/GiCwoJB0AOMs0HmLbEnAvcte8U8rSkNa/eSCAY+l1OA4JnCVq2jw2p6U8QQryy2fTPg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.1.6.tgz", - "integrity": "sha512-iU/IUlPEYDRwuqLwqVobzPAZkBOQoZ9xRTBmj6ANuk5g/Egn/zdNGnXlSoKeNmKoYVeIRxx5GZhWmMhLik8dag==", - "requires": { - "@babel/helper-builder-react-jsx": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.0.0.tgz", - "integrity": "sha512-pymy+AK12WO4safW1HmBpwagUQRl9cevNX+82AIAtU1pIdugqcH+nuYP03Ja6B+N4gliAaKWAegIBL/ymALPHA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.0.0.tgz", - "integrity": "sha512-OSeEpFJEH5dw/TtxTg4nijl4nHBbhqbKL94Xo/Y17WKIf2qJWeIk/QeXACF19lG1vMezkxqruwnTjVizaW7u7w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", - "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", - "requires": { - "regenerator-transform": "^0.13.3" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", - "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", - "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", - "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", - "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", - "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", - "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", - "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" - } - }, - "@babel/polyfill": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", - "integrity": "sha512-dnrMRkyyr74CRelJwvgnnSUDh2ge2NCTyHVwpOdvRMHtJUyxLtMAfhBN3s64pY41zdw0kgiLPh6S20eb1NcX6Q==", - "requires": { - "core-js": "^2.5.7", - "regenerator-runtime": "^0.11.1" - } - }, - "@babel/preset-env": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.6.tgz", - "integrity": "sha512-YIBfpJNQMBkb6MCkjz/A9J76SNCSuGVamOVBgoUkLzpJD/z8ghHi9I42LQ4pulVX68N/MmImz6ZTixt7Azgexw==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.1.0", - "@babel/plugin-proposal-json-strings": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.0.0", - "@babel/plugin-syntax-async-generators": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.1.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.1.5", - "@babel/plugin-transform-classes": "^7.1.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-dotall-regex": "^7.0.0", - "@babel/plugin-transform-duplicate-keys": "^7.0.0", - "@babel/plugin-transform-exponentiation-operator": "^7.1.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.1.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-amd": "^7.1.0", - "@babel/plugin-transform-modules-commonjs": "^7.1.0", - "@babel/plugin-transform-modules-systemjs": "^7.0.0", - "@babel/plugin-transform-modules-umd": "^7.1.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.1.0", - "@babel/plugin-transform-parameters": "^7.1.0", - "@babel/plugin-transform-regenerator": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "@babel/plugin-transform-typeof-symbol": "^7.0.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "browserslist": "^4.1.0", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - } - } - }, - "@babel/preset-react": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", - "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" - } - }, - "@babel/runtime": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.5.tgz", - "integrity": "sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA==", - "requires": { - "regenerator-runtime": "^0.12.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", - "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" - } - } - }, - "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.1.2", - "@babel/types": "^7.1.2" - } - }, - "@babel/traverse": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", - "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.6", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.1.6", - "@babel/types": "^7.1.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.10" - }, - "dependencies": { - "debug": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", - "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/types": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", - "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@reach/router": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.2.1.tgz", - "integrity": "sha512-kTaX08X4g27tzIFQGRukaHmNbtMYDS3LEWIS8+l6OayGIw6Oyo1HIF/JzeuR2FoF9z6oV+x/wJSVSq4v8tcUGQ==", - "requires": { - "create-react-context": "^0.2.1", - "invariant": "^2.2.3", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "warning": "^3.0.0" - } - }, - "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" - }, - "@types/configstore": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz", - "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY=" - }, - "@types/debug": { - "version": "0.0.29", - "resolved": "http://registry.npmjs.org/@types/debug/-/debug-0.0.29.tgz", - "integrity": "sha1-oeUUrfvZLwOiJLpU1pMRHb8fN1Q=" - }, - "@types/events": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" - }, - "@types/get-port": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-0.0.4.tgz", - "integrity": "sha1-62u3Qj2fiItjJmDcfS/T5po1ZD4=" - }, - "@types/glob": { - "version": "5.0.36", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz", - "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==", - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/history": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.2.tgz", - "integrity": "sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q==" - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/mkdirp": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.3.29.tgz", - "integrity": "sha1-fyrX7FX5FEgvybHsS7GuYCjUYGY=" - }, - "@types/node": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.2.tgz", - "integrity": "sha512-RO4ig5taKmcrU4Rex8ojG1gpwFkjddzug9iPQSDvbewHN9vDpcFewevkaOK+KT+w1LeZnxbgOyfXwV4pxsQ4GQ==" - }, - "@types/prop-types": { - "version": "15.5.6", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.6.tgz", - "integrity": "sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ==" - }, - "@types/reach__router": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.2.tgz", - "integrity": "sha512-ktF+0xWesuojMlU8UR+7O9qU9Ff76gO/0Lc+QXQYpTDK0qz4a0l/fJYOLmMJKVY7LKGLBmB3TBs7Fvg4nibQsA==", - "requires": { - "@types/history": "*", - "@types/react": "*" - } - }, - "@types/react": { - "version": "16.7.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.6.tgz", - "integrity": "sha512-QBUfzftr/8eg/q3ZRgf/GaDP6rTYc7ZNem+g4oZM38C9vXyV8AWRWaTQuW5yCoZTsfHrN7b3DeEiUnqH9SrnpA==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/tmp": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.32.tgz", - "integrity": "sha1-DTyzECL4Qn6ljACK8yuA2hJspOM=" - }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==" - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==" - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==" - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==" - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "requires": { - "acorn": "^5.0.0" - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } - } - }, - "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", - "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=" - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "^2.0.0" - } - }, - "ansi-colors": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", - "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==" - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "apollo-link": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.4.tgz", - "integrity": "sha512-B1z+9H2nTyWEhMXRFSnoZ1vSuAYP+V/EdUJvRx9uZ8yuIBZMm6reyVtr1n0BWlKeSFyPieKJy2RLzmITAAQAMQ==", - "requires": { - "apollo-utilities": "^1.0.0", - "zen-observable-ts": "^0.8.11" - } - }, - "apollo-utilities": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.25.tgz", - "integrity": "sha512-AXvqkhni3Ir1ffm4SA1QzXn8k8I5BBl4PVKEyak734i4jFdp+xgfUyi2VCqF64TJlFTA/B73TRDUvO2D+tKtZg==", - "requires": { - "fast-json-stable-stringify": "^2.0.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "arch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", - "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==" - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "requires": { - "file-type": "^3.1.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - } - } - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" - }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-iterate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", - "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==" - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" - }, - "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=" - }, - "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", - "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", - "requires": { - "browserslist": "^3.2.8", - "caniuse-lite": "^1.0.30000864", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.23", - "postcss-value-parser": "^3.2.3" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "requires": { - "ast-types-flow": "0.0.7" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" - }, - "babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", - "requires": { - "@babel/highlight": "7.0.0-beta.44" - } - }, - "@babel/generator": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", - "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", - "requires": { - "@babel/types": "7.0.0-beta.44", - "jsesc": "^2.5.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", - "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.44", - "@babel/template": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", - "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", - "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - } - }, - "@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "babel-extract-comments": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", - "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", - "requires": { - "babylon": "^6.18.0" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "^2.0.0" - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - } - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-loader": { - "version": "8.0.0-beta.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.0-beta.4.tgz", - "integrity": "sha512-fQMCj8jRpF/2CPuVnpFrOb8+8pRuquKqoC+tspy5RWBmL37/2qc104sLLLqpwWltrFzpYb30utPpKc3H6P3ETQ==", - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "util.promisify": "^1.0.0" - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-add-module-exports": { - "version": "0.2.1", - "resolved": "http://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", - "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=" - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", - "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0" - } - }, - "babel-plugin-macros": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz", - "integrity": "sha512-NBVpEWN4OQ/bHnu1fyDaAaTPAjnhXCEPqr1RwqxrU7b6tZ2hypp+zX4hlNfmVGfClD5c3Sl6Hfj5TJNF5VG5aA==", - "requires": { - "cosmiconfig": "^5.0.5", - "resolve": "^1.8.1" - } - }, - "babel-plugin-remove-graphql-queries": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.5.1.tgz", - "integrity": "sha512-yRoSVCSxxCXUOcfy83yE4TFWvvX9bZRvcG/mAOKnD+uL+GCi/M2jBRKRXn6PKFY3YoxJ2hS1xqJ+ZZu9ghnhPw==" - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "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.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es3-member-expression-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz", - "integrity": "sha1-cz00RPPsxBvvjtGmpOCWV7iWnrs=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es3-property-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz", - "integrity": "sha1-sgeNWELiKr9A9z6M3pzTcRq9V1g=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - } - } - }, - "babel-preset-fbjs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-2.3.0.tgz", - "integrity": "sha512-ZOpAI1/bN0Y3J1ZAK9gRsFkHy9gGgJoDRUjtUCla/129LC7uViq9nIK22YdHfey8szohYoZY3f9L2lGOv0Edqw==", - "requires": { - "babel-plugin-check-es2015-constants": "^6.8.0", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-plugin-syntax-flow": "^6.8.0", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-plugin-syntax-trailing-function-commas": "^6.8.0", - "babel-plugin-transform-class-properties": "^6.8.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.8.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.8.0", - "babel-plugin-transform-es2015-block-scoping": "^6.8.0", - "babel-plugin-transform-es2015-classes": "^6.8.0", - "babel-plugin-transform-es2015-computed-properties": "^6.8.0", - "babel-plugin-transform-es2015-destructuring": "^6.8.0", - "babel-plugin-transform-es2015-for-of": "^6.8.0", - "babel-plugin-transform-es2015-function-name": "^6.8.0", - "babel-plugin-transform-es2015-literals": "^6.8.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.8.0", - "babel-plugin-transform-es2015-object-super": "^6.8.0", - "babel-plugin-transform-es2015-parameters": "^6.8.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.8.0", - "babel-plugin-transform-es2015-spread": "^6.8.0", - "babel-plugin-transform-es2015-template-literals": "^6.8.0", - "babel-plugin-transform-es3-member-expression-literals": "^6.8.0", - "babel-plugin-transform-es3-property-literals": "^6.8.0", - "babel-plugin-transform-flow-strip-types": "^6.8.0", - "babel-plugin-transform-object-rest-spread": "^6.8.0", - "babel-plugin-transform-react-display-name": "^6.8.0", - "babel-plugin-transform-react-jsx": "^6.8.0" - } - }, - "babel-preset-gatsby": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.1.4.tgz", - "integrity": "sha512-chkpgzQgSoNZauNsmE6j3vbrTj1LsjSUCGYMYwnyCRZkhneXo64ZAXVkkL8zmrrrLgBCrqbBvGTCkVAH4CnFiQ==", - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/preset-env": "^7.0.0", - "@babel/preset-react": "^7.0.0", - "babel-plugin-macros": "^2.4.2" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - } - } - }, - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==" - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "bail": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", - "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "requires": { - "callsite": "1.0.0" - } - }, - "better-queue": { - "version": "3.8.10", - "resolved": "https://registry.npmjs.org/better-queue/-/better-queue-3.8.10.tgz", - "integrity": "sha512-e3gwNZgDCnNWl0An0Tz6sUjKDV9m6aB+K9Xg//vYeo8+KiH8pWhLFxkawcXhm6FpM//GfD9IQv/kmvWCAVVpKA==", - "requires": { - "better-queue-memory": "^1.0.1", - "node-eta": "^0.9.0", - "uuid": "^3.0.0" - } - }, - "better-queue-memory": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/better-queue-memory/-/better-queue-memory-1.0.3.tgz", - "integrity": "sha512-QLFkfV+k/7e4L4FR7kqkXKtRi22kl68c/3AaBs0ArDSz0iiuAl0DjVlb6gM220jW7izLE5TRy7oXOd4Cxa0wog==" - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" - }, - "bin-build": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "requires": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - } - }, - "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "requires": { - "executable": "^1.0.0" - } - }, - "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "requires": { - "find-versions": "^1.0.0" - } - }, - "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "requires": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - }, - "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" - } - } - }, - "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "requires": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - } - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" - }, - "bl": { - "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" - }, - "bmp-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", - "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" - }, - "buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "buffer-to-vinyl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", - "requires": { - "file-type": "^3.1.0", - "readable-stream": "^2.0.2", - "uuid": "^2.0.1", - "vinyl": "^1.0.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "uuid": { - "version": "2.0.3", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - } - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", - "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", - "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-manager": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.9.0.tgz", - "integrity": "sha1-Xh9jF8oaJeQN3zZacWJ1evFSNT4=", - "requires": { - "async": "1.5.2", - "lru-cache": "4.0.0" - } - }, - "cache-manager-fs-hash": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/cache-manager-fs-hash/-/cache-manager-fs-hash-0.0.6.tgz", - "integrity": "sha512-p1nmcCQH4/jyKqEqUqPSDDcCo0PjFdv56OvtSdUrSIB7s8rAfwETLZ0CHXWdAPyg0QaER/deTvl1dCXyjZ5xAA==", - "requires": { - "es6-promisify": "^6.0.0", - "lockfile": "^1.0.4" - } - }, - "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - } - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" - }, - "callsites": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - } - } - }, - "caniuse-lite": { - "version": "1.0.30000910", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz", - "integrity": "sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ==" - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "requires": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - } - } - }, - "ccount": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", - "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==" - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "character-entities": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", - "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==" - }, - "character-entities-html4": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", - "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==" - }, - "character-entities-legacy": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", - "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==" - }, - "character-reference-invalid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", - "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==" - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.0", - "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6" - } - }, - "readable-stream": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", - "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "^1.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "clipboard": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", - "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==", - "requires": { - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collapse-white-space": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", - "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.0.tgz", - "integrity": "sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz", - "integrity": "sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA==", - "requires": { - "trim": "0.0.1" - } - }, - "command-exists": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" - }, - "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", - "requires": { - "mime-db": ">= 1.36.0 < 2" - } - }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.14", - "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "confusing-browser-globals": { - "version": "2.0.0-next.66cc7a90", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-2.0.0-next.66cc7a90.tgz", - "integrity": "sha512-pVhpqs/CvjFgJm6pIamnHI7xxutxywZr4WaG7/g3+1uTrJldBS+jKe/4NvGv0etgAAY6z2+iaogt4pkXM+6wag==" - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "console-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-hrtime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-2.0.0.tgz", - "integrity": "sha1-Gb+yyRYvnhHC8Ewsed4rfoCVxic=" - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "copyfiles": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-1.2.0.tgz", - "integrity": "sha1-qNo6xBqiIgrim9PFi2mEKU8sWTw=", - "requires": { - "glob": "^7.0.5", - "ltcdr": "^2.2.1", - "minimatch": "^3.0.3", - "mkdirp": "^0.5.1", - "noms": "0.0.0", - "through2": "^2.0.1" - } - }, - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", - "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-react-context": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", - "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", - "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" - } - }, - "cross-fetch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", - "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", - "requires": { - "node-fetch": "2.1.2", - "whatwg-fetch": "2.0.4" - }, - "dependencies": { - "node-fetch": { - "version": "2.1.2", - "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", - "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.4.tgz", - "integrity": "sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - } - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", - "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-selector-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.3.0.tgz", - "integrity": "sha1-XxrUPi2O77/cME/NOaUhZklD4+s=" - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - } - } - }, - "css-tree": { - "version": "1.0.0-alpha.28", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", - "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" - }, - "css-url-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=" - }, - "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==" - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.7.tgz", - "integrity": "sha512-AiXL90l+MDuQmRNyypG2P7ux7K4XklxYzNNUd5HXZCNcH8/N9bHPcpN97v8tXgRVeFL/Ed8iP8mVmAAu0ZpT7A==", - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.5", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cssnano-preset-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.5.tgz", - "integrity": "sha512-f1uhya0ZAjPYtDD58QkBB0R+uYdzHPei7cDxJyQQIHt5acdhyGXaSXl2nDLzWHLwGFbZcHxQtkJS8mmNwnxTvw==", - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.0", - "postcss-colormin": "^4.0.2", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.1", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.9", - "postcss-merge-rules": "^4.0.2", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.1", - "postcss-minify-params": "^4.0.1", - "postcss-minify-selectors": "^4.0.1", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.1", - "postcss-normalize-positions": "^4.0.1", - "postcss-normalize-repeat-style": "^4.0.1", - "postcss-normalize-string": "^4.0.1", - "postcss-normalize-timing-functions": "^4.0.1", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.1", - "postcss-ordered-values": "^4.1.1", - "postcss-reduce-initial": "^4.0.2", - "postcss-reduce-transforms": "^4.0.1", - "postcss-svgo": "^4.0.1", - "postcss-unique-selectors": "^4.0.1" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - } - } - }, - "csstype": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.7.tgz", - "integrity": "sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cwebp-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cwebp-bin/-/cwebp-bin-4.0.0.tgz", - "integrity": "sha1-7it/YzPTQm+1K7QF+m8uyLYolPQ=", - "requires": { - "bin-build": "^2.2.0", - "bin-wrapper": "^3.0.1", - "logalot": "^2.0.0" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" - }, - "damerau-levenshtein": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", - "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" - }, - "death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg=" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "requires": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" - }, - "default-gateway": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", - "requires": { - "execa": "^0.10.0", - "ip-regex": "^2.1.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detab": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.1.tgz", - "integrity": "sha512-/hhdqdQc5thGrqzjyO/pz76lDZ5GSuAs6goxOaKTsvPk7HNnzAyFN5lyHgqpX4/s1i66K8qMGj+VhA9504x7DQ==", - "requires": { - "repeat-string": "^1.5.4" - } - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" - }, - "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "devcert-san": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/devcert-san/-/devcert-san-0.3.3.tgz", - "integrity": "sha1-qnckR0Gy2DF3HAEfIu4l45atS6k=", - "requires": { - "@types/configstore": "^2.1.1", - "@types/debug": "^0.0.29", - "@types/get-port": "^0.0.4", - "@types/glob": "^5.0.30", - "@types/mkdirp": "^0.3.29", - "@types/node": "^7.0.11", - "@types/tmp": "^0.0.32", - "command-exists": "^1.2.2", - "configstore": "^3.0.0", - "debug": "^2.6.3", - "eol": "^0.8.1", - "get-port": "^3.0.0", - "glob": "^7.1.1", - "mkdirp": "^0.5.1", - "tmp": "^0.0.31", - "tslib": "^1.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "^7.1.2" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", - "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==" - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "requires": { - "domelementtype": "1" - } - }, - "domready": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", - "integrity": "sha1-kfJS5Ze2Wvd+dFriTdAYXV4m1Yw=" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "4.0.0", - "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" - }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "requires": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" - }, - "dependencies": { - "got": { - "version": "5.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" - } - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" - }, - "dependencies": { - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==" - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "email-addresses": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.0.3.tgz", - "integrity": "sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg==", - "dev": true - }, - "emoji-regex": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", - "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "envinfo": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.12.1.tgz", - "integrity": "sha512-pwdo0/G3CIkQ0y6PCXq4RdkvId2elvtPCJMG0konqlrfkWQbf1DWeH9K2b/cvu2YgGvPPTOnonZxXM1gikFu1w==" - }, - "eol": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.8.1.tgz", - "integrity": "sha1-3vwyJJkMfspzuzRGGlbPncJHYdA=" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", - "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", - "requires": { - "stackframe": "^1.0.4" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" - }, - "es6-promisify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.1.tgz", - "integrity": "sha512-J3ZkwbEnnO+fGAKrjVpeUAnZshAdfZvbhQpqfIH9kSAspReRC4nJnu8ewm55b4y9ElyeuhCTzJD0XiH8Tsbhlw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "4.19.1", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "eslint-config-react-app": { - "version": "3.0.0-next.66cc7a90", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.0-next.66cc7a90.tgz", - "integrity": "sha512-6J+fEOLy7uE+fxpGERi8Yts9vNEgul6AXbHhdvGRj+4Xpus7jR7Q4fu1oXmnuRwVPBxJ/MQkcpdFa2m8iBG20Q==", - "requires": { - "confusing-browser-globals": "2.0.0-next.66cc7a90" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.1.tgz", - "integrity": "sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ==", - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - } - }, - "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz", - "integrity": "sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==", - "requires": { - "lodash": "^4.17.10" - } - }, - "eslint-plugin-graphql": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-2.1.1.tgz", - "integrity": "sha512-JT2paUyu3e9ZDnroSshwUMc6pKcnkfXTsZInX1+/rPotvqOLVLtdrx/cmfb7PTJwjiEAshwcpm3/XPdTpsKJPw==", - "requires": { - "graphql-config": "^2.0.1", - "lodash": "^4.11.1" - } - }, - "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz", - "integrity": "sha512-7gSSmwb3A+fQwtw0arguwMdOdzmKUgnUcbSNlo+GjKLAQFuC2EZxWqG9XHRI8VscBJD5a8raz3RuxQNFW+XJbw==", - "requires": { - "aria-query": "^3.0.0", - "array-includes": "^3.0.3", - "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.1", - "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^6.5.1", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1" - } - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" - }, - "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "requires": { - "original": ">=0.0.5" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "exec-buffer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", - "requires": { - "execa": "^0.7.0", - "p-finally": "^1.0.0", - "pify": "^3.0.0", - "rimraf": "^2.5.4", - "tempfile": "^2.0.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - } - } - } - }, - "exec-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", - "requires": { - "async-each-series": "^1.1.0", - "object-assign": "^4.1.0" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", - "requires": { - "meow": "^3.1.0" - } - }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" - }, - "exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "^2.1.0" - }, - "dependencies": { - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "expand-template": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", - "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "express-graphql": { - "version": "0.6.12", - "resolved": "http://registry.npmjs.org/express-graphql/-/express-graphql-0.6.12.tgz", - "integrity": "sha512-ouLWV0hRw4hnaLtXzzwhdC79ewxKbY2PRvm05mPc/zOH5W5WVCHDQ1SmNxEPBQdUeeSNh29aIqW9zEQkA3kMuA==", - "requires": { - "accepts": "^1.3.0", - "content-type": "^1.0.4", - "http-errors": "^1.3.0", - "raw-body": "^2.3.2" - } - }, - "ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "requires": { - "mime-db": "^1.28.0" - } - }, - "ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", - "requires": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "fast-glob": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz", - "integrity": "sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "requires": { - "bser": "^2.0.0" - } - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - } - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "requires": { - "pend": "~1.2.0" - } - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-loader": { - "version": "1.1.11", - "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.4.5" - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=" - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "filenamify-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", - "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", - "dev": true, - "requires": { - "filenamify": "^1.0.0", - "humanize-url": "^1.0.0" - } - }, - "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", - "requires": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" - } - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "friendly-errors-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", - "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", - "requires": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-copy-file-sync": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz", - "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==" - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=" - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "requires": { - "minipass": "^2.2.1" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" - }, - "gatsby": { - "version": "2.0.53", - "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.0.53.tgz", - "integrity": "sha512-rYMRUq/TR4lTFGspa4hvAVEEGUkqCeWDdNfaAsK/UWZNOuoL2jLBITOvMgenVADSdO9Oj6Czuk4X6Do2c1P9+Q==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/polyfill": "^7.0.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@reach/router": "^1.1.1", - "autoprefixer": "^8.6.5", - "babel-core": "7.0.0-bridge.0", - "babel-eslint": "^8.2.2", - "babel-loader": "8.0.0-beta.4", - "babel-plugin-add-module-exports": "^0.2.1", - "babel-plugin-dynamic-import-node": "^1.2.0", - "babel-plugin-remove-graphql-queries": "^2.5.1", - "babel-preset-gatsby": "^0.1.4", - "better-queue": "^3.8.6", - "bluebird": "^3.5.0", - "cache-manager": "^2.9.0", - "cache-manager-fs-hash": "^0.0.6", - "chalk": "^2.3.2", - "chokidar": "^2.0.2", - "common-tags": "^1.4.0", - "compression": "^1.7.3", - "convert-hrtime": "^2.0.0", - "copyfiles": "^1.2.0", - "core-js": "^2.5.0", - "css-loader": "^1.0.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "detect-port": "^1.2.1", - "devcert-san": "^0.3.3", - "domready": "^1.0.8", - "dotenv": "^4.0.0", - "eslint": "^4.19.1", - "eslint-config-react-app": "3.0.0-next.66cc7a90", - "eslint-loader": "^2.0.0", - "eslint-plugin-flowtype": "^2.46.1", - "eslint-plugin-graphql": "^2.0.0", - "eslint-plugin-import": "^2.9.0", - "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.8.2", - "express": "^4.16.3", - "express-graphql": "^0.6.12", - "fast-levenshtein": "~2.0.4", - "file-loader": "^1.1.11", - "flat": "^4.0.0", - "friendly-errors-webpack-plugin": "^1.6.1", - "fs-extra": "^5.0.0", - "gatsby-cli": "^2.4.5", - "gatsby-link": "^2.0.6", - "gatsby-plugin-page-creator": "^2.0.4", - "gatsby-react-router-scroll": "^2.0.1", - "glob": "^7.1.1", - "graphql": "^0.13.2", - "graphql-relay": "^0.5.5", - "graphql-skip-limit": "^2.0.1", - "graphql-tools": "^3.0.4", - "graphql-type-json": "^0.2.1", - "hash-mod": "^0.0.5", - "invariant": "^2.2.4", - "is-relative": "^1.0.0", - "is-relative-url": "^2.0.0", - "jest-worker": "^23.2.0", - "joi": "12.x.x", - "json-loader": "^0.5.7", - "json-stringify-safe": "^5.0.1", - "kebab-hash": "^0.1.2", - "lodash": "^4.17.10", - "md5": "^2.2.1", - "md5-file": "^3.1.1", - "mime": "^2.2.0", - "mini-css-extract-plugin": "^0.4.0", - "mitt": "^1.1.2", - "mkdirp": "^0.5.1", - "moment": "^2.21.0", - "name-all-modules-plugin": "^1.0.1", - "normalize-path": "^2.1.1", - "null-loader": "^0.1.1", - "opentracing": "^0.14.3", - "opn": "^5.3.0", - "optimize-css-assets-webpack-plugin": "^5.0.1", - "parse-filepath": "^1.0.1", - "physical-cpu-count": "^2.0.0", - "postcss-flexbugs-fixes": "^3.0.0", - "postcss-loader": "^2.1.3", - "raw-loader": "^0.5.1", - "react-dev-utils": "^4.2.1", - "react-error-overlay": "^3.0.0", - "react-hot-loader": "^4.1.0", - "redux": "^4.0.0", - "relay-compiler": "1.5.0", - "request": "^2.85.0", - "shallow-compare": "^1.2.2", - "sift": "^5.1.0", - "signal-exit": "^3.0.2", - "slash": "^1.0.0", - "socket.io": "^2.0.3", - "string-similarity": "^1.2.0", - "style-loader": "^0.21.0", - "terser-webpack-plugin": "^1.0.2", - "type-of": "^2.0.1", - "url-loader": "^1.0.1", - "uuid": "^3.1.0", - "v8-compile-cache": "^1.1.0", - "webpack": "^4.12.0", - "webpack-dev-middleware": "^3.0.1", - "webpack-dev-server": "^3.1.1", - "webpack-hot-middleware": "^2.21.0", - "webpack-merge": "^4.1.0", - "webpack-stats-plugin": "^0.1.5", - "yaml-loader": "^0.5.0" - }, - "dependencies": { - "gatsby-cli": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.4.5.tgz", - "integrity": "sha512-r1s79aXjPgur561UuBi8iTvGr+VIxqzKRBWYNxuWQADC352LGk/j5qTFdwC/jgfIQDE0Ue7hWC9UM1LYntdVcw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/runtime": "^7.0.0", - "bluebird": "^3.5.0", - "common-tags": "^1.4.0", - "convert-hrtime": "^2.0.0", - "core-js": "^2.5.0", - "envinfo": "^5.8.1", - "execa": "^0.8.0", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^4.0.1", - "hosted-git-info": "^2.6.0", - "lodash": "^4.17.10", - "opentracing": "^0.14.3", - "pretty-error": "^2.1.1", - "resolve-cwd": "^2.0.0", - "source-map": "^0.5.7", - "stack-trace": "^0.0.10", - "update-notifier": "^2.3.0", - "yargs": "^11.1.0", - "yurnalist": "^0.2.1" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - } - } - }, - "gatsby-image": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/gatsby-image/-/gatsby-image-2.0.20.tgz", - "integrity": "sha512-AxLNe1W9QbVr23iD7h/ryoBOo1PfpjLm2tgZ7ITi5NQqMOIn23YCUfWtSWDWQFd226twyfsHzJFr5XZM3Lyl0g==", - "requires": { - "@babel/runtime": "^7.0.0", - "prop-types": "^15.6.1" - } - }, - "gatsby-link": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.0.6.tgz", - "integrity": "sha512-JZM1FLjAH1zDIyUAV9QGpufxoQ3q7JmWtnXW+op5PZTjC1aLJefKYwkTYExYJ6v+ti1ketTauE2eckjQgKiO4w==", - "requires": { - "@babel/runtime": "^7.0.0", - "@reach/router": "^1.1.1", - "@types/reach__router": "^1.0.0", - "prop-types": "^15.6.1" - } - }, - "gatsby-plugin-catch-links": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/gatsby-plugin-catch-links/-/gatsby-plugin-catch-links-2.0.9.tgz", - "integrity": "sha512-0I78VTwy9GJkh8nEt33VASo/cvBmDtdChoISQ+U0Pio5pXEXT2RQIesuHwcm4pXG/VRDVnEYxa95PLUccW5vFg==", - "requires": { - "@babel/runtime": "^7.0.0", - "escape-string-regexp": "^1.0.5" - } - }, - "gatsby-plugin-manifest": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/gatsby-plugin-manifest/-/gatsby-plugin-manifest-2.0.9.tgz", - "integrity": "sha512-QhU3HCGUT62nD4OGBVGIRivVS9vIkXPlRl3xdW0iInGZRLcwid0NYjpY3rWKi/Bji9dDGzT4ZcghpGYcEkCNdA==", - "requires": { - "@babel/runtime": "^7.0.0", - "bluebird": "^3.5.0", - "sharp": "^0.21.0" - } - }, - "gatsby-plugin-offline": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/gatsby-plugin-offline/-/gatsby-plugin-offline-2.0.16.tgz", - "integrity": "sha512-kKZ8Jmn+OMuV3UoapRRz+v/DjdtsKT8DHgyHwAYaHLpAt0ZeJcI/+dUMVaS9wHaBmTz/rnPlFBLhG3RQFSOHPw==", - "requires": { - "@babel/runtime": "^7.0.0", - "cheerio": "^1.0.0-rc.2", - "idb-keyval": "^3.1.0", - "lodash": "^4.17.10", - "workbox-build": "^3.6.3" - } - }, - "gatsby-plugin-page-creator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.0.4.tgz", - "integrity": "sha512-WgU1o4hvqPT2JjUdyF1yPXaVeELvObZkYKkUNMx+RDf5WVcyyuE+s+7cEAH+80c8x5lgPrLIbe4/qxrFtPWSHQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "bluebird": "^3.5.0", - "chokidar": "^1.7.0", - "fs-exists-cached": "^1.0.0", - "glob": "^7.1.1", - "lodash": "^4.17.10", - "micromatch": "^3.1.10", - "parse-filepath": "^1.0.1", - "slash": "^1.0.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - }, - "dependencies": { - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "gatsby-plugin-react-helmet": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.0.2.tgz", - "integrity": "sha512-4Gh9ciOvDk0TogvEFdhwgxlLTqsqiz6IdJXOSA95N9rhxaWCWicsTBb0JvmokLARGH4EQ8f0PssQITnn93vrzw==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "gatsby-plugin-sharp": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/gatsby-plugin-sharp/-/gatsby-plugin-sharp-2.0.15.tgz", - "integrity": "sha512-MjZL3wonmlf6tdTOAPNbLNXPegKZ6DSQkoEwNistVSG6kplfBv/50ThNX+ExCVG4y/XaMGCv1QF9vCKMpDlOpg==", - "requires": { - "@babel/runtime": "^7.0.0", - "async": "^2.1.2", - "bluebird": "^3.5.0", - "fs-exists-cached": "^1.0.0", - "fs-extra": "^7.0.0", - "imagemin": "^6.0.0", - "imagemin-mozjpeg": "^7.0.0", - "imagemin-pngquant": "^6.0.0", - "imagemin-webp": "^4.1.0", - "lodash": "^4.17.10", - "mini-svg-data-uri": "^1.0.0", - "potrace": "^2.1.1", - "probe-image-size": "^4.0.0", - "progress": "^1.1.8", - "sharp": "^0.21.0", - "svgo": "^0.7.2" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "requires": { - "lodash": "^4.17.10" - } - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "^1.1.2" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "progress": { - "version": "1.1.8", - "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - } - } - }, - "gatsby-react-router-scroll": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.0.1.tgz", - "integrity": "sha512-Q31vH0/PF1dMm18GdxUe/lkS+ri6tTq16JCFpUMSVEkob5V1zo7PDYR2+j/OHI0NnQWJQs5nm/kQ7/D08WMI1A==", - "requires": { - "@babel/runtime": "^7.0.0", - "scroll-behavior": "^0.9.9", - "warning": "^3.0.0" - } - }, - "gatsby-remark-autolink-headers": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-2.0.12.tgz", - "integrity": "sha512-TI7dpdHOUohIWCW7i8ta4zZAdWG5C2ZmrHMC9flWGWQ62oq6Q2eW+I1I/v//UZ+vJ1dRaSX2lmsVFmt87rLVHQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "github-slugger": "^1.1.1", - "mdast-util-to-string": "^1.0.2", - "unist-util-visit": "^1.3.0" - } - }, - "gatsby-remark-copy-linked-files": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.0.7.tgz", - "integrity": "sha512-k2glE7k/ibeJG5AbRhuSnDBqC4uhl64UzwSV/w0VtmeDroCtcRKPGcTrMmzxFTci/fL7YNta2LZUD+YZ8wLfQA==", - "requires": { - "@babel/runtime": "^7.0.0", - "cheerio": "^1.0.0-rc.2", - "fs-extra": "^4.0.1", - "is-relative-url": "^2.0.0", - "lodash": "^4.17.10", - "path-is-inside": "^1.0.2", - "probe-image-size": "^4.0.0", - "unist-util-visit": "^1.3.0" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "gatsby-remark-external-links": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/gatsby-remark-external-links/-/gatsby-remark-external-links-0.0.4.tgz", - "integrity": "sha512-JIKZguAGoGlzsJusfCb4JKM5E6JUEDbtlBkbErt7CdMnfBP+AldZeMQEQWK5xsJ5uXCyc4qqcBWR8vp0afFpOw==", - "requires": { - "babel-runtime": "^6.26.0", - "is-relative-url": "^2.0.0", - "unist-util-find": "^1.0.1", - "unist-util-visit": "^1.1.3" - } - }, - "gatsby-remark-images": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gatsby-remark-images/-/gatsby-remark-images-3.0.1.tgz", - "integrity": "sha512-dWqubKmFuT/yTc+ttBtoLxmBfWWHfUd+vDPa/FczWJsQ/8VpaVe0mPDAhG8+RQ3ZVWfU4WMQwF0NjZ/xfL00qg==", - "requires": { - "@babel/runtime": "^7.0.0", - "cheerio": "^1.0.0-rc.2", - "is-relative-url": "^2.0.0", - "lodash": "^4.17.10", - "slash": "^1.0.0", - "unist-util-select": "^1.5.0", - "unist-util-visit-parents": "^2.0.1" - } - }, - "gatsby-remark-katex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gatsby-remark-katex/-/gatsby-remark-katex-3.0.1.tgz", - "integrity": "sha512-m2kJWWmk3fc0cQd6Zj0sLX0TnW+ixfpVZmUEyNeTDiuwZMCMd/ztLx9OO2aAeqF5eqQsCptCg9FFop1SiXNyOw==", - "requires": { - "@babel/runtime": "^7.0.0", - "remark-math": "^1.0.3", - "unist-util-visit": "^1.3.0" - } - }, - "gatsby-remark-prismjs": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-3.1.4.tgz", - "integrity": "sha512-MIfwxEezbilagrg7cP/0PfKmiCfB6ppE40+lopyg0v+0q1IIGHxvhdyZie9q0YhC1/CeHrqCL1v7Ea8e2GRi+w==", - "requires": { - "@babel/runtime": "^7.0.0", - "parse-numeric-range": "^0.0.2", - "unist-util-visit": "^1.3.0" - } - }, - "gatsby-source-filesystem": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.0.8.tgz", - "integrity": "sha512-WbWZ27JeoAHLSGxps4T4EzQFXCDz3IYS+Sc+dZ2xHukbRDMs7QGjDzBwkcMryPsKLY2o2muXk+CtALDExKCwsg==", - "requires": { - "@babel/runtime": "^7.0.0", - "better-queue": "^3.8.7", - "bluebird": "^3.5.0", - "chokidar": "^1.7.0", - "file-type": "^10.2.0", - "fs-extra": "^5.0.0", - "got": "^7.1.0", - "md5-file": "^3.1.1", - "mime": "^2.2.0", - "pretty-bytes": "^4.0.2", - "read-chunk": "^3.0.0", - "slash": "^1.0.0", - "valid-url": "^1.0.9", - "xstate": "^3.1.0" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "file-type": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.5.0.tgz", - "integrity": "sha512-zxVkZQY5rtw2H75SMPQUXJveD7uWGdaJJtsVBFfdW3m0W6UeBXzUwiIENFKQ2aRuPozTgBZYV6WhyeGOvs5YsA==" - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "read-chunk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.0.0.tgz", - "integrity": "sha512-8lBUVPjj9TC5bKLBacB+rpexM03+LWiYbv6ma3BeWmUYXGxqA1WNNgIZHq/iIsCrbFMzPhFbkOqdsyOFRnuoXg==", - "requires": { - "pify": "^4.0.0", - "with-open-file": "^0.1.3" - } - } - } - }, - "gatsby-transformer-remark": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.1.15.tgz", - "integrity": "sha512-4epqs8BNyQBHMISQM3fvBulwWoOECCGrGkbO2+LVb9NEBlEEw9NBGiT6nvXrDUag47XgAM/5+l4dRu+Xl9urAA==", - "requires": { - "@babel/runtime": "^7.0.0", - "bluebird": "^3.5.0", - "gray-matter": "^4.0.0", - "hast-util-raw": "^4.0.0", - "hast-util-to-html": "^4.0.0", - "lodash": "^4.17.10", - "mdast-util-to-hast": "^3.0.0", - "mdast-util-toc": "^2.0.1", - "remark": "^9.0.0", - "remark-parse": "^5.0.0", - "remark-retext": "^3.1.0", - "remark-stringify": "^5.0.0", - "retext-english": "^3.0.0", - "sanitize-html": "^1.18.2", - "underscore.string": "^3.3.4", - "unified": "^6.1.5", - "unist-util-remove-position": "^1.1.2", - "unist-util-select": "^1.5.0", - "unist-util-visit": "^1.3.0" - } - }, - "gatsby-transformer-sharp": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/gatsby-transformer-sharp/-/gatsby-transformer-sharp-2.1.8.tgz", - "integrity": "sha512-tL/6fKGQqTOeDK54peVDPyV27S1iH0ZTJNQpxPmvXDtWFudEcx9YHxg4DMauQsmz/qTs3nwRCgl3eEqIPLokYA==", - "requires": { - "@babel/runtime": "^7.0.0", - "bluebird": "^3.5.0", - "fs-extra": "^4.0.2", - "potrace": "^2.1.1", - "probe-image-size": "^4.0.0", - "sharp": "^0.21.0" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", - "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==" - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" - }, - "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", - "requires": { - "rc": "^1.1.2" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "gh-pages": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.0.1.tgz", - "integrity": "sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg==", - "dev": true, - "requires": { - "async": "^2.6.1", - "commander": "^2.18.0", - "email-addresses": "^3.0.1", - "filenamify-url": "^1.0.0", - "fs-extra": "^7.0.0", - "globby": "^6.1.0", - "graceful-fs": "^4.1.11", - "rimraf": "^2.6.2" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "github-slugger": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.0.tgz", - "integrity": "sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q==", - "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" - } - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", - "requires": { - "min-document": "^2.19.0", - "process": "~0.5.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", - "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==" - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "requires": { - "sparkles": "^1.0.0" - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, - "got": { - "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "graphql": { - "version": "0.13.2", - "resolved": "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz", - "integrity": "sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog==", - "requires": { - "iterall": "^1.2.1" - } - }, - "graphql-config": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-2.2.1.tgz", - "integrity": "sha512-U8+1IAhw9m6WkZRRcyj8ZarK96R6lQBQ0an4lp76Ps9FyhOXENC5YQOxOFGm5CxPrX2rD0g3Je4zG5xdNJjwzQ==", - "requires": { - "graphql-import": "^0.7.1", - "graphql-request": "^1.5.0", - "js-yaml": "^3.10.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.4" - } - }, - "graphql-import": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.7.1.tgz", - "integrity": "sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw==", - "requires": { - "lodash": "^4.17.4", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "graphql-relay": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.5.5.tgz", - "integrity": "sha1-1oFebt1hjoeNXZIcE/xmAz7IZ+I=" - }, - "graphql-request": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", - "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", - "requires": { - "cross-fetch": "2.2.2" - } - }, - "graphql-skip-limit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/graphql-skip-limit/-/graphql-skip-limit-2.0.1.tgz", - "integrity": "sha512-a+RbtflaCGqmahK7w0M23kXNv4MV17pCPz0EnyQ/Ve79/k2c9EHNjfwj8hWk+jAXoxZ1SDJeUoeFAZhS9kwljA==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "graphql-tools": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-3.1.1.tgz", - "integrity": "sha512-yHvPkweUB0+Q/GWH5wIG60bpt8CTwBklCSzQdEHmRUgAdEQKxw+9B7zB3dG7wB3Ym7M7lfrS4Ej+jtDZfA2UXg==", - "requires": { - "apollo-link": "^1.2.2", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" - } - }, - "graphql-type-json": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.2.1.tgz", - "integrity": "sha1-0sF34vGxfYf4EHLNBTEcB1S6pCA=" - }, - "gray-matter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.1.tgz", - "integrity": "sha512-p0MADBEBl1CohV7nRZ8sVinBexEe3CKVhh0A0QIHKpcbRoxB0VgeMpRPjW/HBHIPLAKrpIIIm5mZ6hKu3E+iQg==", - "requires": { - "js-yaml": "^3.11.0", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - } - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "gulp-decompress": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", - "requires": { - "archive-type": "^3.0.0", - "decompress": "^3.0.0", - "gulp-util": "^3.0.1", - "readable-stream": "^2.0.2" - } - }, - "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==" - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.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.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "requires": { - "glogg": "^1.0.0" - } - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "requires": { - "duplexer": "^0.1.1" - } - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", - "requires": { - "has-symbol-support-x": "^1.4.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash-mod": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/hash-mod/-/hash-mod-0.0.5.tgz", - "integrity": "sha1-2vHklzqRFmQ0Z9VO52kLQ++ALsw=" - }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hast-to-hyperscript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz", - "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.2.1", - "unist-util-is": "^2.0.0", - "web-namespaces": "^1.1.2" - } - }, - "hast-util-from-parse5": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-4.0.2.tgz", - "integrity": "sha512-I6dtjsGtDqz4fmGSiFClFyiXdKhj5bPceS6intta7k/VDuiKz9P61C6hO6WMiNNmEm1b/EtBH8f+juvz4o0uwQ==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^4.0.0", - "property-information": "^4.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hast-util-is-element": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.2.tgz", - "integrity": "sha512-4MEtyofNi3ZunPFrp9NpTQdNPN24xvLX3M+Lr/RGgPX6TLi+wR4/DqeoyQ7lwWcfUp4aevdt4RR0r7ZQPFbHxw==" - }, - "hast-util-parse-selector": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.1.tgz", - "integrity": "sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw==" - }, - "hast-util-raw": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-4.0.0.tgz", - "integrity": "sha512-5xYHyEJMCf8lX/NT4iA5z6N43yoFsrJqXJ5GWwAbLn815URbIz+UNNFEgid33F9paZuDlqVKvB+K3Aqu5+DdSw==", - "requires": { - "hast-util-from-parse5": "^4.0.2", - "hast-util-to-parse5": "^4.0.1", - "html-void-elements": "^1.0.1", - "parse5": "^5.0.0", - "unist-util-position": "^3.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.1", - "zwitch": "^1.0.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - } - } - }, - "hast-util-to-html": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-4.0.1.tgz", - "integrity": "sha512-2emzwyf0xEsc4TBIPmDJmBttIw8R4SXAJiJZoiRR/s47ODYWgOqNoDbf2SJAbMbfNdFWMiCSOrI3OVnX6Qq2Mg==", - "requires": { - "ccount": "^1.0.0", - "comma-separated-tokens": "^1.0.1", - "hast-util-is-element": "^1.0.0", - "hast-util-whitespace": "^1.0.0", - "html-void-elements": "^1.0.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "stringify-entities": "^1.0.1", - "unist-util-is": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "hast-util-to-parse5": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-4.0.1.tgz", - "integrity": "sha512-U/61W+fsNfBpCyJBB5Pt3l5ypIfgXqEyW9pyrtxF7XrqDJHzcFrYpnC94d0JDYjvobLpYCzcU9srhMRPEO1YXw==", - "requires": { - "hast-to-hyperscript": "^5.0.0", - "property-information": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.1", - "zwitch": "^1.0.0" - } - }, - "hast-util-whitespace": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.2.tgz", - "integrity": "sha512-4JT8B0HKPHBMFZdDQzexjxwhKx9TrpV/+uelvmqlPu8RqqDrnNIEHDtDZCmgE+4YmcFAtKVPLmnY3dQGRaN53A==" - }, - "hastscript": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-4.1.0.tgz", - "integrity": "sha512-bOTn9hEfzewvHyXdbYGKqOr/LOz+2zYhKbC17U2YAjd16mnjqB1BQ0nooM/RdMy/htVyli0NAznXiBtwDi1cmQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^4.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" - }, - "html-void-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.3.tgz", - "integrity": "sha512-SaGhCDPXJVNrQyKMtKy24q6IMdXg5FCPN3z+xizxw9l+oXQw5fOoaj/ERU5KqWhSYhXtW5bWthlDbTDLBhJQrA==" - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "requires": { - "domelementtype": "1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "humanize-url": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", - "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", - "dev": true, - "requires": { - "normalize-url": "^1.0.0", - "strip-url-auth": "^1.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - } - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "requires": { - "postcss": "^6.0.1" - } - }, - "idb-keyval": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-3.1.0.tgz", - "integrity": "sha512-iFwFN5n00KNNnVxlOOK280SJJfXWY7pbMUOQXdIXehvvc/mGCV/6T2Ae+Pk2KwAkkATDTwfMavOiDH5lrJKWXQ==" - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "imagemin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.0.0.tgz", - "integrity": "sha512-m4Mxwt2QvCp1F85HXoTungXk0Y6XzuvQGqrK9qEddQfo/7x4aZjRENmyXXfc29ei4Mk55rW002bORG86YM3/aQ==", - "requires": { - "file-type": "^8.1.0", - "globby": "^8.0.1", - "make-dir": "^1.0.0", - "p-pipe": "^1.1.0", - "pify": "^3.0.0", - "replace-ext": "^1.0.0" - }, - "dependencies": { - "globby": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - } - } - }, - "imagemin-mozjpeg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-7.0.0.tgz", - "integrity": "sha1-2SZHf8bvXzp2ikIi97LYCNPrpWg=", - "requires": { - "execa": "^0.8.0", - "is-jpg": "^1.0.0", - "mozjpeg": "^5.0.0" - } - }, - "imagemin-pngquant": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-6.0.0.tgz", - "integrity": "sha512-lZ87Y7u0UaJuhtQZ2wkKyxsFeNTEv1C5xxoHN7jFD89rKpiC/Qu2cIYGAOypOsxqAxWlsHaoz0hJlFFdCnG6Zg==", - "requires": { - "execa": "^0.10.0", - "is-png": "^1.0.0", - "is-stream": "^1.1.0", - "pngquant-bin": "^5.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "imagemin-webp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/imagemin-webp/-/imagemin-webp-4.1.0.tgz", - "integrity": "sha1-7/0AFg2EVrlcveX9JsMtZLAxgGI=", - "requires": { - "cwebp-bin": "^4.0.0", - "exec-buffer": "^3.0.0", - "is-cwebp-readable": "^2.0.1" - } - }, - "immutable": { - "version": "3.7.6", - "resolved": "http://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", - "requires": { - "default-gateway": "^2.6.0", - "ipaddr.js": "^1.5.2" - } - }, - "into-stream": { - "version": "3.1.0", - "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", - "requires": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-alphabetical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", - "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==" - }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=" - }, - "is-alphanumerical": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", - "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-bzip2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-cwebp-readable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-cwebp-readable/-/is-cwebp-readable-2.0.1.tgz", - "integrity": "sha1-r7k7DAq9CiUQEBauM66ort+SbSY=", - "requires": { - "file-type": "^4.3.0" - }, - "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-decimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", - "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=" - }, - "is-hexadecimal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", - "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==" - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-jpg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", - "integrity": "sha1-KW1X/dmc4BBDSnKD40armhA16XU=" - }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=" - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-png": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", - "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=" - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-relative-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-2.0.0.tgz", - "integrity": "sha1-cpAtf+BLPUeS59sV+duEtyBMnO8=", - "requires": { - "is-absolute-url": "^2.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-tar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" - }, - "is-whitespace-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", - "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-word-character": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", - "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "is-zip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "requires": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" - } - }, - "iterall": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", - "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" - }, - "jest-worker": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", - "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", - "requires": { - "merge-stream": "^1.0.1" - } - }, - "jimp": { - "version": "0.2.28", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", - "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", - "requires": { - "bignumber.js": "^2.1.0", - "bmp-js": "0.0.3", - "es6-promise": "^3.0.2", - "exif-parser": "^0.1.9", - "file-type": "^3.1.0", - "jpeg-js": "^0.2.0", - "load-bmfont": "^1.2.3", - "mime": "^1.3.4", - "mkdirp": "0.5.1", - "pixelmatch": "^4.0.0", - "pngjs": "^3.0.0", - "read-chunk": "^1.0.1", - "request": "^2.65.0", - "stream-to-buffer": "^0.1.0", - "tinycolor2": "^1.1.2", - "url-regex": "^3.0.0" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } - } - }, - "joi": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-12.0.0.tgz", - "integrity": "sha512-z0FNlV4NGgjQN1fdtHYXf5kmgludM65fG/JlXzU6+rwkt9U5UWuXVYnXa2FpK0u6+qBuCmrm5byPNuiiddAHvQ==", - "requires": { - "hoek": "4.x.x", - "isemail": "3.x.x", - "topo": "2.x.x" - } - }, - "jpeg-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", - "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" - }, - "js-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", - "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", - "requires": { - "array-includes": "^3.0.3" - } - }, - "katex": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.10.0.tgz", - "integrity": "sha512-/WRvx+L1eVBrLwX7QzKU1dQuaGnE7E8hDvx3VWfZh9HbMiCfsKWJNnYZ0S8ZMDAfAyDSofdyXIrH/hujF1fYXg==", - "requires": { - "commander": "^2.16.0" - } - }, - "kebab-hash": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/kebab-hash/-/kebab-hash-0.1.2.tgz", - "integrity": "sha512-BTZpq3xgISmQmAVzkISy4eUutsUA7s4IEFlCwOBJjvSFOwyR7I+fza+tBc/rzYWK/NrmFHjfU1IhO3lu29Ib/w==", - "requires": { - "lodash.kebabcase": "^4.1.1" - } - }, - "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "requires": { - "json-buffer": "3.0.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", - "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" - } - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=" - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-bmfont": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", - "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", - "requires": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "loader-fs-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==" - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "lodash.every": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", - "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.iteratee": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.iteratee/-/lodash.iteratee-4.7.0.tgz", - "integrity": "sha1-vkF32yiajMw8CZDx2ya1si/BVUw=" - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, - "lodash.maxby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz", - "integrity": "sha1-CCJABo88eiJ6oAqDgOTzjPB4bj0=" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.mergewith": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "requires": { - "lodash._reinterpolate": "~3.0.0" - } - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "logalot": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", - "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", - "requires": { - "figures": "^1.3.5", - "squeak": "^1.0.0" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - } - } - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "longest-streak": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lpad-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", - "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", - "requires": { - "get-stdin": "^4.0.1", - "indent-string": "^2.1.0", - "longest": "^1.0.0", - "meow": "^3.3.0" - } - }, - "lru-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", - "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "ltcdr": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltcdr/-/ltcdr-2.2.1.tgz", - "integrity": "sha1-Wrh60dTB2rjowIu/A37gwZAih88=" - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "markdown-escapes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", - "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==" - }, - "markdown-table": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", - "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, - "md5-file": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", - "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", - "requires": { - "buffer-alloc": "^1.1.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdast-util-compact": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz", - "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "mdast-util-definitions": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.3.tgz", - "integrity": "sha512-P6wpRO8YVQ1iv30maMc93NLh7COvufglBE8/ldcOyYmk5EbfF0YeqlLgtqP/FOBU501Kqar1x5wYWwB3Nga74g==", - "requires": { - "unist-util-visit": "^1.0.0" - } - }, - "mdast-util-to-hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-3.0.4.tgz", - "integrity": "sha512-/eIbly2YmyVgpJNo+bFLLMCI1XgolO/Ffowhf+pHDq3X4/V6FntC9sGQCDLM147eTS+uSXv5dRzJyFn+o0tazA==", - "requires": { - "collapse-white-space": "^1.0.0", - "detab": "^2.0.0", - "mdast-util-definitions": "^1.2.0", - "mdurl": "^1.0.1", - "trim": "0.0.1", - "trim-lines": "^1.0.0", - "unist-builder": "^1.0.1", - "unist-util-generated": "^1.1.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^1.1.0", - "xtend": "^4.0.1" - } - }, - "mdast-util-to-nlcst": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.2.tgz", - "integrity": "sha512-TmJlri8dHt7duRU6jfWBMqf5gW+VZ6o/8GHaWzwdxslseB2lL8bSOiox6c8VwYX5v2E4CzUWm/1GkAYqgbNw9A==", - "requires": { - "nlcst-to-string": "^2.0.0", - "repeat-string": "^1.5.2", - "unist-util-position": "^3.0.0", - "vfile-location": "^2.0.0" - } - }, - "mdast-util-to-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.5.tgz", - "integrity": "sha512-2qLt/DEOo5F6nc2VFScQiHPzQ0XXcabquRJxKMhKte8nt42o08HUxNDPk7tt0YPxnWjAT11I1SYi0X0iPnfI5A==" - }, - "mdast-util-toc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-2.1.0.tgz", - "integrity": "sha512-ove/QQWSrYOrf9G3xn2MTAjy7PKCtCmm261wpQwecoPAsUtkihkMVczxFqil7VihxgSz4ID9c8bBTsyXR30gQg==", - "requires": { - "github-slugger": "^1.1.1", - "mdast-util-to-string": "^1.0.2", - "unist-util-visit": "^1.1.0" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "requires": { - "mime-db": "~1.37.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "requires": { - "dom-walk": "^0.1.0" - } - }, - "mini-css-extract-plugin": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz", - "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "mini-svg-data-uri": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.0.2.tgz", - "integrity": "sha512-3bDQR0/DIws7pkqi/dhtmv5BGgTT2HPRzq9fos3Jz4Xc9bVnn5eC6jBb4mK25Jdt8UclKeRhateLLTz9J2Wwug==" - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - } - } - }, - "minizlib": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz", - "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==", - "requires": { - "minipass": "^2.2.1" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mitt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.3.tgz", - "integrity": "sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA==" - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "mozjpeg": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-5.0.0.tgz", - "integrity": "sha1-uGccSSRWijY94AP/L9OXq4P3UsU=", - "requires": { - "bin-build": "^2.2.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "~1.1.9" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "name-all-modules-plugin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/name-all-modules-plugin/-/name-all-modules-plugin-1.0.1.tgz", - "integrity": "sha1-Cr+2rYNXGLn7Te8GdOBmV6lUN1w=" - }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "napi-build-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", - "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "nlcst-to-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.2.tgz", - "integrity": "sha512-DV7wVvMcAsmZ5qEwvX1JUNF4lKkAAKbChwNlIH7NLsPR7LWWoeIt53YlZ5CQH5KDXEXQ9Xa3mw0PbPewymrtew==" - }, - "node-abi": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.0.tgz", - "integrity": "sha512-9g2twBGSP6wIR5PW7tXvAWnEWKJDH/VskdXp168xsw9VVxpEGov8K4jsP4/VeoC7b2ZAyzckvMCuQuQlw44lXg==", - "requires": { - "semver": "^5.4.1" - } - }, - "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", - "requires": { - "lodash.toarray": "^4.4.0" - } - }, - "node-eta": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-eta/-/node-eta-0.9.0.tgz", - "integrity": "sha1-n7CwmbzSoCGUDmA8ZCVNwAPZp6g=" - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "node-releases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.4.tgz", - "integrity": "sha512-GqRV9GcHw8JCRDaP/JoeNMNzEGzHAknMvIHqMb2VeTOmg1Cf9+ej8bkV12tHfzWHQMCkQ5zUFgwFUkfraynNCw==", - "requires": { - "semver": "^5.3.0" - } - }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-loader": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-0.1.1.tgz", - "integrity": "sha1-F76av80/8OFRL2/Er8sfUDk3j64=" - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" - }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opentracing": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.3.tgz", - "integrity": "sha1-I+OtAp+mamU5Jq2+V+g0Rp+FUKo=" - }, - "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optimize-css-assets-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", - "requires": { - "cssnano": "^4.1.0", - "last-call-webpack-plugin": "^3.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" - }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-event": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", - "requires": { - "p-timeout": "^1.1.1" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" - }, - "p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", - "requires": { - "p-reduce": "^1.0.0" - } - }, - "p-pipe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=" - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" - }, - "p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - } - }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" - }, - "parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" - }, - "parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "requires": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, - "parse-english": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.1.1.tgz", - "integrity": "sha512-g7hegR9AFIlGXl5645mG8nQeeWW7SrK7lgmgIWR0KKWvGyZO5mxa4GGoNxRLm6VW2LGpLnn6g4O9yyLJQ4IzQw==", - "requires": { - "nlcst-to-string": "^2.0.0", - "parse-latin": "^4.0.0", - "unist-util-modify-children": "^1.0.0", - "unist-util-visit-children": "^1.0.0" - } - }, - "parse-entities": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.0.tgz", - "integrity": "sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-headers": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.1.tgz", - "integrity": "sha1-aug6eqJanZtwCswoaYzR8e1+lTY=", - "requires": { - "for-each": "^0.3.2", - "trim": "0.0.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse-latin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.1.1.tgz", - "integrity": "sha512-9fPVvDdw6G8LxL3o/PL6IzSGNGpF+3HEjCzFe0dN83sZPstftyr+McP9dNi3+EnR7ICYOHbHKCZ0l7JD90K5xQ==", - "requires": { - "nlcst-to-string": "^2.0.0", - "unist-util-modify-children": "^1.0.0", - "unist-util-visit-children": "^1.0.0" - } - }, - "parse-node-version": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz", - "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==" - }, - "parse-numeric-range": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", - "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "requires": { - "@types/node": "*" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "requires": { - "pify": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, - "physical-cpu-count": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", - "integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", - "requires": { - "pngjs": "^3.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" - }, - "pngjs": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", - "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==" - }, - "pngquant-bin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-5.0.1.tgz", - "integrity": "sha512-PJKdHpGuYl5WCzjOQ+YRBWsr1KQ2wAwez27am6rJOavLwc4aRvMuHDaKr288/FYS1eWUIXHFjCI0T2NAKt61Jw==", - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.1", - "execa": "^0.10.0", - "logalot": "^2.0.0" - }, - "dependencies": { - "archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", - "requires": { - "file-type": "^4.2.0" - }, - "dependencies": { - "file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" - } - } - }, - "array-uniq": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz", - "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==" - }, - "bin-build": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", - "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", - "requires": { - "decompress": "^4.0.0", - "download": "^6.2.2", - "execa": "^0.7.0", - "p-map-series": "^1.0.0", - "tempfile": "^2.0.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "bin-check": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", - "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", - "requires": { - "execa": "^0.7.0", - "executable": "^4.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "bin-version": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.0.0.tgz", - "integrity": "sha512-Ekhwm6AUiMbZ1LgVCNMkgjovpMR30FyQN74laAW9gs0NPjZR5gdY0ARNB0YsQG8GOme3CsHbxmeyq/7Ofq6QYQ==", - "requires": { - "execa": "^1.0.0", - "find-versions": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "bin-version-check": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", - "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", - "requires": { - "bin-version": "^3.0.0", - "semver": "^5.6.0", - "semver-truncate": "^1.1.2" - } - }, - "bin-wrapper": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", - "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", - "requires": { - "bin-check": "^4.1.0", - "bin-version-check": "^4.0.0", - "download": "^7.1.0", - "import-lazy": "^3.1.0", - "os-filter-obj": "^2.0.0", - "pify": "^4.0.1" - }, - "dependencies": { - "download": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", - "requires": { - "archive-type": "^4.0.0", - "caw": "^2.0.1", - "content-disposition": "^0.5.2", - "decompress": "^4.2.0", - "ext-name": "^5.0.0", - "file-type": "^8.1.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^8.3.1", - "make-dir": "^1.2.0", - "p-event": "^2.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "requires": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "p-cancelable": { - "version": "0.4.1", - "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" - }, - "p-event": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.1.0.tgz", - "integrity": "sha512-sDEpDVnzLGlJj3k590uUdpfEUySP5yAYlvfTCu5hTDvSTXQVecYWKcEwdO49PrZlnJ5wkfAvtawnno/jyXeqvA==", - "requires": { - "p-timeout": "^2.0.1" - } - }, - "p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "requires": { - "p-finally": "^1.0.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } - } - } - }, - "caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "requires": { - "get-proxy": "^2.0.0", - "isurl": "^1.0.0-alpha5", - "tunnel-agent": "^0.6.0", - "url-to-options": "^1.0.1" - } - }, - "decompress": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", - "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" - } - } - }, - "download": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", - "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", - "requires": { - "caw": "^2.0.0", - "content-disposition": "^0.5.2", - "decompress": "^4.0.0", - "ext-name": "^5.0.0", - "file-type": "5.2.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^7.0.0", - "make-dir": "^1.0.0", - "p-event": "^1.0.0", - "pify": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "requires": { - "pify": "^2.2.0" - } - }, - "file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" - }, - "filenamify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "find-versions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz", - "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==", - "requires": { - "array-uniq": "^2.0.0", - "semver-regex": "^2.0.0" - } - }, - "get-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", - "requires": { - "npm-conf": "^1.1.0" - } - }, - "get-stream": { - "version": "2.3.1", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==" - }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" - }, - "os-filter-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", - "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", - "requires": { - "arch": "^2.1.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==" - }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "requires": { - "is-natural-number": "^4.0.1" - } - }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - } - } - } - }, - "portfinder": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", - "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", - "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-colormin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.2.tgz", - "integrity": "sha512-1QJc2coIehnVFsz0otges8kQLsryi4lo19WD+U5xCWvXd0uw/Z+KKYnbiNDCnO9GP+PvErPHCG0jNvWTngk9Rw==", - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-discard-comments": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz", - "integrity": "sha512-Ay+rZu1Sz6g8IdzRjUgG2NafSNpp2MSMOQUb+9kkzzzP+kh07fP0yNbhtFejURnyVXSX3FYy2nVNW1QTnNjgBQ==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-flexbugs-fixes": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.3.1.tgz", - "integrity": "sha512-9y9kDDf2F9EjKX6x9ueNa5GARvsUbXw4ezH8vXItXHwKzljbu8awP7t5dCaabKYm18Vs1lo5bKQcnc0HkISt+w==", - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - } - } - }, - "postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", - "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^0.4.0" - } - }, - "postcss-merge-longhand": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.9.tgz", - "integrity": "sha512-UVMXrXF5K/kIwUbK/crPFCytpWbNX2Q3dZSc8+nQUgfOHrCT4+MHncpdxVphUlQeZxlLXUJbDyXc5NBhTnS2tA==", - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-merge-rules": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz", - "integrity": "sha512-UiuXwCCJtQy9tAIxsnurfF0mrNHKc4NnNx6NxqmzNNjXpQwLSukUxELHTRF0Rg1pAmcoKLih8PwvZbiordchag==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz", - "integrity": "sha512-pySEW3E6Ly5mHm18rekbWiAjVi/Wj8KKt2vwSfVFAWdW6wOIekgqxKxLU7vJfb107o3FDNPkaYFCxGAJBFyogA==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-minify-params": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz", - "integrity": "sha512-h4W0FEMEzBLxpxIVelRtMheskOKKp52ND6rJv+nBS33G1twu2tCyurYj/YtgU76+UDCvWeNs0hs8HFAWE2OUFg==", - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz", - "integrity": "sha512-8+plQkomve3G+CodLCgbhAKrb5lekAnLYuL1d7Nz+/7RANpBEVdgBkPNwljfSKvZ9xkkZTZITd04KP+zeJTJqg==", - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "requires": { - "postcss": "^6.0.1" - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "requires": { - "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-display-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz", - "integrity": "sha512-R5mC4vaDdvsrku96yXP7zak+O3Mm9Y8IslUobk7IMP+u/g+lXvcN4jngmHY5zeJnrQvE13dfAg5ViU05ZFDwdg==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz", - "integrity": "sha512-GNoOaLRBM0gvH+ZRb2vKCIujzz4aclli64MBwDuYGU2EY53LwiP7MxOZGE46UGtotrSnmarPPZ69l2S/uxdaWA==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz", - "integrity": "sha512-fFHPGIjBUyUiswY2rd9rsFcC0t3oRta4wxE1h3lpwfQZwFeFjXFSiDtdJ7APCmHQOnUZnqYBADNRPKPwFAONgA==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-string": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz", - "integrity": "sha512-IJoexFTkAvAq5UZVxWXAGE0yLoNN/012v7TQh5nDo6imZJl2Fwgbhy3J2qnIoaDBrtUP0H7JrXlX1jjn2YcvCQ==", - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz", - "integrity": "sha512-1nOtk7ze36+63ONWD8RCaRDYsnzorrj+Q6fxkQV+mlY5+471Qx9kspqv0O/qQNMeApg8KNrRf496zHwJ3tBZ7w==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz", - "integrity": "sha512-U8MBODMB2L+nStzOk6VvWWjZgi5kQNShCyjRhMT3s+W9Jw93yIjOnrEkKYD3Ul7ChWbEcjDWmXq0qOL9MIAnAw==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-ordered-values": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz", - "integrity": "sha512-PeJiLgJWPzkVF8JuKSBcylaU+hDJ/TX3zqAMIjlghgn1JBi6QwQaDZoDIlqWRcCAI8SxKrt3FCPSRmOgKRB97Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz", - "integrity": "sha512-epUiC39NonKUKG+P3eAOKKZtm5OtAtQJL7Ye0CBN1f+UQTHzqotudp+hki7zxXm7tT0ZAKDMBj1uihpPjP25ug==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-reduce-transforms": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz", - "integrity": "sha512-sZVr3QlGs0pjh6JAIe6DzWvBaqYw05V1t3d9Tp+VnFRT5j+rsqoWsysh/iSD7YNsULjq9IAylCznIwVd5oU/zA==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-selector-parser": { - "version": "5.0.0-rc.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0-rc.4.tgz", - "integrity": "sha512-0XvfYuShrKlTk1ooUrVzMCFQRcypsdEIsGqh5IxC5rdtBi4/M/tDAJeSONwC2MTqEFsmPZYAV7Dd4X8rgAfV0A==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - } - } - }, - "postcss-svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.1.tgz", - "integrity": "sha512-YD5uIk5NDRySy0hcI+ZJHwqemv2WiqqzDgtvgMzO8EGSkK5aONyX8HMVFRFJSdO8wUWTuisUFn/d7yRRbBr5Qw==", - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "potrace": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/potrace/-/potrace-2.1.1.tgz", - "integrity": "sha1-eREahYGX82ZBiEX2Z/6Pf6wKeds=", - "requires": { - "jimp": "^0.2.24" - } - }, - "prebuild-install": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.2.1.tgz", - "integrity": "sha512-9DAccsInWHB48TBQi2eJkLPE049JuAI6FjIH0oIrij4bpDVEbX6JvlWRAcAAlUqBHhjgq0jNqA3m3bBXWm9v6w==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^1.0.2", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.2.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^2.0.1", - "rc": "^1.2.7", - "simple-get": "^2.7.0", - "tar-fs": "^1.13.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - } - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "prettier": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.2.tgz", - "integrity": "sha512-YgPLFFA0CdKL4Eg2IHtUSjzj/BWgszDHiNQAe0VAIBse34148whfdzLagRL+QiKS+YfK5ftB6X4v/MBw8yCoug==", - "dev": true - }, - "pretty-bytes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "prismjs": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz", - "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==", - "requires": { - "clipboard": "^2.0.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "probe-image-size": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-4.0.0.tgz", - "integrity": "sha512-nm7RvWUxps+2+jZKNLkd04mNapXNariS6G5WIEVzvAqjx7EUuKcY1Dp3e6oUK7GLwzJ+3gbSbPLFAASHFQrPcQ==", - "requires": { - "any-promise": "^1.3.0", - "deepmerge": "^2.0.1", - "inherits": "^2.0.3", - "next-tick": "^1.0.0", - "request": "^2.83.0", - "stream-parser": "~0.3.1" - } - }, - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "property-information": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", - "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", - "requires": { - "xtend": "^4.0.1" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "requires": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - } - } - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react": { - "version": "16.6.3", - "resolved": "https://registry.npmjs.org/react/-/react-16.6.3.tgz", - "integrity": "sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.11.2" - } - }, - "react-dev-utils": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-4.2.3.tgz", - "integrity": "sha512-uvmkwl5uMexCmC0GUv1XGQP0YjfYePJufGg4YYiukhqk2vN1tQxwWJIBERqhOmSi80cppZg8mZnPP/kOMf1sUQ==", - "requires": { - "address": "1.0.3", - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "cross-spawn": "5.1.0", - "detect-port-alt": "1.1.3", - "escape-string-regexp": "1.0.5", - "filesize": "3.5.11", - "global-modules": "1.0.0", - "gzip-size": "3.0.0", - "inquirer": "3.3.0", - "is-root": "1.0.0", - "opn": "5.1.0", - "react-error-overlay": "^3.0.0", - "recursive-readdir": "2.2.1", - "shell-quote": "1.6.1", - "sockjs-client": "1.1.4", - "strip-ansi": "3.0.1", - "text-table": "0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "detect-port-alt": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz", - "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=", - "requires": { - "address": "^1.0.1", - "debug": "^2.6.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "opn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "requires": { - "is-wsl": "^1.1.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "react-dom": { - "version": "16.6.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.3.tgz", - "integrity": "sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.11.2" - } - }, - "react-error-overlay": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-3.0.0.tgz", - "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==" - }, - "react-helmet": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz", - "integrity": "sha1-qBgR3yExOm1VxfBYxK66XW89l6c=", - "requires": { - "deep-equal": "^1.0.1", - "object-assign": "^4.1.1", - "prop-types": "^15.5.4", - "react-side-effect": "^1.1.0" - } - }, - "react-hot-loader": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.3.12.tgz", - "integrity": "sha512-GMM4TsqUVss2QPe+Y33NlgydA5/+7tAVQxR0rZqWvBpapM8JhD7p6ymMwSZzr5yxjoXXlK/6P6qNQBOqm1dqdg==", - "requires": { - "fast-levenshtein": "^2.0.6", - "global": "^4.3.0", - "hoist-non-react-statics": "^2.5.0", - "prop-types": "^15.6.1", - "react-lifecycles-compat": "^3.0.4", - "shallowequal": "^1.0.2" - } - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-side-effect": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz", - "integrity": "sha512-Z2ZJE4p/jIfvUpiUMRydEVpQRf2f8GMHczT6qLcARmX7QRb28JDBTpnM2g/i5y/p7ZDEXYGHWg0RbhikE+hJRw==", - "requires": { - "exenv": "^1.2.1", - "shallowequal": "^1.0.1" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "read-chunk": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", - "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "recursive-readdir": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz", - "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=", - "requires": { - "minimatch": "3.0.3" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "requires": { - "brace-expansion": "^1.0.0" - } - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "redux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", - "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", - "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "regenerator-transform": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz", - "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", - "requires": { - "private": "^0.1.6" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" - }, - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^7.0.0", - "regjsgen": "^0.4.0", - "regjsparser": "^0.3.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.0.2" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "^1.0.1" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==" - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relay-compiler": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/relay-compiler/-/relay-compiler-1.5.0.tgz", - "integrity": "sha512-nB3HbGXy4UtdQRGVeBlzNbUSN0maETdB/dAggdxN2+mdg4tGqj04zdrcxrnXUpnobab8tXKZlyaRnKKEHvcTTA==", - "requires": { - "babel-generator": "^6.26.0", - "babel-polyfill": "^6.20.0", - "babel-preset-fbjs": "^2.1.4", - "babel-runtime": "^6.23.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.24.1", - "babylon": "^7.0.0-beta", - "chalk": "^1.1.1", - "fast-glob": "^2.0.0", - "fb-watchman": "^2.0.0", - "fbjs": "^0.8.14", - "graphql": "^0.13.0", - "immutable": "~3.7.6", - "relay-runtime": "1.5.0", - "signedsource": "^1.0.0", - "yargs": "^9.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "yargs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", - "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "relay-runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/relay-runtime/-/relay-runtime-1.5.0.tgz", - "integrity": "sha512-XWV9xsjIKPPSPAfpVSaiXXZkefIMpBlj2x1MAsZgQ9v2aLVIewB4f8gTHMl1tBfrC9zSREaMhbemz9Inlwnkyg==", - "requires": { - "babel-runtime": "^6.23.0", - "fbjs": "^0.8.14" - } - }, - "remark": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", - "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==", - "requires": { - "remark-parse": "^5.0.0", - "remark-stringify": "^5.0.0", - "unified": "^6.0.0" - } - }, - "remark-math": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-1.0.5.tgz", - "integrity": "sha512-VJSh9lJsnkj6SXzvCqe9RYc8lq3Edh/bAvjmkWIXrZGLdZhXQ26Z99q67WuLjdh+N9yurfi/g164qN5KNhu7AQ==", - "requires": { - "trim-trailing-lines": "^1.1.0" - } - }, - "remark-parse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", - "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", - "requires": { - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^1.1.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0", - "xtend": "^4.0.1" - } - }, - "remark-retext": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.2.tgz", - "integrity": "sha512-+48KzJdSXvsPupY5pj5AY7oBUSiDOqFPZBKebX5WemrMyIG+RImIt9hgeqelluVDd1kooHen33K/aybTPyoI9g==", - "requires": { - "mdast-util-to-nlcst": "^3.2.0" - } - }, - "remark-stringify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz", - "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==", - "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^1.1.0", - "mdast-util-compact": "^1.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", - "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", - "requires": { - "css-select": "^1.1.0", - "dom-converter": "~0.2", - "htmlparser2": "~3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" - } - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "retext-english": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.2.tgz", - "integrity": "sha512-iWffdWUvJngqaRlE570SaYRgQbn4/QVBfGa/XseEBuBazymnyW24o37oLPY0vm+PJdLmDghnjZX0UbkZSZF0Cg==", - "requires": { - "parse-english": "^4.0.0", - "unherit": "^1.0.4" - } - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sanitize-html": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.19.3.tgz", - "integrity": "sha512-QpIjbF1rhUSQj9V7Wey/gv4DPqOso8KTebaI4rC97p0WCLnTpmhf7BJZUhS83MTtqRvUo8MuXH316CW2Nzd48w==", - "requires": { - "chalk": "^2.4.1", - "htmlparser2": "^3.10.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.mergewith": "^4.6.1", - "postcss": "^7.0.5", - "srcset": "^1.0.0", - "xtend": "^4.0.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", - "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "readable-stream": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", - "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scheduler": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.2.tgz", - "integrity": "sha512-+WCP3s3wOaW4S7C1tl3TEXp4l9lJn0ZK8G3W3WKRWmw77Z2cIFUW2MiNTMHn5sCjxN+t7N43HAOOgMjyAg5hlg==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, - "scroll-behavior": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/scroll-behavior/-/scroll-behavior-0.9.9.tgz", - "integrity": "sha1-6/4GWEVbgq2IW2YZUhVBZnTazOI=", - "requires": { - "dom-helpers": "^3.2.1", - "invariant": "^2.2.2" - } - }, - "section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "requires": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "requires": { - "commander": "~2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "optional": true - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", - "requires": { - "node-forge": "0.7.5" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "^5.0.3" - } - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=" - }, - "semver-truncate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", - "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", - "requires": { - "semver": "^5.3.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==" - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz", - "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg==" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "sharp": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.21.0.tgz", - "integrity": "sha512-qr6yMl0ju8EGMtjIj5U1Ojj8sKuZ99/DQaNKWmoFHxqg3692AFSrEiPI/yr0O05OWtGD8LuCw8WSGmnZcNrZaA==", - "requires": { - "color": "^3.0.0", - "detect-libc": "^1.0.3", - "fs-copy-file-sync": "^1.1.1", - "nan": "^2.11.1", - "npmlog": "^4.1.2", - "prebuild-install": "^5.2.0", - "semver": "^5.5.1", - "simple-get": "^3.0.3", - "tar": "^4.4.6", - "tunnel-agent": "^0.6.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } - }, - "sift": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/sift/-/sift-5.1.0.tgz", - "integrity": "sha1-G78t+w63HlbEzH+1Z/vRNRtlAV4=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "signedsource": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signedsource/-/signedsource-1.0.0.tgz", - "integrity": "sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.3.tgz", - "integrity": "sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - }, - "dependencies": { - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": ">=0.5.1" - } - } - } - }, - "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", - "requires": { - "debug": "^2.6.6", - "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", - "requires": { - "sort-keys": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "space-separated-tokens": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz", - "integrity": "sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA==", - "requires": { - "trim": "0.0.1" - } - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" - }, - "spdx-correct": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", - "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", - "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" - }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", - "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", - "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "squeak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", - "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", - "requires": { - "chalk": "^1.0.0", - "console-stream": "^0.1.1", - "lpad-align": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "srcset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", - "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", - "requires": { - "array-uniq": "^1.0.2", - "number-is-nan": "^1.0.0" - } - }, - "sshpk": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", - "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==" - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=" - }, - "state-toggle": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", - "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", - "requires": { - "debug": "2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" - }, - "stream-to": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", - "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=" - }, - "stream-to-buffer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", - "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", - "requires": { - "stream-to": "~0.2.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-similarity": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz", - "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==", - "requires": { - "lodash.every": "^4.6.0", - "lodash.flattendeep": "^4.4.0", - "lodash.foreach": "^4.5.0", - "lodash.map": "^4.6.0", - "lodash.maxby": "^4.6.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-entities": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", - "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", - "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" - }, - "strip-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", - "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", - "requires": { - "babel-extract-comments": "^1.0.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0" - } - }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", - "requires": { - "is-relative": "^0.1.0" - } - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "strip-url-auth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", - "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", - "dev": true - }, - "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - } - }, - "style-to-object": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.2.tgz", - "integrity": "sha512-GcbtvfsqyKmIPpHeOHZ5Rmwsx2MDJct4W9apmTGcbPTbpA2FcgTFl2Z43Hm4Qb61MWGPNK8Chki7ITiY7lLOow==", - "requires": { - "css": "2.2.4" - } - }, - "stylehacks": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.1.tgz", - "integrity": "sha512-TK5zEPeD9NyC1uPIdjikzsgWxdQQN/ry1X3d1iOz1UkYDCmcr928gWD1KHgyC27F50UnE0xCTrBOO1l6KR8M4w==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", - "requires": { - "caniuse-lite": "^1.0.30000899", - "electron-to-chromium": "^1.3.82", - "node-releases": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.6.tgz", - "integrity": "sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==", - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" - } - }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "sum-up": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", - "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", - "requires": { - "chalk": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.1.1.tgz", - "integrity": "sha512-GBkJbnTuFpM4jFbiERHDWhZc/S/kpHToqmZag3aEBjPYK44JAN2QBjvrGIxLOoCyMZjuFQIfTO2eJd8uwLY/9g==", - "requires": { - "coa": "~2.0.1", - "colors": "~1.1.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "~0.1.0", - "css-tree": "1.0.0-alpha.28", - "css-url-regex": "^1.1.0", - "csso": "^3.5.0", - "js-yaml": "^3.12.0", - "mkdirp": "~0.5.1", - "object.values": "^1.0.4", - "sax": "~1.2.4", - "stable": "~0.1.6", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==" - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - } - } - }, - "tar-fs": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", - "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", - "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - }, - "dependencies": { - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" - }, - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "requires": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" - } - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - } - } - }, - "terser": { - "version": "3.10.12", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.12.tgz", - "integrity": "sha512-3ODPC1eVt25EVNb04s/PkHxOmzKBQUF6bwwuR6h2DbEF8/j265Y1UkwNtOk9am/pRxfJ5HPapOlUlO6c16mKQQ==", - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1", - "source-map-support": "~0.5.6" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "terser-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", - "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "terser": "^3.8.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==" - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "tiny-emitter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==", - "optional": true - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "requires": { - "os-tmpdir": "~1.0.1" - } - }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "topo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", - "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", - "requires": { - "hoek": "4.x.x" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "trim-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.1.tgz", - "integrity": "sha512-X+eloHbgJGxczUk1WSjIvn7aC9oN3jVE3rQfRVKcgpavi3jxtCn0VVKtjOBj64Yop96UYn/ujJRpTbCdAF1vyg==" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "trim-trailing-lines": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", - "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==" - }, - "trough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz", - "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==" - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "type-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz", - "integrity": "sha1-5yoXQYllaOn2KDeNgW1pEvfyOXI=" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "ua-parser-js": { - "version": "0.7.19", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", - "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==" - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "unbzip2-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz", - "integrity": "sha512-fIZnvdjblYs7Cru/xC6tCPVhz7JkYcVQQkePwMLyQELzYTds2Xn8QefPVnvdVhhZqubxNA1cASXEH5wcK0Bucw==", - "requires": { - "buffer": "^3.0.1", - "through": "^2.3.6" - }, - "dependencies": { - "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" - }, - "buffer": { - "version": "3.6.0", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", - "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", - "requires": { - "base64-js": "0.0.8", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - } - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, - "unherit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", - "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", - "requires": { - "inherits": "^2.0.1", - "xtend": "^4.0.1" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==" - }, - "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==" - }, - "unified": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", - "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^1.1.0", - "trough": "^1.0.0", - "vfile": "^2.0.0", - "x-is-string": "^0.1.0" - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unist-builder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.3.tgz", - "integrity": "sha512-/KB8GEaoeHRyIqClL+Kam+Y5NWJ6yEiPsAfv1M+O1p+aKGgjR89WwoEHKTyOj17L6kAlqtKpAgv2nWvdbQDEig==", - "requires": { - "object-assign": "^4.1.0" - } - }, - "unist-util-find": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find/-/unist-util-find-1.0.1.tgz", - "integrity": "sha1-EGK7tpKMepfGrcibU3RdTEbCIqI=", - "requires": { - "lodash.iteratee": "^4.5.0", - "remark": "^5.0.1", - "unist-util-visit": "^1.1.0" - }, - "dependencies": { - "longest-streak": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-1.0.0.tgz", - "integrity": "sha1-0GWXxNTDG1LMsfXY+P5xSOr9aWU=" - }, - "markdown-table": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-0.4.0.tgz", - "integrity": "sha1-iQwsGzv+g/sA5BKbjkz+ZFJw+dE=" - }, - "remark": { - "version": "5.1.0", - "resolved": "http://registry.npmjs.org/remark/-/remark-5.1.0.tgz", - "integrity": "sha1-y0Y709vLS5l5STXu4c9x16jjBow=", - "requires": { - "remark-parse": "^1.1.0", - "remark-stringify": "^1.1.0", - "unified": "^4.1.1" - } - }, - "remark-parse": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/remark-parse/-/remark-parse-1.1.0.tgz", - "integrity": "sha1-w8oQ+ajaBGFcKPCapOMEUQUm7CE=", - "requires": { - "collapse-white-space": "^1.0.0", - "extend": "^3.0.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^1.0.0", - "vfile-location": "^2.0.0" - } - }, - "remark-stringify": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/remark-stringify/-/remark-stringify-1.1.0.tgz", - "integrity": "sha1-pxBeJbnuK/mkm3XSxCPxGwauIJI=", - "requires": { - "ccount": "^1.0.0", - "extend": "^3.0.0", - "longest-streak": "^1.0.0", - "markdown-table": "^0.4.0", - "parse-entities": "^1.0.2", - "repeat-string": "^1.5.4", - "stringify-entities": "^1.0.1", - "unherit": "^1.0.4" - } - }, - "unified": { - "version": "4.2.1", - "resolved": "http://registry.npmjs.org/unified/-/unified-4.2.1.tgz", - "integrity": "sha1-dv9Dqo2kMPbn5KVchOusKtLPzS4=", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "has": "^1.0.1", - "once": "^1.3.3", - "trough": "^1.0.0", - "vfile": "^1.0.0" - } - }, - "vfile": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/vfile/-/vfile-1.4.0.tgz", - "integrity": "sha1-wP1vpIT43r23cfaMMe112I2pf+c=" - } - } - }, - "unist-util-generated": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.3.tgz", - "integrity": "sha512-qlPeDqnQnd84KIqwphzOR+l02cxjDzvEYEBl84EjmKRrX4eUmjyAo8xJv1SCDhJqNjyHRnBMZWNKAiBtXE6hBg==" - }, - "unist-util-is": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", - "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==" - }, - "unist-util-modify-children": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.3.tgz", - "integrity": "sha512-Aw3Us+NPrJGYWyLhcaqYzgxd/pryIanDNHVVvwdtTEEQ3Yfa/+sjnT2EeAAHbtTMAaYEdPW3XN6jxbzVWAo/BQ==", - "requires": { - "array-iterate": "^1.0.0" - } - }, - "unist-util-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.0.2.tgz", - "integrity": "sha512-npmFu92l/+b1Ao6uGP4I1WFz9hsKv7qleZ4aliw6x0RVu6A9A3tAf57NMpFfzQ02jxRtJZuRn+C8xWT7GWnH0g==" - }, - "unist-util-remove-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", - "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", - "requires": { - "unist-util-visit": "^1.1.0" - } - }, - "unist-util-select": { - "version": "1.5.0", - "resolved": "http://registry.npmjs.org/unist-util-select/-/unist-util-select-1.5.0.tgz", - "integrity": "sha1-qTwr6MD2U4J4A7gTMa3sKqJM2TM=", - "requires": { - "css-selector-parser": "^1.1.0", - "debug": "^2.2.0", - "nth-check": "^1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" - }, - "unist-util-visit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz", - "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==", - "requires": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "unist-util-visit-children": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.2.tgz", - "integrity": "sha512-q4t6aprUcSQ2/+xlswuh2wUKwUUuMmDjSkfwkMjeVwCXc8NqX8g0FSmNf68CznCmbkrsOPDUR0wj14bCFXXqbA==" - }, - "unist-util-visit-parents": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz", - "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==", - "requires": { - "unist-util-is": "^2.1.2" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", - "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "requires": { - "ip-regex": "^1.0.1" - }, - "dependencies": { - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" - } - } - }, - "url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "v8-compile-cache": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", - "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==" - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", - "requires": { - "is-buffer": "^1.1.4", - "replace-ext": "1.0.0", - "unist-util-stringify-position": "^1.0.0", - "vfile-message": "^1.0.0" - } - }, - "vfile-location": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.4.tgz", - "integrity": "sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==" - }, - "vfile-message": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.2.tgz", - "integrity": "sha512-dNdEXHfPCvzyOlEaaQ+DcXpcxEz+pFvdrebKLiAMjobjaBC2bMeWoHOKPwJ+I8A4jQOEUDH7uoVcLWDLF1qhVQ==", - "requires": { - "unist-util-stringify-position": "^1.1.1" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "dependencies": { - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - } - } - }, - "vinyl-assign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", - "requires": { - "object-assign": "^4.0.1", - "readable-stream": "^2.0.0" - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", - "requires": { - "wrap-fn": "^0.1.0" - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-namespaces": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.2.tgz", - "integrity": "sha512-II+n2ms4mPxK+RnIxRPOw3zwF2jRscdJIUE9BfkKHm4FYEg9+biIoTMnaZF5MpemE3T+VhMLrhbyD4ilkPCSbg==" - }, - "webpack": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.26.0.tgz", - "integrity": "sha512-J/dP9SJIc5OtX2FZ/+U9ikQtd6H6Mcbqt0xeXtmPwYGDKf8nkbOQQA9KL2Y0rJOsN1Al9Pdn+/j63X58ub8gvQ==", - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, - "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", - "requires": { - "memory-fs": "~0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", - "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==", - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.18.0", - "import-local": "^2.0.0", - "internal-ip": "^3.0.1", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "3.4.0", - "webpack-log": "^2.0.0", - "yargs": "12.0.2" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "requires": { - "xregexp": "4.0.0" - } - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "requires": { - "original": "^1.0.0" - } - }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - } - }, - "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "webpack-hot-middleware": { - "version": "2.24.3", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.24.3.tgz", - "integrity": "sha512-pPlmcdoR2Fn6UhYjAhp1g/IJy1Yc9hD+T6O9mjRcWV2pFbBjIFoJXhP0CoD0xPOhWJuWXuZXGBga9ybbOdzXpg==", - "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", - "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", - "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", - "requires": { - "lodash": "^4.17.5" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "webpack-stats-plugin": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-0.1.5.tgz", - "integrity": "sha1-KeXxLr/VMVjTHWVqETrB97hhedk=" - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "requires": { - "string-width": "^2.1.1" - } - }, - "with-open-file": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.4.tgz", - "integrity": "sha512-BswUwq/x/BYtNFMr4Uw9V+P2uroc9/tcDpZ2RdDHehzwCKJFF1PSIjJmBNfpUE3UQyJmVINRLOW49WTXQMEnvg==", - "requires": { - "p-finally": "^1.0.0", - "p-try": "^2.0.0", - "pify": "^3.0.0" - }, - "dependencies": { - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" - } - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "workbox-background-sync": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-3.6.3.tgz", - "integrity": "sha512-ypLo0B6dces4gSpaslmDg5wuoUWrHHVJfFWwl1udvSylLdXvnrfhFfriCS42SNEe5lsZtcNZF27W/SMzBlva7Q==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-broadcast-cache-update": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.6.3.tgz", - "integrity": "sha512-pJl4lbClQcvp0SyTiEw0zLSsVYE1RDlCPtpKnpMjxFtu8lCFTAEuVyzxp9w7GF4/b3P4h5nyQ+q7V9mIR7YzGg==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-build": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-3.6.3.tgz", - "integrity": "sha512-w0clZ/pVjL8VXy6GfthefxpEXs0T8uiRuopZSFVQ8ovfbH6c6kUpEh6DcYwm/Y6dyWPiCucdyAZotgjz+nRz8g==", - "requires": { - "babel-runtime": "^6.26.0", - "common-tags": "^1.4.0", - "fs-extra": "^4.0.2", - "glob": "^7.1.2", - "joi": "^11.1.1", - "lodash.template": "^4.4.0", - "pretty-bytes": "^4.0.2", - "stringify-object": "^3.2.2", - "strip-comments": "^1.0.2", - "workbox-background-sync": "^3.6.3", - "workbox-broadcast-cache-update": "^3.6.3", - "workbox-cache-expiration": "^3.6.3", - "workbox-cacheable-response": "^3.6.3", - "workbox-core": "^3.6.3", - "workbox-google-analytics": "^3.6.3", - "workbox-navigation-preload": "^3.6.3", - "workbox-precaching": "^3.6.3", - "workbox-range-requests": "^3.6.3", - "workbox-routing": "^3.6.3", - "workbox-strategies": "^3.6.3", - "workbox-streams": "^3.6.3", - "workbox-sw": "^3.6.3" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "joi": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-11.4.0.tgz", - "integrity": "sha512-O7Uw+w/zEWgbL6OcHbyACKSj0PkQeUgmehdoXVSxt92QFCq4+1390Rwh5moI2K/OgC7D8RHRZqHZxT2husMJHA==", - "requires": { - "hoek": "4.x.x", - "isemail": "3.x.x", - "topo": "2.x.x" - } - } - } - }, - "workbox-cache-expiration": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-cache-expiration/-/workbox-cache-expiration-3.6.3.tgz", - "integrity": "sha512-+ECNph/6doYx89oopO/UolYdDmQtGUgo8KCgluwBF/RieyA1ZOFKfrSiNjztxOrGJoyBB7raTIOlEEwZ1LaHoA==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-cacheable-response": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-3.6.3.tgz", - "integrity": "sha512-QpmbGA9SLcA7fklBLm06C4zFg577Dt8u3QgLM0eMnnbaVv3rhm4vbmDpBkyTqvgK/Ly8MBDQzlXDtUCswQwqqg==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-3.6.3.tgz", - "integrity": "sha512-cx9cx0nscPkIWs8Pt98HGrS9/aORuUcSkWjG25GqNWdvD/pSe7/5Oh3BKs0fC+rUshCiyLbxW54q0hA+GqZeSQ==" - }, - "workbox-google-analytics": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-3.6.3.tgz", - "integrity": "sha512-RQBUo/6SXtIaQTRFj4RQZ9e1gAl7D8oS5S+Hi173Kk70/BgJjzPwXpC5A249Jv5YfkCOLMQCeF9A27BiD0b0ig==", - "requires": { - "workbox-background-sync": "^3.6.3", - "workbox-core": "^3.6.3", - "workbox-routing": "^3.6.3", - "workbox-strategies": "^3.6.3" - } - }, - "workbox-navigation-preload": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-3.6.3.tgz", - "integrity": "sha512-dd26xTX16DUu0i+MhqZK/jQXgfIitu0yATM4jhRXEmpMqQ4MxEeNvl2CgjDMOHBnCVMax+CFZQWwxMx/X/PqCw==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-precaching": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-3.6.3.tgz", - "integrity": "sha512-aBqT66BuMFviPTW6IpccZZHzpA8xzvZU2OM1AdhmSlYDXOJyb1+Z6blVD7z2Q8VNtV1UVwQIdImIX+hH3C3PIw==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-range-requests": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-3.6.3.tgz", - "integrity": "sha512-R+yLWQy7D9aRF9yJ3QzwYnGFnGDhMUij4jVBUVtkl67oaVoP1ymZ81AfCmfZro2kpPRI+vmNMfxxW531cqdx8A==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-routing": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-3.6.3.tgz", - "integrity": "sha512-bX20i95OKXXQovXhFOViOK63HYmXvsIwZXKWbSpVeKToxMrp0G/6LZXnhg82ijj/S5yhKNRf9LeGDzaqxzAwMQ==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-strategies": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-3.6.3.tgz", - "integrity": "sha512-Pg5eulqeKet2y8j73Yw6xTgLdElktcWExGkzDVCGqfV9JCvnGuEpz5eVsCIK70+k4oJcBCin9qEg3g3CwEIH3g==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-streams": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-3.6.3.tgz", - "integrity": "sha512-rqDuS4duj+3aZUYI1LsrD2t9hHOjwPqnUIfrXSOxSVjVn83W2MisDF2Bj+dFUZv4GalL9xqErcFW++9gH+Z27w==", - "requires": { - "workbox-core": "^3.6.3" - } - }, - "workbox-sw": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-3.6.3.tgz", - "integrity": "sha512-IQOUi+RLhvYCiv80RP23KBW/NTtIvzvjex28B8NW1jOm+iV4VIu3VXKXTA6er5/wjjuhmtB28qEAUqADLAyOSg==" - }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "requires": { - "co": "3.1.0" - }, - "dependencies": { - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "x-is-string": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "xhr": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", - "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", - "requires": { - "global": "~4.3.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" - }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" - }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" - }, - "xstate": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-3.3.3.tgz", - "integrity": "sha512-p0ZYDPWxZZZRAJyD3jaGO9/MYioHuxZp6sjcLhPfBZHAprl4EDrZRGDqRVH9VvK8oa6Nrbpf+U5eNmn8KFwO3g==" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yaml-loader": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.5.0.tgz", - "integrity": "sha512-p9QIzcFSNm4mCw/m5NdyMfN4RE4aFZJWRRb01ERVNGCym8VNbKtw3OYZXnvUIkim6U/EjqE/2yIh9F/msShH9A==", - "requires": { - "js-yaml": "^3.5.2" - } - }, - "yargs": { - "version": "11.1.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", - "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "requires": { - "camelcase": "^4.1.0" - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - }, - "yurnalist": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-0.2.1.tgz", - "integrity": "sha1-LTK5YYq2SRiRwTG9kKUpXhn9S60=", - "requires": { - "chalk": "^1.1.1", - "death": "^1.0.0", - "debug": "^2.2.0", - "detect-indent": "^5.0.0", - "inquirer": "^3.0.1", - "invariant": "^2.2.0", - "is-builtin-module": "^1.0.0", - "is-ci": "^1.0.10", - "leven": "^2.0.0", - "loud-rejection": "^1.2.0", - "node-emoji": "^1.0.4", - "object-path": "^0.11.2", - "read": "^1.0.7", - "rimraf": "^2.5.0", - "semver": "^5.1.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "zen-observable": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", - "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==" - }, - "zen-observable-ts": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz", - "integrity": "sha512-8bs7rgGV4kz5iTb9isudkuQjtWwPnQ8lXq6/T76vrepYZVMsDEv6BXaEA+DHdJSK3KVLduagi9jSpSAJ5NgKHw==", - "requires": { - "zen-observable": "^0.8.0" - } - }, - "zwitch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.3.tgz", - "integrity": "sha512-aynRpmJDw7JIq6X4NDWJoiK1yVSiG57ArWSg4HLC1SFupX5/bo0Cf4jpX0ifwuzBfxpYBuNSyvMlWNNRuy3cVA==" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index baeabd2..0000000 --- a/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "gatsby-starter-alex-midway", - "description": "Gatsby starter", - "version": "1.0.0", - "author": "javahashbrown", - "dependencies": { - "gatsby": "^2.0.53", - "gatsby-image": "^2.0.20", - "gatsby-plugin-catch-links": "^2.0.9", - "gatsby-plugin-manifest": "^2.0.9", - "gatsby-plugin-offline": "^2.0.16", - "gatsby-plugin-react-helmet": "^3.0.2", - "gatsby-plugin-sharp": "^2.0.15", - "gatsby-remark-autolink-headers": "^2.0.12", - "gatsby-remark-copy-linked-files": "^2.0.7", - "gatsby-remark-external-links": "0.0.4", - "gatsby-remark-images": "^3.0.1", - "gatsby-remark-katex": "^3.0.1", - "gatsby-remark-prismjs": "^3.1.4", - "gatsby-source-filesystem": "^2.0.8", - "gatsby-transformer-remark": "^2.1.15", - "gatsby-transformer-sharp": "^2.1.8", - "katex": "^0.10.0", - "prismjs": "^1.15.0", - "prop-types": "^15.6.2", - "react": "^16.6.3", - "react-dom": "^16.6.3", - "react-helmet": "^5.2.0" - }, - "keywords": [ - "gatsby" - ], - "license": "MIT", - "scripts": { - "build": "gatsby build", - "serve": "gatsby serve", - "deploy": "gatsby build && gh-pages -d public -b master", - "develop": "gatsby develop", - "start": "npm run develop", - "format": "prettier --write \"src/**/*.js\"", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "devDependencies": { - "gh-pages": "^2.0.1", - "prettier": "^1.15.2" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/javaHashbrown/javahashbrown.github.io.git" - } -} diff --git a/page-data/404.html/page-data.json b/page-data/404.html/page-data.json new file mode 100644 index 0000000..cd947f7 --- /dev/null +++ b/page-data/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404.html","result":{"pageContext":{}}} \ No newline at end of file diff --git a/page-data/404/page-data.json b/page-data/404/page-data.json new file mode 100644 index 0000000..e7ac99a --- /dev/null +++ b/page-data/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404/","result":{"pageContext":{}}} \ No newline at end of file diff --git a/page-data/About/page-data.json b/page-data/About/page-data.json new file mode 100644 index 0000000..8bba166 --- /dev/null +++ b/page-data/About/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-about-js","path":"/About/","result":{"pageContext":{}}} \ No newline at end of file diff --git "a/page-data/Blog/2018\346\200\273\347\273\223\344\270\2162019\345\270\214\346\234\233/page-data.json" "b/page-data/Blog/2018\346\200\273\347\273\223\344\270\2162019\345\270\214\346\234\233/page-data.json" new file mode 100644 index 0000000..e0f9cb2 --- /dev/null +++ "b/page-data/Blog/2018\346\200\273\347\273\223\344\270\2162019\345\270\214\346\234\233/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/2018总结与2019希望/","result":{"data":{"markdownRemark":{"id":"b723930e-fcfc-5d82-bf85-9094ddc2a466","excerpt":"近期因为家里各种事情的耽误,一直没有时间完成这篇总结与希望。新的一年已经过完 1/12,这篇姗姗来迟的文章还没开始就有点过时了。 2018 年总结 工作 阅读 代码 2019 希望 2018 年总结 如果要用一个词概括我的 2018,那么这个主题词是:“转型” 工作 201…","html":"

近期因为家里各种事情的耽误,一直没有时间完成这篇总结与希望。新的一年已经过完 1/12,这篇姗姗来迟的文章还没开始就有点过时了。

\n\n

2018 年总结

\n
\n

如果要用一个词概括我的 2018,那么这个主题词是:“转型”

\n
\n

工作

\n

2018 是转型大前端的第一年,经过 1 年的努力,从一开始 React Native 跨平台开发的狭窄领域,扩展到了 web 前端:

\n
    \n
  1. 基本上掌握了 React 全家桶的用法,有能力开发跨平台的 APP,可以完成不那么复杂的 web 应用
  2. \n
  3. 了解了前端工程化的概念,使用并熟悉了相应的工具
  4. \n
  5. 对 JavaScript 语言本身有了更深入的了解
  6. \n
\n

这一年,我认为自己迈过了中级前端的门槛,脑中建立了前端知识图谱,知道了如何学习未接触过的前端主题。

\n

阅读

\n

限于工作,今年各种技术类文章读的非常多(主要在掘金和 medium,可惜没有使用工具整合阅读数据,无法精确的跟踪和统计),没有多读几本书,有点遗憾。

\n

2018 年读过的书有:

\n
    \n
  1. Secrets Of the JavaScript Ninja, 2nd Edition
  2. \n
  3. JavaScript 高级程序设计 第三版
  4. \n
  5. 精通 CSS 第二版
  6. \n
  7. React indepth
  8. \n
  9. 编码-隐匿在计算机软硬件背后的语言
  10. \n
  11. 黑匣子思维
  12. \n
  13. 中央帝国的财政密码
  14. \n
  15. 叫魂
  16. \n
  17. 源泉
  18. \n
  19. 白鹿原
  20. \n
  21. 10 人以下小团队管理手册
  22. \n
  23. 刻意练习
  24. \n
  25. 将夜
  26. \n
\n

印象最深的是 1 5 7,读完之后都有“原来 XXX 还可以这样”的感觉,以后还会反复看几遍。\n网络小说以及同类“爽文”以后要少看,费时且毫无价值。

\n

代码

\n

工作上完成了 3 个 APP,2 个 web 项目开发,业余时间完成了一些小练习:

\n
    \n
  1. freecodecamp 前 2 个 program
  2. \n
  3. wesbos 的 JavaScript30,Intro Flexbox 课程
  4. \n
  5. 参照 W3CSchool 的 tutorial,自己动手实现了 20+ 个 html 组件效果
  6. \n
  7. HackerRank 上 30DaysOfCode, 10DaysOfJS, 以及 60% 的 DataStructure
  8. \n
  9. LeetCode 刷了 40 道 easy 题目
  10. \n
  11. 用 Gatsby.js 重写了博客
  12. \n
\n

没有用工具统计全部的代码量,工作相关的代码大约是 4 万行,算上自己的练习代码,估计今年的代码量在 5 万行左右。

\n

2019 希望

\n

新年还是要立一些 flag,争取总和完成率达到 90%

\n
    \n
  1. 逐步调整作息时间:11 点睡,6 点起
  2. \n
  3. 全面体检 1 次
  4. \n
  5. 换一份新工作,收入有所提升
  6. \n
  7. 深入了解 JS 异步机制,能够自己实现 promise 和 rxjs
  8. \n
  9. 能够独立搭建前端脚手架、部署 CI/CD 环境
  10. \n
  11. (可选目标)关注 WebAssembly,写一个 demo
  12. \n
  13. 学一门新开发语言,比如 python
  14. \n
  15. LeetCode 刷题 150 道
  16. \n
  17. 博客全年至少更新 24 篇文章
  18. \n
  19. 尝试用英文写作,至少写 3 篇英文博客
  20. \n
  21. 重新学习数学:完成网易公开课《MIT-线性代数》
  22. \n
  23. 全年读书 12 本以上,其中英文书 3 本以上
  24. \n
  25. 找到合适的个人数据管理工具,追踪阅读过的网络文章
  26. \n
  27. (可选目标)英文词汇量达到 20000
  28. \n
  29. (可选目标)减少 50% 手机使用时间,每天少于 1.5 小时
  30. \n
  31. (可选目标,依赖 13)英文信息内容占比达到 50%
  32. \n
","frontmatter":{"date":"January 31, 2019","title":"2018总结与2019希望","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUDBP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAZShuSXUP//EABoQAQEAAgMAAAAAAAAAAAAAAAECAAMRFEH/2gAIAQEAAQUCiQn3Jka6ola+H//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAMAAwAAAAAAAAAAAAAAAAEQEQASYf/aAAgBAQAGPwLYvkyhf//EABsQAAMAAgMAAAAAAAAAAAAAAAABESFxMUFR/9oACAEBAAE/IZpr6Q23T5K/TSSDyxdmPp//2gAMAwEAAgADAAAAEPMP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHhAAAgEDBQAAAAAAAAAAAAAAAAERITFxQVGBkeH/2gAIAQEAAT8Qkje84xO4aYFHcJSv6gyxNio6GujWT//Z","aspectRatio":1.25,"src":"/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg","srcSet":"/static/eee581256a36266525b05b4e3e7f9f1c/72227/stefan-odobasu-1209110-unsplash.jpg 750w,\n/static/eee581256a36266525b05b4e3e7f9f1c/d41e0/stefan-odobasu-1209110-unsplash.jpg 1500w,\n/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg 3000w,\n/static/eee581256a36266525b05b4e3e7f9f1c/1edee/stefan-odobasu-1209110-unsplash.jpg 4080w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/2018总结与2019希望/","previous":{"fields":{"slug":"/Blog/用Gatsby重写了博客/"},"frontmatter":{"title":"用Gatsby重写了博客"}},"next":{"fields":{"slug":"/Blog/开始刷leetcode/"},"frontmatter":{"title":"开始刷leetcode"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/2019\345\215\212\345\271\264\345\260\217\347\273\223/page-data.json" "b/page-data/Blog/2019\345\215\212\345\271\264\345\260\217\347\273\223/page-data.json" new file mode 100644 index 0000000..bb73d75 --- /dev/null +++ "b/page-data/Blog/2019\345\215\212\345\271\264\345\260\217\347\273\223/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/2019半年小结/","result":{"data":{"markdownRemark":{"id":"a7c262c0-f025-544b-89d9-c287d05b5344","excerpt":"写在前面 2019 年计划完成情况 写在前面 这是今年的第十篇博客。距离上一次写博客已经过去四个月了。 4 月份入职了新公司做 web…","html":"\n
\n

写在前面

\n

这是今年的第十篇博客。距离上一次写博客已经过去四个月了。

\n

4 月份入职了新公司做 web 前端,主要写移动端页面和管理后台。刚开始为了适应新公司技术栈和工作节奏加班成瘾,忘了写博客,所幸现在效率提高后又有了打理的时间。这几个月其实并没有闲着,也攒了一些工作记录,整理后会陆续发上来。

\n

2019 年计划完成情况

\n

下面是年初时定下的年度目标,如果每项目标等权,那么目前的完成率大约是 50%,按时间算大概落后计划 8%,也就是 1 个月的工作量。这些目标中有一些没有完成半数;有些内容过多,需要重新调整:

\n
\n
    \n
  1. [ 100% ] 逐步调整作息时间:11 点睡,6 点起
  2. \n
  3. [ 100% ] 全面体检 1 次
  4. \n
  5. [ 100% ] 换一份新工作,收入有所提升
  6. \n
  7. [ 0% ] 深入了解 JS 异步机制,能够自己实现 promise 和 rxjs
  8. \n
  9. [ 0% ] 能够独立搭建前端脚手架、部署 CI/CD 环境
  10. \n
  11. [ 100% ] (可选目标)关注 WebAssembly,写一个 demo
  12. \n
  13. [ 100% ] 学一门新开发语言,比如 python
  14. \n
  15. [ 80% ] LeetCode 刷题 150 道
  16. \n
  17. [ 42% ] 博客全年至少更新 24 篇文章
  18. \n
  19. [ 0% ] 尝试用英文写作,至少写 3 篇英文博客
  20. \n
  21. [ 15% ] 重新学习数学:完成网易公开课《MIT-线性代数》
  22. \n
  23. [ 25% ] 全年读书 12 本以上,其中英文书 3 本以上
  24. \n
  25. [ 100% ] 找到合适的个人数据管理工具,追踪阅读过的网络文章
  26. \n
  27. [ 75% ](可选目标)英文词汇量达到 20000
  28. \n
  29. [ 0% ](可选目标)减少 50% 手机使用时间,每天少于 1.5 小时
  30. \n
  31. [ 0% ](可选目标,依赖 13)英文信息内容占比达到 50%
  32. \n
\n
\n
\n

1-3 借着换工作的机会完成了,目前作息时间还在继续保持;

\n

4 还没有开始;

\n

5 还没有开始,有个机会可以在工作中练习;

\n

6 超前完成,工作中已经用上了。仿照了网上的例子,把 openCC 语言库打包,做了一个浏览器的翻译服务;

\n

7 工作里用到了 python,算是熟悉了语法,有时间考虑再做个小 demo 什么的,应该有机会;

\n

8 已经完成了 120 题,easy 和 medium 难度的题目差不多刷了 2 遍。还剩 30 道 hard 题目没有完成,等 10 月份用 1-2 周时间集中突破。算法这个东西在学习阶段不太适合细水长流慢慢来,集中做比较有效率;

\n

9 差的比较多,目前才完成了 2/5,不过今年完成 24 篇应该问题不大;

\n

10 目前进度为 0,应该也可以完成;

\n

11 进度滞后,总共有 35 节课,目前进度 1/7,有可能今年无法完成,修正目标为完成全部课程的 80%(顺便吐个槽,原来不是我蠢,所以学不好线性代数,真的是本科时候老师讲的太垃圾。MIT 的老爷子讲的太好了,从线性组合到线性方程组再到接下来矩阵的秩,每一步都有了意义,而且层层深入,说醍醐灌顶毫不为过,这是目前收获最大的单个目标);

\n

12 今年到现在读完了 4 本书,也进度滞后,不过这个应该完成难度不大,准备追加一项写读书笔记的要求,年底前完成 3 篇读书笔记,计入博客文章数;

\n

13 已完成,注册了一个 pocket 账号,打通了浏览器和手机端,现在碎片化阅读的内容基本都保存在 pocket 上。所有阅读过的文章链接可以导出为清单,自己写一个程序就可以统计阅读量了,正好是目标#16 想完成的;

\n

14 完成度 70%-80%,现在词汇量测试基本稳定在 14000-16000 这个区间,年底前稳定在 80%的水平就可以了;

\n

15 以目前工作情况和生活习惯来看,1.5 小时日均手机使用时间不可能达到,修正到 4 小时以内;

\n

16 此项修正为写一个简单的桌面应用统计阅读量,数据比例不再限制;

\n

以上...

","frontmatter":{"date":"July 28, 2019","title":"2019半年小结","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAUDBP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAZShuSXUP//EABoQAQEAAgMAAAAAAAAAAAAAAAECAAMRFEH/2gAIAQEAAQUCiQn3Jka6ola+H//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAMAAwAAAAAAAAAAAAAAAAEQEQASYf/aAAgBAQAGPwLYvkyhf//EABsQAAMAAgMAAAAAAAAAAAAAAAABESFxMUFR/9oACAEBAAE/IZpr6Q23T5K/TSSDyxdmPp//2gAMAwEAAgADAAAAEPMP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHhAAAgEDBQAAAAAAAAAAAAAAAAERITFxQVGBkeH/2gAIAQEAAT8Qkje84xO4aYFHcJSv6gyxNio6GujWT//Z","aspectRatio":1.25,"src":"/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg","srcSet":"/static/eee581256a36266525b05b4e3e7f9f1c/72227/stefan-odobasu-1209110-unsplash.jpg 750w,\n/static/eee581256a36266525b05b4e3e7f9f1c/d41e0/stefan-odobasu-1209110-unsplash.jpg 1500w,\n/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg 3000w,\n/static/eee581256a36266525b05b4e3e7f9f1c/1edee/stefan-odobasu-1209110-unsplash.jpg 4080w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/2019半年小结/","previous":{"fields":{"slug":"/Blog/JavaScript中的原型链/"},"frontmatter":{"title":"JavaScript中的原型链"}},"next":{"fields":{"slug":"/Blog/CDN缓存不同步,一次线上调试的经历/"},"frontmatter":{"title":"CDN缓存不同步:一次线上调试的经历"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/2019\346\200\273\347\273\223\344\270\2162020\345\271\264\350\256\241\345\210\222/page-data.json" "b/page-data/Blog/2019\346\200\273\347\273\223\344\270\2162020\345\271\264\350\256\241\345\210\222/page-data.json" new file mode 100644 index 0000000..c8fae92 --- /dev/null +++ "b/page-data/Blog/2019\346\200\273\347\273\223\344\270\2162020\345\271\264\350\256\241\345\210\222/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/2019总结与2020年计划/","result":{"data":{"markdownRemark":{"id":"f4bb9bc4-b1a8-50e0-9435-f6ed736fd43d","excerpt":"","html":"","frontmatter":{"date":"January 31, 2020","title":"2019总结与2020年计划","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/2019总结与2020年计划/","previous":{"fields":{"slug":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/"},"frontmatter":{"title":"LeetCode-3-Longest Substring Without Repeating Characters"}},"next":{"fields":{"slug":"/Blog/TCP三次握手/"},"frontmatter":{"title":"TCP三次握手"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Android\346\250\241\346\213\237\345\231\250\350\256\277\351\227\256\346\234\254\345\234\260web\346\234\215\345\212\241\347\232\204url/page-data.json" "b/page-data/Blog/Android\346\250\241\346\213\237\345\231\250\350\256\277\351\227\256\346\234\254\345\234\260web\346\234\215\345\212\241\347\232\204url/page-data.json" new file mode 100644 index 0000000..d3d4abc --- /dev/null +++ "b/page-data/Blog/Android\346\250\241\346\213\237\345\231\250\350\256\277\351\227\256\346\234\254\345\234\260web\346\234\215\345\212\241\347\232\204url/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Android模拟器访问本地web服务的url/","result":{"data":{"markdownRemark":{"id":"e7c733d6-aec8-54d0-8303-505a775565a2","excerpt":"不会自己搭mock server的前端不是好前端。 后台开发和前端开发不能完全实现同步,一直停下等后台是要出问题的。\n于是基于json-server搭了一个 API 本地测试服务器,却遇到了一个莫名其妙但极其简单的问题,简单记录一下,避免以后二次踩坑。 TL;DR Android…","html":"

不会自己搭mock server的前端不是好前端。
\n后台开发和前端开发不能完全实现同步,一直停下等后台是要出问题的。\n于是基于json-server搭了一个 API 本地测试服务器,却遇到了一个莫名其妙但极其简单的问题,简单记录一下,避免以后二次踩坑。

\n
\n

TL;DR

\n

Android 模拟器访问本地服务器,把 url 设置成10.0.2.2或者本机 IP 地址
\nAndroid 真机访问本地服务器,同一个局域网内,把 url 设置成本机 IP 地址

\n
\n
    \n
  1. 踩坑
    \n使用Android模拟器访问mock server的时候发现使用http://localhost:3000的默认配置怎么都取不到数据。\n查了无数遍http包头、API 返回的response,一无所获。\n过了老半天才恍然大悟,Android本来就是一个系统,自己也是有ip地址的,本机运行的时候应该设置成Android内置的地址http://10.0.2.2:3000
  2. \n
  3. 进阶试验
    \n然后想到了一个问题,Android模拟器和本机在同一个局域网内,那么url改成本机的 IP 地址,应该也是可以访问的。\n测试果然可行,这个方法适合Android真机调试。
  4. \n
","frontmatter":{"date":"March 29, 2018","title":"Android模拟器访问本地web服务的url","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Android模拟器访问本地web服务的url/","previous":{"fields":{"slug":"/Blog/RN Animated API使用/"},"frontmatter":{"title":"RN Animated API使用"}},"next":{"fields":{"slug":"/Blog/normalizr扁平化递归结构的json/"},"frontmatter":{"title":"normalizr扁平化递归结构的json"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Android\351\224\256\347\233\230\351\201\256\346\214\241\351\227\256\351\242\230/page-data.json" "b/page-data/Blog/Android\351\224\256\347\233\230\351\201\256\346\214\241\351\227\256\351\242\230/page-data.json" new file mode 100644 index 0000000..3de037c --- /dev/null +++ "b/page-data/Blog/Android\351\224\256\347\233\230\351\201\256\346\214\241\351\227\256\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Android键盘遮挡问题/","result":{"data":{"markdownRemark":{"id":"1a5a2f8f-5c1c-58c2-8cfe-0bcd3bfbb64c","excerpt":"有时候需要键盘遮挡住屏幕的一部分,有时候不需要,可以配置android\\app\\src\\main\\AndroidManifest.xml文件 android:windowSoftInputMode=\"adjustResize\"可以让键盘推起页面 android…","html":"

有时候需要键盘遮挡住屏幕的一部分,有时候不需要,可以配置android\\app\\src\\main\\AndroidManifest.xml文件
\nandroid:windowSoftInputMode=\"adjustResize\"可以让键盘推起页面
\nandroid:windowSoftInputMode=\"adjustPan\"会遮住

\n
<activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\"\n        android:windowSoftInputMode=\"adjustPan\">        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>
","frontmatter":{"date":"March 14, 2018","title":"Android键盘遮挡问题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Android键盘遮挡问题/","previous":{"fields":{"slug":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/"},"frontmatter":{"title":"Native Module xxx tried to override xxx native module错误解决办法"}},"next":{"fields":{"slug":"/Blog/React-Navigation中去掉header下的阴影/"},"frontmatter":{"title":"React-Navigation中去掉header下的阴影"}}}}} \ No newline at end of file diff --git a/page-data/Blog/BGP Hijacking/page-data.json b/page-data/Blog/BGP Hijacking/page-data.json new file mode 100644 index 0000000..29445a2 --- /dev/null +++ b/page-data/Blog/BGP Hijacking/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/BGP Hijacking/","result":{"data":{"markdownRemark":{"id":"947c1159-00ce-523d-86d6-7931d7de665c","excerpt":"reference:https://www.cloudflare.com/learning/security/glossary/bgp-hijacking/","html":"

reference:https://www.cloudflare.com/learning/security/glossary/bgp-hijacking/

","frontmatter":{"date":"May 18, 2020","title":"BGP Hijacking","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/BGP Hijacking/","previous":{"fields":{"slug":"/Blog/Intro to Docker/"},"frontmatter":{"title":"Intro to Docker"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.map/"},"frontmatter":{"title":"手写Array.prototype.map"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/CDN\347\274\223\345\255\230\344\270\215\345\220\214\346\255\245\357\274\214\344\270\200\346\254\241\347\272\277\344\270\212\350\260\203\350\257\225\347\232\204\347\273\217\345\216\206/page-data.json" "b/page-data/Blog/CDN\347\274\223\345\255\230\344\270\215\345\220\214\346\255\245\357\274\214\344\270\200\346\254\241\347\272\277\344\270\212\350\260\203\350\257\225\347\232\204\347\273\217\345\216\206/page-data.json" new file mode 100644 index 0000000..630ec1b --- /dev/null +++ "b/page-data/Blog/CDN\347\274\223\345\255\230\344\270\215\345\220\214\346\255\245\357\274\214\344\270\200\346\254\241\347\272\277\344\270\212\350\260\203\350\257\225\347\232\204\347\273\217\345\216\206/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/CDN缓存不同步,一次线上调试的经历/","result":{"data":{"markdownRemark":{"id":"6d3f78a2-9d9e-5150-8f8a-cc925982a1b3","excerpt":"写在前面 这是大概3个月之前的一次线上调试过程,最后排查到的原因很简单,但调试过程让我认识了所谓“线上环境复杂”是什么意思。 背景信息 这是入职后接手的第一个H…","html":"

写在前面

\n

这是大概3个月之前的一次线上调试过程,最后排查到的原因很简单,但调试过程让我认识了所谓“线上环境复杂”是什么意思。

\n

背景信息

\n

这是入职后接手的第一个H5页面需求,也是比较重要内部项目,几乎所有公司部门都参与了此项目。项目完成后获得了公司的内部奖励,当然这是后话了。

\n

我负责的部分算项目中比较简单的一块,2个web管理后台页面+5个H5前端页面。管理后台录入数据,然后H5页面拉接口展示,同时后台数据还可以被客户端直接使用。主要工作量在我的后台搭档那里,前端切图仔按设计出页面就可以了。

\n

活很简单,慢悠悠的一周就做完了,然后自测、提测。PM说需要等下游客户端开发完毕后一起发布,于是等了快3周。

\n

到了发布当天,却出现了莫名其妙的样式bug。

\n

BUG排查过程

\n

发布后搭档的手机发现有一个H5页面样式全崩了。而我手机上的显示却完全正常

\n
    \n
  1. \n

    检查发布过程

    \n

    gitlab里CI打包正常-->重新发布-->发现问题依旧

    \n

    结论1:暂无

    \n
  2. \n
  3. \n

    清理App缓存,再刷新页面

    \n

    因为App里有页面缓存,加上之前做过预发布,我这里显示正常有可能是之前的缓存。那么首先清理掉缓存,确保页面文件都是新发布的。

    \n

    清理后,搭档的手机显示仍然不对,我的手机显示也不对了。

    \n

    结论2:应该是css文件有问题

    \n
  4. \n
  5. \n

    PC端查看

    \n

    这个页面是H5和PC端共用的,所以PC端也可以查看,这样调试成本稍微低一些。

    \n

    首先,PC端也显示不正常-->用Chrome devtool看css文件是否有正确下载-->未见下载css文件

    \n

    结论3:css文件没有下载

    \n
  6. \n
  7. \n

    排查CI发布包文件

    \n

    发现发布包html文件中没有引入css文件-->发现html文件因为代码格式化引发打包程序bug,未能正确打包css文件

    \n

    结论4:css文件没有正确打包

    \n
  8. \n
  9. \n

    PC端查看,发现css文件有错误

    \n

    修复后重新发布,bug依然存在-->浏览器devtool在network里能看到对应的css文件-->打开css文件路径,查看css文件内容是否正确-->经过关键词搜索,发现缺失了几个样式

    \n

    结论5:css文件有错误

    \n
  10. \n
  11. \n

    下载gitlab打包文件,比对线上和发布包内的css文件

    \n

    发现打包的css文件和线上css文件hash不同,似乎发布未生效。

    \n

    结论6:发布的css文件与线上css文件不同步

    \n
  12. \n
  13. \n

    偶然:另一名同事发现手机显示正常

    \n

    另一名同事清理App缓存后显示正常-->我和搭档的手机显示仍然不对,PC端也不对

    \n

    结论7:css文件在某些手机上正常下载??!!!

    \n
  14. \n
  15. \n

    切换为同一网络条件

    \n

    注意到搭档和我都连接的公司wifi,而另一名同事用的移动4G,难道是CDN缓存未同步?

    \n

    让另一名同事连公司wifi,清理缓存-->刷新页面,样式bug复现

    \n

    结论8:CDN缓存不同步??

    \n
  16. \n
  17. \n

    增加vConsole,比较显示为正常的css文件和有问题的css文件

    \n

    临时上线增加了vConsole的版本,在另一个同事手机上查看css文件版本-->正常显示的css文件hash和异常css文件hash不同-->前者和gitlab发布包内css文件hash相同,后者和上一个发布版本的css文件hash相同

    \n

    结论9:确认CDN缓存不同步

    \n
  18. \n
  19. \n

    修复上线

    \n

    出问题的css文件做了小改动,刷新了文件hash,再次发布上线,bug立刻修复

    \n
  20. \n
\n

整个调试排查时间约3个小时

\n

原因分析

\n

第一次bug是打包的失误,第二次bug复现应该算是典型的CDN缓存问题。

\n

因为html文件使用相同名字,覆盖发布,可能会有缓存同步延迟,而css文件名是基于hash的,每次改动后文件名不同,不存在覆盖问题。

\n

所以真正的bug源就是html页面文件没有同步,导致访问时没有请求到新版的css文件。第一次bug出现时,css文件没有下载可以理解,因为打包遗漏了,自然不会下载。但是第二次bug出现时,合理的组合应该是新html+无css或者新html+新css

\n

为什么会出现 新html+旧css这样的组合,暂时没有合理的答案。因为当时着急发布,没有立即检查修复后的情况,现在已经无法还原场景了。哎。

\n

总结

\n

总之失误挺多的,经验不足也导致反应不够迅速,处置手段也比较具有侵入性。比如,老司机估计最多在第4步就判断出原因了,而我这只菜鸡在第6步才意识到。第9步也完全可以省去一次发布,用4G网络开个热点通过PC端调试即可。

\n

技术进阶之路漫漫,我还要继续努力。

","frontmatter":{"date":"August 31, 2019","title":"CDN缓存不同步:一次线上调试的经历","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/CDN缓存不同步,一次线上调试的经历/","previous":{"fields":{"slug":"/Blog/2019半年小结/"},"frontmatter":{"title":"2019半年小结"}},"next":{"fields":{"slug":"/Blog/一次App内页的bug溯源/"},"frontmatter":{"title":"一次App内页的bug溯源"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/CST\344\270\216GMT\347\232\204\345\267\256\345\210\253/page-data.json" "b/page-data/Blog/CST\344\270\216GMT\347\232\204\345\267\256\345\210\253/page-data.json" new file mode 100644 index 0000000..02de328 --- /dev/null +++ "b/page-data/Blog/CST\344\270\216GMT\347\232\204\345\267\256\345\210\253/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/CST与GMT的差别/","result":{"data":{"markdownRemark":{"id":"397d76da-580b-54f8-a699-682d12826d62","excerpt":"date: 2018-05-15 问题描述 排查过程 CST & GMT 冷知识 问题解决 反思 问题描述 今天偶然发现了一个问题,JAVA 后台返回的时间字符串解析后居然比原始数据差了 14 个小时 后台时间字符串:Thu Feb 17 16:31:52 CST 201…","html":"\n

问题描述

\n

今天偶然发现了一个问题,JAVA 后台返回的时间字符串解析后居然比原始数据差了 14 个小时
\n后台时间字符串:Thu Feb 17 16:31:52 CST 2018
\n前端解析时间: Sun Feb 18 2018 06:31:52 GMT

\n

排查过程

\n
    \n
  1. 前端传的是时间戳,后台自己并没有处理,而且显示的时间与前端传的时间完全一致
  2. \n
  3. 只有后台再发送给前端之后时间显示才出现问题,妥妥前端的锅
  4. \n
\n

再看一眼 2 个字符串的样子,很自然想到不一致来源于 CST 和 GMT 这两种不同标准

\n

CST & GMT 冷知识

\n

google 了一下,CST 可以代表以下几个时间:

\n
    \n
  • Central Standard Time (USA) UT-6:00
  • \n
  • Central Standard Time (Australia) UT+9:30
  • \n
  • China Standard Time UT+8:00
  • \n
  • Cuba Standard Time UT-4:00
  • \n
\n

换句话说,CST 可以代表 4 个不同的时区,而 GMT 只代表格林尼治标准时间

\n

那么很显然问题的原因找到了:

\n
    \n
  • JAVA认为CST代表的是China Standard Time +8
  • \n
  • 而Javascript认为CST代表的是Central Standard Time (USA) -6
  • \n
\n

所以前端计算时才有了8-(-6)=14小时的时差

\n

问题解决

\n

写了个简单的方法处理了时差问题

\n
const dateCstToGmt = dateString => {\n  let aDate = new Date(dateString);\n  const hour = aDate.getHours();\n  aDate.setHours(hour - 14);\n  return aDate;\n};
\n

反思

\n
    \n
  • 最优方案:最好统一用时间戳,这样前后台解析都不会有错
  • \n
  • 次优方案:如果一定要用时间字符串,那么用没有歧义的 GMT 时间比 CST 时间来得可靠
  • \n
","frontmatter":{"date":"May 15, 2018","title":"CST与GMT的差别","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/CST与GMT的差别/","previous":{"fields":{"slug":"/Blog/一次搞笑而深刻的bug调试/"},"frontmatter":{"title":"一次搞笑而深刻的bug调试"}},"next":{"fields":{"slug":"/Blog/FlatList和ScrollView的一个小问题/"},"frontmatter":{"title":"使用FlatList(ScrollView)的一个小问题"}}}}} \ No newline at end of file diff --git a/page-data/Blog/Client-Side GraphQL/page-data.json b/page-data/Blog/Client-Side GraphQL/page-data.json new file mode 100644 index 0000000..1b09096 --- /dev/null +++ b/page-data/Blog/Client-Side GraphQL/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Client-Side GraphQL/","result":{"data":{"markdownRemark":{"id":"140d550b-dd69-57e9-890a-da83ea6ed869","excerpt":"","html":"","frontmatter":{"date":"June 15, 2020","title":"Client-Side GraphQL","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Client-Side GraphQL/","previous":{"fields":{"slug":"/Blog/Vue实例方法的this指向/"},"frontmatter":{"title":"Vue实例方法的this指向"}},"next":{"fields":{"slug":"/Blog/Design Systems with Storybook/"},"frontmatter":{"title":"Design Systems with Storybook"}}}}} \ No newline at end of file diff --git a/page-data/Blog/Design Systems with Storybook/page-data.json b/page-data/Blog/Design Systems with Storybook/page-data.json new file mode 100644 index 0000000..4514474 --- /dev/null +++ b/page-data/Blog/Design Systems with Storybook/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Design Systems with Storybook/","result":{"data":{"markdownRemark":{"id":"5b284b1b-e8d2-5ddb-9dc4-65aabcfb0280","excerpt":"","html":"","frontmatter":{"date":"June 15, 2020","title":"Design Systems with Storybook","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Design Systems with Storybook/","previous":{"fields":{"slug":"/Blog/Client-Side GraphQL/"},"frontmatter":{"title":"Client-Side GraphQL"}},"next":{"fields":{"slug":"/Blog/Server-Side GraphQL/"},"frontmatter":{"title":"Server-Side GraphQL"}}}}} \ No newline at end of file diff --git a/page-data/Blog/ES2015-ES2020/page-data.json b/page-data/Blog/ES2015-ES2020/page-data.json new file mode 100644 index 0000000..21308b0 --- /dev/null +++ b/page-data/Blog/ES2015-ES2020/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/ES2015-ES2020/","result":{"data":{"markdownRemark":{"id":"a0cbb589-3084-57ea-9d0c-b08d3bab8d2a","excerpt":"1. TC39 工作流程 - 标准一般每年6-7月发布 2. ES2015(ES6):常用特性 2.1 模版字符串 2.2 解构赋值,rest/spread操作符 2.3 Symbol / Iterator / Generator 3. ES2016(ES7) 4. ES…","html":"\n
\n

1. TC39 工作流程 - 标准一般每年6-7月发布

\n
    \n
  • Stage 0 (Strawperson 稻草人)
  • \n
  • Stage 1 (Proposal 建议)
  • \n
  • Stage 2 (Draft 草案)
  • \n
  • Stage 3 (Candidate 候选)
  • \n
  • Stage 4 (Finished 完成)
  • \n
\n
\n

2. ES2015(ES6):常用特性

\n
    \n
  • class
  • \n
  • ESM 模块化
  • \n
  • 箭头函数,函数参数默认值
  • \n
  • 模版字符串
  • \n
  • 解构赋值,数组rest/spread操作符
  • \n
  • 对象属性简写
  • \n
  • Promise, Generator 和 Iterator
  • \n
  • let 和 const, Map 和 Set
  • \n
  • 新增基本类型Symbol
  • \n
  • ...
  • \n
\n

全部特性点这里

\n

2.1 模版字符串

\n

常规用法

\n
//字符串拼接\nlet a = '风';\nlet b = `${a},冷${a}, 冷${a}`;//'风,冷风,冷风吹'\nb = `\n${a}\n冷${a}\n冷${a}`;\n/*风\n**冷风\n**冷风吹\n*/
\n
\n

自定义模版函数
\n普通用法 -> 大神的用法

\n
\n

2.2 解构赋值,rest/spread操作符

\n
// 右侧为spread赋值,左侧为rest接受赋值 \nlet a = [1,2,3,4];\nlet b = [1,2,...a];\nlet [c,,d,...e] = b;\n/*\nb: [1,2,1,2,3,4]\nc: 1\nd: 1\ne: [2,3,4]\n*/
\n

2.3 Symbol / Iterator / Generator

\n
    \n
  • Iterator: 实现next( )方法,返回 { value: xxx, done: true / false}
  • \n
  • Generator: 创建时返回iterator对象
  • \n
  • 字符串、数组、Map和Set是内置了迭代器的对象,原型内置 [Symbol.iterator] 方法
  • \n
\n

可以自己实现或者覆盖已有的 [Symbol.iterator] 方法

\n
\n

3. ES2016(ES7)

\n
    \n
  • Array.prototype.includes
  • \n
  • 指数运算符( ** )
  • \n
\n
let a = [1,NaN,null,undefined];\n\na.indexOf(NaN);//-1\na.includes(NaN);//true\n\nlet b = 2**3; //8\nlet c = Math.pow(2,3); //8
\n
\n

4. ES2017(ES8)

\n
    \n
  • async / await
  • \n
  • String.prototype.{ padStart, padEnd }
  • \n
  • Object.{ values, entries }
  • \n
  • 函数参数列表结尾允许逗号
  • \n
  • Object.getOwnPropertyDescriptors
  • \n
  • 共享内存和原子操作:SharedArrayBuffer 和 Atomics
  • \n
\n

4.1 async / await

\n
    \n
  • 同步形式的代码处理异步操作
  • \n
  • 结合ES2018异步迭代的改进后,可以在循环中处理async await
  • \n
\n
for await (const line of readLines(filePath)) {\n  console.log(line);\n}
\n

4.2 String.prototype. { padStart, padEnd }

\n
var str = 'hello';\nstr.padStart(4);                // \"hello\"\nstr.padStart(8);                // \"   hello\"\nstr.padStart(8,'*');            // \"***hello\"\nstr.padStart(8,'12345');        // \"123hello\"\nstr.padStart(8, 'ab');          // \"abahello\"\n\nstr.padEnd(4);                  // \"hello\"\nstr.padEnd(8);                  // \"hello   \"\nstr.padEnd(8,'*');              // \"hello***\"\nstr.padEnd(8,'12345');          // \"hello123\"\nstr.padEnd(8, 'ab');            // \"helloaba\"
\n

4.3 Object.{ values, entries }

\n
let val = { 'a':1, 'b':2, 'c':3 };\n\nObject.values(val);  // [1,2,3];\n\nObject.entries(val); // [ ['a',1], ['b',2], ['c',1] ]\nObject.entries(val).forEach( ([key,value])=>{\n\tconsole.log(`key: ${key}, value: ${value}`);\n});\n// key: a, value: 1\n// key: b, value: 2\n// key: c, value: 3
\n

4.4 函数参数列表结尾允许逗号

\n
    \n
  • 主要是为了改善git提交记录的可维护性
  • \n
\n
// 改进前\nfunction testTrailingComma(\n  param1,\n  param2 //增加参数必须改变此行\n){ ... }\n   \n// 改进后\nfunction testTrailingComma(\n  param1,\n  param2, //增加参数不再影响此行\n){ ... }
\n

4.5 Object.getOwnPropertyDescriptors

\n
let obj1 = { 'a': 1, test(){} };\nconsole.log(Object.getOwnPropertyDescriptors(obj1));\n/*{\n  a:{\n    configurable: true\n    enumerable: true\n    value: 1\n    writable: true\n  },\n  test:{\n    configurable: true\n    enumerable: true\n    value: ƒ test()\n    writable: true\n  }\n}*/
\n

4.6 共享内存和原子操作

\n
    \n
  • SharedArrayBuffer 和 Atomics
  • \n
  • SharedArrayBuffer: 共享二进制内存区域,以字节为单位
  • \n
  • Atomics:提供一组静态方法来对SharedArrayBuffer进行原子操作
  • \n
\n
\n

5. ES2018(ES9)

\n
    \n
  • 异步迭代
  • \n
  • Promise.prototype.finally
  • \n
  • 对象rest/spread操作符
  • \n
  • 正则表达式改进:{ 命名捕获组, 反向断言,dotAll标记,Unicode转义 }
  • \n
  • 模版字符串改进: 支持非转义
  • \n
\n

5.1 Promise.prototype.finally

\n
    \n
  • 类比 try ... catch ... finally
  • \n
\n
Promise.resolve(2)\n  .then((val)=>{})\n  .catch((err)=>{})\n  .finally(()=>{})
\n

5.2 对象rest / spread操作符

\n
//rest\nlet { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };\nx; // 1\ny; // 2\nz; // { a: 3, b: 4 }\n\n//spread\nlet n = { x, y, ...z };\nn; // { x: 1, y: 2, a: 3, b: 4 }
\n

5.3 正则表达式改进-命名捕获组

\n
//命名捕获组\nlet re = /(?<year>\\d{4})-(?<month>\\d{2})-(?<day>\\d{2})/u;\nlet result = re.exec('2019-11-01');\n\n// result.groups.year === '2019';\n// result.groups.month === '11';\n// result.groups.day === '01';\n\n// result[0] === '2019-11-01';\n// result[1] === '2019';\n// result[2] === '11';\n// result[3] === '01';
\n

5.4 正则表达式改进-反向断言

\n
let val = '$10.53';\n\n//正向断言\nlet match = /(\\$)(?=\\d+(\\.\\d*))?/.exec(val); // match[0] -> $\n\n//肯定反向断言\nmatch = /(?<=\\$)\\d+(\\.\\d*)?/.exec(val); // match[0] -> 10.53\n\n//否定反向断言\nmatch = /(?<!\\$)\\d+(?:\\.\\d*)/.exec(val); // match[0] -> null\nmatch = /(?<!\\$)\\d+(?:\\.\\d*)/.exec('¥10.53') // match[0] -> 10.53
\n

5.5 正则表达式改进-dotAll标记

\n
// 增加s标记,可以使 . 匹配 行结束符\n\n//无标记\n/foo.bar/.test('foo\\nbar'); // false\n\n//有标记\n/foo.bar/s.test('foo\\nbar'); // true
\n

5.6 正则表达式改进-Unicode转义

\n
    \n
  • 支持 \\p{...}\\P{...}实现Unicode转义
  • \n
  • 之前类似实现需要使用第三方库
  • \n
\n
const regexGreekSymbol = /\\p{Script=Greek}/u;\n\nregexGreekSymbol.test('π'); // true
\n

5.7 模版字符串改进

\n
    \n
  • 解决\\u,\\x\\数字开头的转义字符被自动认定为unicode,16进制和8进制转义,导致某些特定字符被认定为非法的错误
  • \n
  • 比如\\unicode, \\xerxes, \\0100都被认为是非法字符
  • \n
\n
\n

6. ES2019 (ES10)

\n
    \n
  • 可选catch异常变量绑定
  • \n
  • 字符集扩充
  • \n
  • Symbol.prototype.description
  • \n
  • Object.fromEntries( )
  • \n
  • 完善JSON.stringify( )
  • \n
  • 改进Function.prototype.toString( )
  • \n
  • String.prototype.{ trimStart, trimEnd }
  • \n
  • Array.prototype.{ flat, flatMap }
  • \n
\n

6.1 可选catch异常变量绑定

\n
    \n
  • catch的error参数可省略
  • \n
\n
//修改前\ntry{} catch(err){} // ok\ntry{} catch{} // error\n\n//修改后\ntry{} catch(err){} // ok\ntry{} catch{} // ok
\n

6.2 字符集扩充

\n\n

6.3 Symbol.prototype.description

\n
    \n
  • 增加属性直接获取description
  • \n
  • 代替之前使用Symbol.prototype.toString方法间接获得
  • \n
\n
const aSymbol = Symbol('我是描述');\n//以前\nString(aSymbol); // Symbol('我是描述')\n\n//现在\naSymbol.description;// '我是描述'
\n

6.4 Object.fromEntries( )

\n
    \n
  • 和 Object.Entries( )相反
  • \n
\n
//嵌套数组转对象\nobj = Object.fromEntries([['a', 0], ['b', 1]]); // { a: 0, b: 1 }\n\n//map转对象\nmap = new Map([ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]);\nobj = Object.fromEntries(map); // {a: 1, b: 2, c: 3}
\n

6.5 完善JSON.stringify( )

\n
// 正确的unicode字符\nJSON.stringify('𝌆');// → '\"𝌆\"'\nJSON.stringify('\\uD834\\uDF06')// → '\"𝌆\"' -> 来自太玄经\n\n// 超出字符集,返回转义的utf-8序列\nJSON.stringify('\\uDF06\\uD834')// → '\"\\\\udf06\\\\ud834\"'\nJSON.stringify('\\uDEAD') // → '\"\\\\udead\"'
\n

6.6 改进Function.prototype.toString( )

\n
    \n
  • 返回函数定义的全部内容,包括各种空格和注释
  • \n
\n
const a = () => { /*我是注释*/ return};\n\n//以前\na.toString(); // '()=>{}'\n\n//现在\na.toString(); // '() => { /*我是注释*/ return}'
\n

6.7 String.prototype.{ trimStart, trimEnd}

\n
var str = '   foo  '; //3个空格+foo+2个空格\n\nstr.length; // 8\n\nstr.trimStart().length; // 5\nstr.trimStart();        // 'foo  '\n\nstr.trimEnd().length;   // 6\nstr.trimEnd();          // '   foo'
\n

6.8 Array.prototype.{ flat, flatMap }

\n
/*--------flat-----------*/\nvar arr1 = [1, 2, [3, 4, [5, 6]]];\narr1.flat();    // [1, 2, 3, 4, [5, 6]]\n\nvar arr2 = [1, 2, [3, 4, [5, 6]]];\narr2.flat(2);   // [1, 2, 3, 4, 5, 6]\n\nvar arr3 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];\narr3.flat(Infinity);  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\n/*--------flatMap-----------*/\nlet arr4 = [1, 2, 3, 4];\n\narr4.map(x => [x * 2]);   // [[2], [4], [6], [8]]\narr4.flatMap(x => [x * 2]); // [2, 4, 6, 8]\narr4.flatMap(x => [[x * 2]]); // [[2], [4], [6], [8]]
\n
\n

7. ES2020 待发布(ES11)

\n
    \n
  • String.prototype.matchAll
  • \n
  • import( )
  • \n
  • 新增基本类型BigInt
  • \n
  • Promise.allSettled
  • \n
  • globalThis
  • \n
\n

7.1 String.prototype.matchAll

\n
    \n
  • 避免在循环中调用regexp.exec获取匹配项信息,分组捕获更方便
  • \n
\n
//以前\nconst regexp = /t(e)(st(\\d?))/g;\nconst str = 'test1test2';\nlet match;\nwhile ((match = regexp.exec(str)) !== null) {\n  console.log(`找到 ${match[0]} 开始位置=${match.index} 结束位置=${regexp.lastIndex}.`);\n  // 输出: \"找到 test1 开始位置=0 结束位置=4.\"\n  // 输出: \"找到 test2 开始位置=5 结束位置=9.\"\n}\n//现在\nlet matches = str.matchAll(regexp);\nfor(const match of matches){\n  console.log(`找到 ${match[0]} 开始位置=${match.index} 结束位置=${match.index+match[0].length}.`)\n}//输出同上\n\n[...str.matchAll(regexp)]; //['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', length: 4]
\n

7.2 import( )

\n
    \n
  • 动态加载 import( )
  • \n
  • script tag中可用,不局限于模块中使用:例子
  • \n
  • 如果在模块中使用,只影响import之后的语句
  • \n
  • 接受字符串变量为参数,可以动态改变import的内容
  • \n
  • 不强制增加静态依赖关系
  • \n
\n

7.3 新增基本类型BigInt

\n
    \n
  • 现在有7种基本类型: number, undefined, null, string, boolean, symbol, bigInt
  • \n
  • 新类型要解决的问题
  • \n
\n
/*Number*/\nconst x = Number.MAX_SAFE_INTEGER; // 9007199254740991, 即2^53-1\nconst y = x + 1; // 9007199254740992\nconst z = x + 2  // 9007199254740992
\n
    \n
  • BigInt
  • \n
\n
/*BigInt*/\nconst theBiggestInt = 9007199254740991n;\n0n+1; // TypeError: Cannot mix BigInt and other types, use explicit conversions\ntheBiggestInt + 2n; // 9007199254740993n;\n5n/2n; // 2n\n\nconst alsoHuge = BigInt(9007199254740991); // 9007199254740991n\nconst hugeButString = BigInt('9007199254740991');// 9007199254740991n\n0n === 0; //false\n0n == 0; //true\nBoolean(0n); // false\n\n+1n; // TypeError: Cannot convert a BigInt value to a number\nNumber(1n);// 1\n1n+ '2'; // '12'
\n

7.4 Promise.allSettled

\n
    \n
  • 与 Promise.all 对应
  • \n
  • 所有Promise都有结果,reject / resolve 皆可
  • \n
\n

7.5 globalThis

\n
    \n
  • 全局对象受运行环境影响: 浏览器为window,node环境为global,其他环境可能为this
  • \n
  • 提供一个环境无关的方式访问全局对象
  • \n
","frontmatter":{"date":"October 31, 2019","title":"ES2015-ES2020","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/ES2015-ES2020/","previous":{"fields":{"slug":"/Blog/mac终端中文显示数字编码的设置问题/"},"frontmatter":{"title":"mac终端中文显示数字编码的设置问题"}},"next":{"fields":{"slug":"/Blog/Vue中v-if和v-show遇到的小问题/"},"frontmatter":{"title":"Vue中v-if和v-show遇到的小问题"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/FlatList\345\222\214ScrollView\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/page-data.json" "b/page-data/Blog/FlatList\345\222\214ScrollView\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/page-data.json" new file mode 100644 index 0000000..8eed41c --- /dev/null +++ "b/page-data/Blog/FlatList\345\222\214ScrollView\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/FlatList和ScrollView的一个小问题/","result":{"data":{"markdownRemark":{"id":"fbe672a3-1f5b-5580-8441-38065ff3de58","excerpt":"问题描述 列表 FlatList 直接放在 View 里面,无法 pull to refresh 原因排查 因为 FlatList 基于 ScrollView 和 VirtualizedList 封装,查看了 ScrollView 的官方文档说明 Keep in mind…","html":"
问题描述
\n

列表 FlatList 直接放在 View 里面,无法 pull to refresh

\n
原因排查
\n

因为 FlatList 基于 ScrollView 和 VirtualizedList 封装,查看了 ScrollView 的官方文档说明

\n
\n

Keep in mind that ScrollViews must have a bounded height in order to work, since they contain unbounded-height children into a bounded container (via a scroll interaction)[1].\nIn order to bound the height of a ScrollView, either set the height of the view directly (discouraged)\nor make sure all parent views have bounded height. Forgetting to transfer {flex: 1} down the view stack can lead to errors here, which the element inspector makes easy to debug.

\n
\n
解决方案
\n

在 FlatList 外层的容器里加上{flex:1}

\n
<View style={{flex:1}}>  <FlatList\n    ...\n  />\n</View>
\n
问题引申
\n
    \n
  1. FlatList 和 ScrollView 都必须包裹在有确定高度的容器内才能正常工作
    \n所以,如果 FlatList 内嵌在 ScrollView 里,或者反之,内嵌的控件无法正常工作,因为 FlatList 或 ScrollView 都是不固定高度的。\n之前也遇到过类似情况,无意中将 FlatList 放在了基于 ScrollView 封装的容器里,只要上拉加载更多,就会出现 FlatList 无穷加载的情况
  2. \n
  3. FlatList 和 ScrollView 都必须放在{flex:1}的容器里,否则无法正常工作
  4. \n
","frontmatter":{"date":"May 19, 2018","title":"使用FlatList(ScrollView)的一个小问题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/FlatList和ScrollView的一个小问题/","previous":{"fields":{"slug":"/Blog/CST与GMT的差别/"},"frontmatter":{"title":"CST与GMT的差别"}},"next":{"fields":{"slug":"/Blog/使用json-server搭建API模拟服务器/"},"frontmatter":{"title":"使用json-server搭建API模拟服务器"}}}}} \ No newline at end of file diff --git a/page-data/Blog/Google XSS game - Level 1/page-data.json b/page-data/Blog/Google XSS game - Level 1/page-data.json new file mode 100644 index 0000000..12712b3 --- /dev/null +++ b/page-data/Blog/Google XSS game - Level 1/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Google XSS game - Level 1/","result":{"data":{"markdownRemark":{"id":"c452f256-f157-5555-8933-48a274efeae6","excerpt":"Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was designed…","html":"

Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was designed at least 4 yrs ago, I learned how to launch a XSS attack when playing the game. It took me almost 2 hrs to clear all 6 levels.

\n

Level 1: Hello, world of XSS

\n

Mission Description

\n

This level demonstrates a common cause of cross-site scripting where user input is directly included in the page without proper escaping.

\n

Interact with the vulnerable application window below and find a way to make it execute JavaScript of your choosing. You can take actions inside the vulnerable window or directly edit its URL bar.

\n

Mission Objective

\n

Inject a script to pop up a JavaScript alert() in the frame below.

\n

Once you show the alert you will be able to advance to the next level.

\n

Solution

\n
\n

TL;DR

\n

input <script>alert('xxx')</script> into the textbox, click \"Search\", and then an alert will pop up.

\n
\n

Look at the source code below:

\n
<!-- HTML Form -->\n<form action=\"\" method=\"GET\">  <input id=\"query\" name=\"query\" value=\"Enter query here...\"\n    onfocus=\"this.value=''\">\n  <input id=\"button\" type=\"submit\" value=\"Search\"></form>
\n
# Backend\nquery = self.request.get('query', '[empty]')\n    \n# Our search engine broke, we found no results :-(\nmessage = \"Sorry, no results were found for <b>\" + query + \"</b>.\"message += \" <a href='?'>Try again</a>.\"\n\n# Display the results page\nself.render_string(page_header + message + page_footer)
\n

The HTML form would send a GET request with a query parameter. Its value is what we input into the textbox.\nWhen the server receives the request, it would directly write the value into an HTML response and send it back to our browser without proper escaping.

\n

That's where our attack kicks in.

\n

Just type <script>alert('xxx')</script> into the textbox, click \"Search\", and then an alert will pop up.

","frontmatter":{"date":"November 18, 2020","title":"Google XSS game - Level 1","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Google XSS game - Level 1/","previous":{"fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"frontmatter":{"title":"Mac桌面端webview打开页面失败排查"}},"next":null}}} \ No newline at end of file diff --git a/page-data/Blog/Google XSS game Level 1/page-data.json b/page-data/Blog/Google XSS game Level 1/page-data.json new file mode 100644 index 0000000..7124085 --- /dev/null +++ b/page-data/Blog/Google XSS game Level 1/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Google XSS game Level 1/","result":{"data":{"markdownRemark":{"id":"2f1f8b91-417f-51ce-976a-efe06d73c404","excerpt":"Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was…","html":"

Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe.

\n

Although it was designed at least 4 yrs ago, I found it quite interesting and learned how to launch XSS attacks in various ways through the game. It took me almost 2 hrs to clear all 6 levels.

\n

Level 1: Hello, world of XSS

\n

Mission Description

\n

This level demonstrates a common cause of cross-site scripting where user input is directly included in the page without proper escaping.

\n

Interact with the vulnerable application window below and find a way to make it execute JavaScript of your choosing. You can take actions inside the vulnerable window or directly edit its URL bar.

\n

Mission Objective

\n

Inject a script to pop up a JavaScript alert() in the frame below.

\n

Once you show the alert you will be able to advance to the next level.

\n

Solution

\n
\n

TL;DR

\n

input <script>alert('xxx')</script> into the textbox, click \"Search\", and then an alert will pop up.

\n
\n

Look at the source code below:

\n
<!-- HTML Form -->\n<form action=\"\" method=\"GET\">  <input id=\"query\" name=\"query\" value=\"Enter query here...\"\n    onfocus=\"this.value=''\">\n  <input id=\"button\" type=\"submit\" value=\"Search\"></form>
\n
# Backend\nquery = self.request.get('query', '[empty]')\n    \n# Our search engine broke, we found no results :-(\nmessage = \"Sorry, no results were found for <b>\" + query + \"</b>.\"message += \" <a href='?'>Try again</a>.\"\n\n# Display the results page\nself.render_string(page_header + message + page_footer)
\n

The HTML form would send a GET request with a query parameter. Its value is what we input into the textbox.\nWhen the server receives the request, it would directly write the value into an HTML response and send it back to our browser without proper escaping.

\n

That's where our attack kicks in.

\n

Just type <script>alert('xxx')</script> into the textbox, click \"Search\", and then an alert will pop up.

","frontmatter":{"date":"November 18, 2020","title":"Google XSS game - Level 1","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Google XSS game Level 1/","previous":{"fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"frontmatter":{"title":"Mac桌面端webview打开页面失败排查"}},"next":null}}} \ No newline at end of file diff --git a/page-data/Blog/Google XSS game-Level 1/page-data.json b/page-data/Blog/Google XSS game-Level 1/page-data.json new file mode 100644 index 0000000..fcaf42a --- /dev/null +++ b/page-data/Blog/Google XSS game-Level 1/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Google XSS game-Level 1/","result":{"data":{"markdownRemark":{"id":"4af8bdef-34af-570b-b0cf-1afc5e17d2ed","excerpt":"Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was designed…","html":"

Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was designed at least 4 yrs ago, I learned how to launch a XSS attack when playing the game. It took me almost 2 hrs to clear all 6 levels.

\n

Level 1: Hello, world of XSS

\n

Mission Description

\n

This level demonstrates a common cause of cross-site scripting where user input is directly included in the page without proper escaping.

\n

Interact with the vulnerable application window below and find a way to make it execute JavaScript of your choosing. You can take actions inside the vulnerable window or directly edit its URL bar.

\n

Mission Objective

\n

Inject a script to pop up a JavaScript alert() in the frame below.

\n

Once you show the alert you will be able to advance to the next level.

\n

Solution

\n
\n

TL;DR

\n

input <script>alert('xxx')</script> into the textbox, click \"Search\", and then an alert will pop up.

\n
\n

Look at the source code below:

\n
<!-- HTML Form -->\n<form action=\"\" method=\"GET\">  <input id=\"query\" name=\"query\" value=\"Enter query here...\"\n    onfocus=\"this.value=''\">\n  <input id=\"button\" type=\"submit\" value=\"Search\"></form>
\n
# Backend\nquery = self.request.get('query', '[empty]')\n    \n# Our search engine broke, we found no results :-(\nmessage = \"Sorry, no results were found for <b>\" + query + \"</b>.\"message += \" <a href='?'>Try again</a>.\"\n\n# Display the results page\nself.render_string(page_header + message + page_footer)
\n

The HTML form would send a GET request with a query parameter. Its value is what we input into the textbox.\nWhen the server receives the request, it would directly write the value into an HTML response and send it back to our browser without proper escaping.

\n

That's where our attack kicks in.

\n

Just type <script>alert('xxx')</script> into the textbox, click \"Search\", and then an alert will pop up.

","frontmatter":{"date":"November 18, 2020","title":"Google XSS game - Level 1","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Google XSS game-Level 1/","previous":{"fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"frontmatter":{"title":"Mac桌面端webview打开页面失败排查"}},"next":null}}} \ No newline at end of file diff --git a/page-data/Blog/Google XSS game/page-data.json b/page-data/Blog/Google XSS game/page-data.json new file mode 100644 index 0000000..3d63e41 --- /dev/null +++ b/page-data/Blog/Google XSS game/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Google XSS game/","result":{"data":{"markdownRemark":null},"pageContext":{"slug":"/Blog/Google XSS game/","previous":{"fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"frontmatter":{"title":"Mac桌面端webview打开页面失败排查"}},"next":null}}} \ No newline at end of file diff --git "a/page-data/Blog/HTML\344\270\255\350\207\252\351\227\255\345\220\210Vue\347\273\204\344\273\266\347\232\204bug/page-data.json" "b/page-data/Blog/HTML\344\270\255\350\207\252\351\227\255\345\220\210Vue\347\273\204\344\273\266\347\232\204bug/page-data.json" new file mode 100644 index 0000000..44424ca --- /dev/null +++ "b/page-data/Blog/HTML\344\270\255\350\207\252\351\227\255\345\220\210Vue\347\273\204\344\273\266\347\232\204bug/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/HTML中自闭合Vue组件的bug/","result":{"data":{"markdownRemark":{"id":"5966dc21-09c0-50a0-be45-1fe9dbdbc1fa","excerpt":"写在前面 今天犯了个低级错误,页面新增加了一个vue组件,因为是直接在html里写的(需要用php的后端直出,没有用vue单文件的写法),在使用自闭合标记写法的情况下这个组件没有直接渲染,而是把它后面的div…","html":"

写在前面

\n

今天犯了个低级错误,页面新增加了一个vue组件,因为是直接在html里写的(需要用php的后端直出,没有用vue单文件的写法),在使用自闭合标记写法的情况下这个组件没有直接渲染,而是把它后面的div节点替换掉了。

\n

背景信息

\n

先假设这个组件的名字叫做BugComponent,模版内容大概是下面这样的

\n
<template>\n\t<div class=\"bug-component\">\n    <p>我是bug component</p>\n  </div>\n</template>
\n

bug试验

\n
    \n
  1. 自闭合组件在前:渲染替换节点
  2. \n
\n
...\n<!-- 渲染前 -->\n<div class=\"container\">\n\t<bug-component />\n\t<div class=\"sibling\">\n    <p>我是示例文本</p>\n\t</div>\n </div>\n...
\n

这样就是今天遇到的bug情况,表现为组件替换掉了下面的div节点,这样渲染后最终的html是这样的

\n
...\n<!-- 渲染后, sibling节点消失 -->\n<div class=\"container\">\n\t<div class=\"bug-component\">\n    <p>我是bug component</p>\n  </div> \n </div>\n...
\n
    \n
  1. 自闭合组件在后:显示正常
  2. \n
\n
...\n<!-- 渲染前 -->\n<div class=\"container\">\n\t<div class=\"sibling\">\n    <p>我是示例文本</p>\n\t</div>\n  <bug-component />\n </div>\n...
\n

这种情况下,自闭合组件之下是上层节点标记的结束,这样表现为组件可以正常渲染,不会影响到上面的临近同级节点

\n
...\n<!-- 渲染后,sibling节点保持不变,渲染BugComponent组件内容 -->\n<div class=\"container\">\n\t<div class=\"sibling\">\n    <p>我是示例文本</p>\n\t</div>\n  <div class=\"bug-component\">\n    <p>我是bug component</p>\n  </div>\n </div>\n...
\n

原因分析

\n

用户看到页面,整个渲染过程粗略说可以分为2步:

\n
    \n
  1. 浏览器解析HTML标签
  2. \n
  3. 挂载Vue并完成渲染
  4. \n
\n

出问题的地方在第一步浏览器解析HTML标签,所以这个问题本质上是HTML解析问题。

\n

具体解释如下:

\n
    \n
  • HTML5标准中的Normal elements不支持自闭合标签写法(包括自定义标签,但排除空标签和svg等特定标签),自闭合标签在解析时会被省略掉表示闭合的/,即<bug-component />实际上是当成<bug-component>来解析的
  • \n
  • 根据标准,<bug-component>就会被解析为标签的开始,这样浏览器会认为它缺少了标签结尾
  • \n
  • \n

    关键的一步来了:浏览器会在父标签的结尾前,自动补全当前标签的结尾,所以自闭合标签在这样的机制下就变成了它后面兄弟节点的父节点

    \n
    <!-- 原始html -->\n<div class=\"container\">\n  <bug-component />\n  <div class=\"sibling\">\n    <p>我是示例文本</p>\n  </div>\n</div>\n\n<!-- 浏览器补充后,实际html -->\n<div class=\"container\">\n  <bug-component>\n      <div class=\"sibling\">\n        <p>我是示例文本</p>\n      </div>\n  </bug-component>\n</div>
    \n
  • \n
  • 这就是为什么在bug试验1的情境下,Vue渲染后的组件只剩下了组件模版的内容,而兄弟节点的内容消失了。因为对Vue来说,这个时候自闭合标签和它的兄弟节点都只是组件标记的一部分,都会被替换为组件模版
  • \n
  • 当自闭合标签是最后一个子节点的时候,也就是bug试验2的情景,自动补全结束标签不会影响到其他的兄弟节点,所以Vue渲染后就表现为一切正常
  • \n
\n

Done.

\n

延伸阅读

\n

其实Vue的官方文档已经说的很清楚了,自闭合组件只能出现在三种场合:

\n
    \n
  • Vue template
  • \n
  • 字符串模版
  • \n
  • JSX
  • \n
\n

因为HTML标准不支持,所以在HTML中不能使用自闭合组件,而且标记必须使用kebab-case

\n

详见 Vue风格指南: 自闭合组件 - 强烈推荐

","frontmatter":{"date":"October 12, 2019","title":"HTML中自闭合Vue组件的bug","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/HTML中自闭合Vue组件的bug/","previous":{"fields":{"slug":"/Blog/nginx配置的一个小错误/"},"frontmatter":{"title":"nginx配置的一个小错误"}},"next":{"fields":{"slug":"/Blog/mac终端中文显示数字编码的设置问题/"},"frontmatter":{"title":"mac终端中文显示数字编码的设置问题"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/HTTP2.0\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/HTTP2.0\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..13ab928 --- /dev/null +++ "b/page-data/Blog/HTTP2.0\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/HTTP2.0初步/","result":{"data":{"markdownRemark":{"id":"35f8591d-1ecb-55af-8d98-639aa8ad0276","excerpt":"","html":"","frontmatter":{"date":"February 28, 2020","title":"HTTP/2初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/HTTP2.0初步/","previous":{"fields":{"slug":"/Blog/HTTP缓存小结/"},"frontmatter":{"title":"HTTP缓存小结"}},"next":{"fields":{"slug":"/Blog/多语言的判断优先级/"},"frontmatter":{"title":"多语言的判断优先级"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/HTTPS\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/HTTPS\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..b75445b --- /dev/null +++ "b/page-data/Blog/HTTPS\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/HTTPS初步/","result":{"data":{"markdownRemark":{"id":"a5367ab2-d182-5be3-b310-7838fadb13a6","excerpt":"","html":"","frontmatter":{"date":"February 19, 2020","title":"HTTPS初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/HTTPS初步/","previous":{"fields":{"slug":"/Blog/TCP三次握手/"},"frontmatter":{"title":"TCP三次握手"}},"next":{"fields":{"slug":"/Blog/XMLHttpRequest回顾/"},"frontmatter":{"title":"XMLHttpRequest回顾"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/HTTP\347\274\223\345\255\230\345\260\217\347\273\223/page-data.json" "b/page-data/Blog/HTTP\347\274\223\345\255\230\345\260\217\347\273\223/page-data.json" new file mode 100644 index 0000000..9e25792 --- /dev/null +++ "b/page-data/Blog/HTTP\347\274\223\345\255\230\345\260\217\347\273\223/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/HTTP缓存小结/","result":{"data":{"markdownRemark":{"id":"7c460279-2a30-572b-8a20-49b67e336392","excerpt":"常见相关HTTP Header HTTP 1.0 Pragma 与HTTP 1.1 Cache-Control对等,为了兼容而存在; 如果Cache-Control同时存在,Pragma会被忽略; 通常设置为Pragma: no-cache; HTTP 1.1 Cache…","html":"

常见相关HTTP Header

\n

HTTP 1.0

\n
    \n
  • Pragma
    \n与HTTP 1.1 Cache-Control对等,为了兼容而存在;
    \n如果Cache-Control同时存在,Pragma会被忽略;
    \n通常设置为Pragma: no-cache;
  • \n
\n

HTTP 1.1 Cache-Control

\n

HTTP 1.1引入请求头,用于控制缓存策略

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
HTTP header说明
public都可以缓存
private必须保存在私有缓存中,不可保存在共享缓存,即不可保存在CDN节点
no-cache保存缓存文件到磁盘,但未与源服务器验证前,不可使用
no-store1.不保存缓存文件到磁盘,但可以保存到内存中,转发后会尽快删除;
2. 无法保证私密性;
must-revalidate仅针对过期缓存,在未与源服务器验证前,不可使用
max-stale1. 请求头,表示愿意接受设置的过期时间内的缓存;
2. max-stale: 60表示过期60秒内的缓存,客户端也可以接受
\n
\n

注意must-revalidateno-cache差别

\n
    \n
  • 前者只要求验证已过期缓存
  • \n
  • 后者不论缓存是否过期都需要验证;
  • \n
\n
\n

缓存类别

\n

强缓存

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
HTTP header所属标准说明
ExpiresHTTP 1.01.HTTP日期时间戳
2. 优先级低于Cache-Control: max-age,如果后者出现Expires将被忽略
3.客户端本地时间会影响时间判定
4. 如果解析时间错误或时间格式错误,缓存将被认为已过期
Cache-Control: max-ageHTTP 1.11.表示缓存最大有效期,单位是秒
2.优先级高于Expires
Cache-Control: s-maxageHTTP 1.11.和max-age类似,但用于控制共享缓存,即CDN的最大缓存有效期
2.优先级高于max-ageExpires
\n
\n

强缓存命中,返回HTTP状态码200

\n
\n

协商缓存

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
HTTP header所属标准说明
请求头:If-Modified-since
响应头:Last-Modified
HTTP 1.01.HTTP日期时间戳
2. 优先级低于Etag,如果后者出现将被忽略
3.只能精确到秒,速度快于1秒的变化无法感知
4. 连续变化但最后内容未变,会导致频繁刷新更新时间,导致之前的缓存失效
请求头: If-None-Match
响应头: Etag
HTTP 1.11.表示文件指纹,变化只与文件内容有关
2.优先级高于Last-Modified
3.Etag生成与具体算法有关,分布式系统中每台机器可能会为相同文件生成不同的Etag,需要统一计算规则
\n
\n

协商缓存命中返回HTTP状态码304,未命中会重新请求,成功返回200

\n
\n

使用场景

\n

静态文件

\n

变化较少的静态资源文件,如图片,或变化频繁但每个版本相对独立的静态资源文件,如js,css文件,尽量强缓存,并设置长有效期,通过hash或者类似方法区分不同文件版本,可以减少资源请求

\n

html文件

\n

一般设置为Cache-Control: no-cache,要求每次回源验证,以确保每次用户访问到的都是最新版本的App;但并不绝对,有些时效性没那么强的内容,或者内容相对稳定、或者需要通过缓存减少服务器访问压力的场景,也可以结合使用Cache-Control: max-age=xxx

\n
    \n
  • 前者例子见参考文献3
  • \n
  • 后者例子可见各类新闻网站,常见设置为max-age=60
    \n因为新闻内容相对稳定,设置强缓存影响css和js文件的更新,并不影响内容阅读,用户感知不明显,且此设置有助于减少服务器访问压力
  • \n
  • \n

    缺点:结合max-age的网站,通常会有多个版本同时运行在线上,比较难以定位线上问题

    \n

    参考文献

    \n

    [1] RFC 7324
    \n[2] RFC 7232
    \n[3] Jake·Archibald: caching-best-practices

    \n
  • \n
","frontmatter":{"date":"February 25, 2020","title":"HTTP缓存小结","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/HTTP缓存小结/","previous":{"fields":{"slug":"/Blog/XMLHttpRequest回顾/"},"frontmatter":{"title":"XMLHttpRequest回顾"}},"next":{"fields":{"slug":"/Blog/HTTP2.0初步/"},"frontmatter":{"title":"HTTP/2初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/IEEE-754\346\240\207\345\207\206\344\270\216JS\344\270\255\347\232\204number\347\261\273\345\236\213/page-data.json" "b/page-data/Blog/IEEE-754\346\240\207\345\207\206\344\270\216JS\344\270\255\347\232\204number\347\261\273\345\236\213/page-data.json" new file mode 100644 index 0000000..d034735 --- /dev/null +++ "b/page-data/Blog/IEEE-754\346\240\207\345\207\206\344\270\216JS\344\270\255\347\232\204number\347\261\273\345\236\213/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/IEEE-754标准与JS中的number类型/","result":{"data":{"markdownRemark":{"id":"2f6626d8-952d-54a8-8347-6e0ca34b51ae","excerpt":"title: 'IEEE-754标准与JS中的number类型' 引子: 0.1+0.2===0.3 ? Number类型的二进制表示 二进制小数与二进制科学记数法 IEEE-754双精度浮点数 存储结构 计算方法 特殊情况 浮点数的误差 十进制转浮点数 舍入 0.1+0.…","html":"\n

引子: 0.1+0.2===0.3 ?

\n

用一道有点无聊的面试题作为开篇:

\n
\n

0.1+0.2==0.3的结果是什么?
\n当然是false

\n
\n

为什么?简言之,因为JS的number类型是双精度浮点数,浮点数计算有误差。

\n
console.log(0.1+0.2==0.3) // false\n//控制台输入,结果如下\n0.1+0.2 //0.30000000000000004
\n

至于具体原因就是本文的主题了,下文会依据浮点数的原理解释上述现象。


\n

Number类型的二进制表示

\n

跟其他强类型语言不同(比如C++,C#,Java等),作为动态语言的JS没有Int这样的整数类型。所有的数字,不管小数还是整数,只有一种类型:number。JS中的number类型是双精度浮点数,即用64位二进制数按照一定规则来存储及表示数字。浮点数的通行标准是IEEE-754,基本思想是使用科学记数法,利用±f×2n\\pm f \\times 2^n±f×2n这样的形式来表示数字。\n

\n

二进制小数与二进制科学记数法

\n

十进制的小数和科学记数法很好理解,但是二进制没那么直观。我们先看个简单的例子。
\n
\n例1 用二进制小数和科学记数法表示32.125

\n

对于十进制来说 32.125=30+2+0.1+0.02+0.005\\ 32.125=30+2+0.1+0.02+0.005 32.125=30+2+0.1+0.02+0.005, 可以拆分为以下几个部分

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
101100.10-110-210-3
32.125
\n

所以 32.125=3×101+2×100+1×101+2×102+5×103=3.2125×101\\ 32.125=3 \\times 10^1+2 \\times 10^0+1 \\times 10^{-1}+2 \\times 10^{-2}+5 \\times 10^{-3}=3.2125 \\times 10^{1} 32.125=3×101+2×100+1×101+2×102+5×103=3.2125×101

\n

类似的,对于二进制来说,32.125=32+0.12532.125=32+0.12532.125=32+0.125,可以拆分如下

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
252423222120.2-12-22-3
100000.001
\n

因此 32.125=1×25+0×24+0×23+0×22+0×21+0×20+0×21+0×22+1×23=100000.0012=1.000000012×25\\ 32.125=1 \\times 2^{5}+0 \\times 2^{4}+0 \\times 2^{3}+0 \\times 2^{2}+0 \\times 2^{1}+0 \\times 2^{0}+0 \\times 2^{-1}+0 \\times 2^{-2}+1 \\times 2^{-3}=100000.001_{2}=1.00000001_{2} \\times 2^{5} 32.125=1×25+0×24+0×23+0×22+0×21+0×20+0×21+0×22+1×23=100000.0012=1.000000012×25

\n

先记住这样的形式,接下来浮点数内容中会用到。
\n

\n

IEEE-754双精度浮点数

\n

IEEE-754标准用64位二进制数,以二进制科学记数法的形式表示双精度浮点数,主要分为符号、指数、有效数字三部分。根据标准,64位浮点数的存储结构如下:\n

\n

存储结构

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction
63bit
(1 bit)
62bit...52bit
(11 bits)
51bit...0bit
(52 bits)
0=>正数
1=>负数
按照11bits无符号数处理
实际值=exponent-1023
XXXXX视为二进制小数0.XXXXX2
实际值=fraction+1
\n

基本计算公式是  N=(1)sign×2exponent1023×(1+fraction)\\ N = (-1)^{sign} \\times 2^{exponent-1023} \\times (1+fraction) N=(1)sign×2exponent1023×(1+fraction)

\n
\n

计算方法

\n
    \n
  1. \n

    符号位

    \n
      \n
    • sign=0的时候为正数,sign=1的时候为负数,因此定义最终的符号计算方式为 (1)sign\\ (-1)^{sign} (1)sign
    • \n
    \n
  2. \n
  3. \n

    指数部分

    \n
      \n
    • 11位二进制数以无符号数处理,可以表示总共211,即2048个数,可表示区间为[0, 2047]
    • \n
    • 通过减去1023的偏移量,转换到区间[-1022,1023],原区间0和2047作为特殊情况保留
    • \n
    \n
  4. \n
  5. \n

    有效数部分

    \n
      \n
    • 按照标准规范之后,所有的数都默认第一位为1,因此存储时予以省略,仅存储小数点后的二进制部分
    • \n
    \n
  6. \n
\n
\n

例2 写出32.125对应的IEEE浮点数
\n例1中得到了\n32.125=1.000000012×2532.125=1.00000001_2 \\times 2^{5}32.125=1.000000012×25

\n

下面根据浮点数的计算公式,计算对应的二进制表示

\n
    \n
  • 符号位:32.125显然为正数,因此符号位是0
  • \n
  • \n

    指数部分:指数为5,根据公式,exponent=5+1023=1028=1024+4exponent = 5+1023=1028=1024+4exponent=5+1023=1028=1024+4,因此指数部分11位二进制数为100 0000 0100,如下:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    10bit9bit8bit7bit6bit5bit4bit3bit2bit1bit0bit
    210=102429=51228=25627=12826=6425=3224=1623=822=421=220=1
    10000000100
    \n
  • \n
  • 小数部分:因为标准只存储小数部分,因此 fraction=1.000000011=0.000000012\\ fraction=1.00000001-1=0.00000001_2 fraction=1.000000011=0.000000012,如下:
  • \n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
51bit50bit49bit48bit47bit46bit45bit44bit43bit42bit...0bit
0000000100...0
\n

最终的二进制表示为

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction
010000000100(1).0000000100000000000000000000000000000000000000000000
\n
\n

特殊情况

\n

特殊情况有3种,分别是0,正负无穷大和NaN:

\n
    \n
  • \n

    0

    \n
      \n
    • 符号位为0
    • \n
    • 指数部分全为0,即exponent为0
    • \n
    • 小数部分为0
    • \n
    \n
  • \n
  • \n

    无穷大

    \n
      \n
    • 符号位任意
    • \n
    • 指数部分全为1,即exponent为2047
    • \n
    • 小数部分为0
    • \n
    \n
  • \n
  • \n

    NaN

    \n
      \n
    • 符号位任意
    • \n
    • 指数部分全为1,即exponent为2047
    • \n
    • 小数部分非0
    • \n
    \n
  • \n
\n



\n

浮点数的误差

\n

双精度浮点数只有64位,如果一个十进制数无法被64位二进制数完整表示,那么就会产生误差。首先十进制数需要转换为二进制数,再将二进制数转换为符合IEEE-754标准的形式。这个过程有可能带来误差。
\n

\n

十进制转浮点数

\n

十进制转换时,按照整数部分+小数部分分别计算的原则。整数部分使用除2取余法,小数部分使用乘2取整法。
\n

\n

例3 32.125转换为二进制数
\n先处理整数部分32

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
被除数余数
32160
1680
840
420
210
101
\n

从下往上取余数,于是得到10 0000

\n

再处理小数部分

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
被乘数整数
0.1250.250
0.250.50
0.511
\n

从上往下取整数,得到001

\n

所以最后得到 32.125=100000.0012\\ 32.125=100000.001_2 32.125=100000.0012
\n
\n例4 将0.1转换为IEEE浮点数
\n按照例3中的小数转换为二进制的方法,计算如下:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
被乘数整数
0.10.20
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
\n

可以看到出现了循环, 0.110=0.000112=1.100112×24\\ 0.1_{10} = 0.0\\overline{0011}_2=1.1 \\overline{0011}_2 \\times 2^{-4} 0.110=0.000112=1.100112×24

\n

无限循环的0.1无法被有限64位完整表示,必须截断后才能保存,这个过程必然会带来误差。先按照例2的方法,可将其转换为浮点数,如下:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction无法表示部分
001111111011‬(1).100110011001100110011001100110011001100110011001100110011...0011...
\n
\n

舍入

\n

IEEE-754规范默认采用的舍入规则是“向最接近的值舍入”,即数字向上或向下舍入,使得舍入后的值最接近原值,如果二者精确度相同,选择偶数的结果。在二进制中,最后一位为0是偶数,1是奇数。
\n
\n例4-续

\n

0.1的二进制小数是无限循环的,转换为浮点数必然存在舍入操作

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction无法表示部分
001111111011‬(1).100110011001100110011001100110011001100110011001100110011...0011...
\n

为了便于描述,取fraction后2位视为整数,取无法表示部分前4位作为小数,合并记为01.1001,如上表中黑体部分。根据舍入规则,fraction最后2位有效数字为01,如果向上舍入变为10,向下舍入变为00,如何选择呢?

\n
\n

01.1001的整数部分01,正好是向上舍入后值10的一半,再加上小数部分大于10的一半,因此向上舍入为10的误差小于向下舍入为00的误差,所以这里选择向上舍入。

\n
\n

因此,0.110以二进制形式保存的值实际上比自身要大一点点,具体表示如下:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction
001111111011‬(1).1001100110011001100110011001100110011001100110011010
\n
\n

例5 将0.2转换为IEEE浮点数
\n与例4类似,转换过程如下

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
被乘数整数
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
0.40.80
0.81.61
0.61.21
0.20.40
0.40.80
\n

可以看到也出现了循环,因此 0.210=0.00112=1.100112×23\\ 0.2_{10} = 0.\\overline{0011}_2=1.1\\overline{0011}_2 \\times 2^{-3} 0.210=0.00112=1.100112×23

\n

转换为浮点数如下:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction无法表示部分
001111111100(1).100110011001100110011001100110011001100110011001100110011...0011...
\n

按照舍入规则,最终二进制表示为

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
符号位sign指数exponent有效数fraction
001111111100‬(1).1001100110011001100110011001100110011001100110011010
\n

可以看到,它比真实的0.2也大了一点点。

\n



\n

0.1+0.2

\n

按照规范,两个浮点数计算时有一个步骤叫做对阶,就是让2个操作数的小数点对齐,把较小的指数转化为较大的指数,然后再按照符号进行小数部分的计算。以0.1+0.2为例:

\n
\n

0.110 =1.100112×2-4
\n0.210 = 1.100112×2-3

\n
\n

计算时,要将0.1变为0.2的同阶

\n
\n

0.110 =0.1100112×2-3
\n0.210 = 1.100112×2-3

\n
\n

反映到二进制上就是对0.1的二进制码进行右移。因为两数的指数仅相差1,因此只需要右移1位:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
0.1符号位sign指数exponent有效数fraction
移位前001111111011(1).1001100110011001100110011001100110011001100110011010
移位后001111111100(0).1100110011001100110011001100110011001100110011001101(0)
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
0.2符号位sign指数exponent有效数fraction
不移位001111111100‬(1).1001100110011001100110011001100110011001100110011010
\n

相加时,指数不变,有效数部分(包括隐含的1)进行相加,变成了

\n0.1100110011001100110011001100110011001100110011001101+1.1001100110011001100110011001100110011001100110011010=10.01100110011001100110011001100110011001100110011001110.1100110011001100110011001100110011001100110011001101\\\\+1.1001100110011001100110011001100110011001100110011010\\\\\n=10.01100110011001100110011001100110011001100110011001110.1100110011001100110011001100110011001100110011001101+1.1001100110011001100110011001100110011001100110011010=10.0110011001100110011001100110011001100110011001100111\n

因为规范要求有效数的第一位为1,所以需要将和的小数点左移1位,同时指数部分加1。移位后有效数小数部分发生舍入。
\n舍入时,最后四位是011(1),向上舍入变成100,向下舍入变为011。原值恰好位于二者中间,无论舍入方案如何,误差都一样。在“向最接近的值舍入”失效的情况下,采用舍入后是偶数的表示形式,即向上舍入变为100。

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
0.1+0.2符号位sign指数exponent有效数fraction
移位前001111111100(10).0110011001100110011001100110011001100110011001100111
移位后001111111101(1).0011001100110011001100110011001100110011001100110011(1)
舍入后001111111101(1).0011001100110011001100110011001100110011001100110100
\n

再将二进制码转换为十进制数,于是得到
\n0.1+0.2 = (-1)0×2(1021-1023)×(1+1×2-3+1×2-4+1×2-7+1×2-8+1×2-11+1×2-12+1×2-15+1×2-16+1×2-19+1×2-20+1×2-23+1×2-24+1×2-27+1×2-28+1×2-31+1×2-32+1×2-35+1×2-36+1×2-39+1×2-40+1×2-43+1×2-44+1×2-47+1×2-48+1×2-50)=0.3000000000000000444089209850062616169452667236328125 ≈ 0.30000000000000004

\n

题外话

\n
    \n
  • \n

    为什么按照符号位->指数->有效数这样的顺序进行排列二进制位?

    \n
      \n
    • 这样可以提高比较的速度,尽量实现一次比较得出结果:
    • \n
    • 首先比较符号位,如果正负不同,谁大谁小一目了然;
    • \n
    • 如果符号相同,那么比较指数,指数大的更大;
    • \n
    • 如果指数也相同,那么最后再比较有效数的部分;
    • \n
    • 所以才将符号位放在的最高权重位MSB上,而指数和有效数依次放在后面。
    • \n
    \n
  • \n
  • 很显然指数可正可负,这样可以分别表示大于1或小于1的数;
  • \n
  • 如果用补码表示,比较的时候又需要先比较符号位再比较数据位,规则太复杂。因此直接把11bits的指数部分当作了无符号数进行计算比较,再通过一个偏移把它映射到一个包含正负的对称区间内;
  • \n
  • 11位的二进制数可以表示211,即2048个数,所以11位无符号数可以表示区间[0, 2047],通过减去偏移1024或1023,可以分别映射为2个对称区间:[-1024, 1023]或[-1023,1024]。
  • \n
  • \n

    标准中最终选择了1023作为偏移,原区间内0和2047作为特殊情况保留,得到转换后的有效指数区间[-1022,1023]。至于标准为什么要映射到对称区间,同时偏移为什么选择1023

    \n
    \n

    The reason for having |emin| < emax is so that the reciprocal of the smallest number will not overflow. Although it is true that the reciprocal of the largest number will underflow, underflow is usually less serious than overflow.

    \n
    \n
  • \n
  • 因为浮点数可以有多种表示方式,比如1.12×25,也可以写作112×24,又或者0.112×26(因为小数点的位置可变,所以这种类型被称为浮点数)。为了规范表示,避免出现同一个数出现多种表示方法的情况,标准规定采用前者的形式,即第一位始终为1
  • \n
  • 这样隐性增加了1位,提高了精度
  • \n
\n
\n

参考文献

\n
    \n
  1. https://floating-point-gui.de/formats/fp/
  2. \n
  3. https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
  4. \n
  5. https://www.cnblogs.com/bossin/archive/2007/04/08/704567.html
  6. \n
  7. https://www.eecs.wsu.edu/~jdelgado/EE334/chp3b.pdf
  8. \n
  9. https://en.wikipedia.org/wiki/Exponent_bias
  10. \n
  11. http://blog.reverberate.org/2014/09/what-every-computer-programmer-should.html
  12. \n
  13. http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html
  14. \n
  15. https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
  16. \n
  17. http://www.oxfordmathcenter.com/drupal7/node/43
  18. \n
  19. https://blog.angularindepth.com/the-mechanics-behind-exponent-bias-in-floating-point-9b3185083528
  20. \n
","frontmatter":{"date":"October 01, 2018","title":"IEEE-754标准与JS中的number类型","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/IEEE-754标准与JS中的number类型/","previous":{"fields":{"slug":"/Blog/JS中的隐式转换/"},"frontmatter":{"title":"JS中的隐式转换"}},"next":{"fields":{"slug":"/Blog/array.indexof和array.includes/"},"frontmatter":{"title":"array.indexOf和array.includes"}}}}} \ No newline at end of file diff --git a/page-data/Blog/Intro to Docker/page-data.json b/page-data/Blog/Intro to Docker/page-data.json new file mode 100644 index 0000000..274035b --- /dev/null +++ b/page-data/Blog/Intro to Docker/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Intro to Docker/","result":{"data":{"markdownRemark":{"id":"362bffe2-a8a0-514b-b5f4-7916692907d8","excerpt":"","html":"","frontmatter":{"date":"May 15, 2020","title":"Intro to Docker","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Intro to Docker/","previous":{"fields":{"slug":"/Blog/Websocket初步/"},"frontmatter":{"title":"Websocket初步"}},"next":{"fields":{"slug":"/Blog/BGP Hijacking/"},"frontmatter":{"title":"BGP Hijacking"}}}}} \ No newline at end of file diff --git a/page-data/Blog/Intro to Functional Programming/page-data.json b/page-data/Blog/Intro to Functional Programming/page-data.json new file mode 100644 index 0000000..c01612a --- /dev/null +++ b/page-data/Blog/Intro to Functional Programming/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Intro to Functional Programming/","result":{"data":{"markdownRemark":{"id":"642301ea-ca1f-50da-8876-12246915c618","excerpt":"","html":"","frontmatter":{"date":"May 02, 2020","title":"Intro to Functional Programming","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Intro to Functional Programming/","previous":{"fields":{"slug":"/Blog/php调参优化小记/"},"frontmatter":{"title":"php调参优化小记"}},"next":{"fields":{"slug":"/Blog/Websocket初步/"},"frontmatter":{"title":"Websocket初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/JSBridge\347\232\204\344\270\200\347\202\271\346\200\273\347\273\223/page-data.json" "b/page-data/Blog/JSBridge\347\232\204\344\270\200\347\202\271\346\200\273\347\273\223/page-data.json" new file mode 100644 index 0000000..f16ebfa --- /dev/null +++ "b/page-data/Blog/JSBridge\347\232\204\344\270\200\347\202\271\346\200\273\347\273\223/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/JSBridge的一点总结/","result":{"data":{"markdownRemark":{"id":"f10505f3-3720-58aa-8aad-b78722974c24","excerpt":"写在前面 最近做了几个混合App开发的需求,涉及到了JSBridge,记录一下 一点总结 webview的URL最大长度,跟使用的浏览器内核有关,和客户端同学测试过是8182个字符,和chrome标称的长度一致,所以我司webview内核用的应该是chrome","html":"

写在前面

\n

最近做了几个混合App开发的需求,涉及到了JSBridge,记录一下

\n

一点总结

\n

webview的URL最大长度,跟使用的浏览器内核有关,和客户端同学测试过是8182个字符,和chrome标称的长度一致,所以我司webview内核用的应该是chrome

","frontmatter":{"date":"September 28, 2019","title":"JSBridge的一点总结","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/JSBridge的一点总结/","previous":{"fields":{"slug":"/Blog/PM2遇到的一个小问题/"},"frontmatter":{"title":"PM2遇到的一个小问题"}},"next":{"fields":{"slug":"/Blog/前端二年/"},"frontmatter":{"title":"前端二年"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/JS\344\270\255\347\232\204\351\232\220\345\274\217\350\275\254\346\215\242/page-data.json" "b/page-data/Blog/JS\344\270\255\347\232\204\351\232\220\345\274\217\350\275\254\346\215\242/page-data.json" new file mode 100644 index 0000000..ada9d92 --- /dev/null +++ "b/page-data/Blog/JS\344\270\255\347\232\204\351\232\220\345\274\217\350\275\254\346\215\242/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/JS中的隐式转换/","result":{"data":{"markdownRemark":{"id":"03287e36-0dba-56a1-b4f5-a1090bd5b8e6","excerpt":"date: 2018-09-21 基本类型隐式转换 基本类型转换为Boolean类型 基本类型转换为String类型 基本类型转换为Number类型 对象隐式转换为基本类型 基本类型隐式转换 基本类型转换为Boolean类型 隐式转换相当于调用Boolean(value…","html":"\n

隐式转换相当于调用Boolean(value)方法,其底层实现为ToBoolean(value)方法,转换规则如下表:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
数据类型转换为true的值转换为false的值
Booleantruefalse
String非空字符串
(value.length>0)
空字符串''
(value.length===0)
Number非零值0 或 NaN
Undefined\\false
Null\\false
Symbol任何值\\
\n
\n

注:转换为Boolean为false的值有:'', false, 0, NaN, undefined, null

\n
\n

例1

\n
Boolean('') //空字符串,0\nBoolean(' ') //含有一个空格的字符串,1
\n



\n
基本类型转换为String类型
\n

隐式转换相当于调用String(value)方法,其底层实现为ToString(value)方法,规则如下表:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
数据类型转换为string的值
Booleantrue=>'true'
false=>'false'
Null'null'
Undefined'undefined'
Number数字的string值
String不转换
Symbol抛出TypeError异常
\n

例2

\n
String(false) //'false'\nString(1.32e3) //'1320'\nString(-Infinity) //'-Infinity'\nString(NaN) // 'NaN'
\n



\n
基本类型转换为Number类型
\n

隐式转换相当于调用Number(value)方法,底层实现为ToNumber(value)方法,规则如下表:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
数据类型转换为number的值
UndefinedNaN
Null0
Booleantrue=> 1
false=>0
Number不转换
String1.空字符串或仅有空格的字符串=>0
2.整数=>保留符号,忽略整数中的先导0,返回整数
3.浮点数=>保留符号,忽略先导0,返回浮点数
4.十六进制数=>返回相同大小的十进制数
5.二进制数=>返回相同大小的十进制数
6.八进制数=>返回相同大小的十进制数
7.科学记数法=>返回相同大小的十进制数
8.其他=>返回NaN
注:数字字符串中头尾2端的空白,转换时都将被忽略
Symbol抛出TypeError异常
\n

例3

\n
Number('') //0\nNumber('    ') //0\nNumber(' -1.33e3 ') //-1330\nNumber(' 0x10') //16\nNumber(' 1232 4345') //NaN
\n



\n
\n

对象隐式转换为基本类型

\n

对象转换为基本类型时:

\n
    \n
  1. 首先调用ToPrimitive ( input [, PreferredType] )方法,当input可转换为多种基本类型时,可选参数PrefreredType指定优先转换类型
  2. \n
  3. \n

    随后调用OrdinaryToPrimitive(input,hint)方法,其中hint值由PrefreredType决定,且为以下之一:[\"default\", \"string\", \"number\"]:

    \n
      \n
    1. 如果PrefreredType值为hint String, 则 hint值为\"string\",依次调用对象的toString, valueOf方法,直至返回值为基本类型
    2. \n
    3. 如果PrefreredType值为hint Number, 则 hint值为\"number\",依次调用对象的valueOf, toString方法,直至返回值为基本类型
    4. \n
    5. 如果PrefreredType未指定, 则 hint值为\"default\",按2步骤执行
    6. \n
    7. \n

      如果上述执行完毕后,返回值仍不是基本类型,抛出TypeError异常

      \n
      \n

      注:
      \n1.Date对象在转换时,其PrefreredTypehint String
      \n2.以上对象默认转换规则,如果对象重写了默认的toString 和/或 valueOf方法,致使无法返回基本类型,那么将抛出TypeError异常

      \n
      \n
    8. \n
    \n
  4. \n
\n

例4

\n
let a = {};\na+1 //'[object Object]1'\na.toString() //'[object Object]'\n\nfunction Test(){\n    this.valueOf = function(){return 112233}\n}\na = new Test();\na+1 //112234\nString(a) //'[object Object]'\n\nfunction Test2(){\n  this.toString = function(){return []};\n}\na= new Test2();\na+1 //TypeError: Cannot convert object to primitive value 
\n
    \n
  • 上例中,先将a声明为空对象,a+1进行计算时,a按照规则2.3进行转换,先根据原型链调用Object.valueOf()方法,返回对象自身,然后继续调用Object.toString()方法返回值'[object Object]',最后将a和数字1进行字符串拼接,得到结果;
  • \n
  • 之后将a声明为Test类的实例对象,Test中重写了valueOf()方法,再次进行a+1计算时,按照规则2.3进行转换,此时valueOf()方法返回值为基本类型,不再继续调用toString()方法,于是结果变为112234;而调用String(a)将对象优先转换为string类型,仍然调用的是Object.toString()方法,结果与之前相同
  • \n
  • 再次声明Test2类,确保其2个方法都没有返回基本类型,再次计算实例a+1时,抛出了TypeError错误
  • \n
","frontmatter":{"date":"September 21, 2018","title":"JS中的隐式转换","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/JS中的隐式转换/","previous":{"fields":{"slug":"/Blog/加法操作符/"},"frontmatter":{"title":"加法操作符"}},"next":{"fields":{"slug":"/Blog/IEEE-754标准与JS中的number类型/"},"frontmatter":{"title":"IEEE-754标准与JS中的number类型"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/JavaScript\344\270\255\347\232\204\345\216\237\345\236\213\351\223\276/page-data.json" "b/page-data/Blog/JavaScript\344\270\255\347\232\204\345\216\237\345\236\213\351\223\276/page-data.json" new file mode 100644 index 0000000..9f78ae9 --- /dev/null +++ "b/page-data/Blog/JavaScript\344\270\255\347\232\204\345\216\237\345\236\213\351\223\276/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/JavaScript中的原型链/","result":{"data":{"markdownRemark":{"id":"3f2a1e16-aa8f-5c90-a824-edea76e7b8b4","excerpt":"原型链的前提规则 原型链关系试验 试验的一点解释 原型链关系图 原型链的前提规则 任何对象都拥有__proto__属性,指向其 构造函数 (constructor function) 的 原型 (prototype) 对象 例: 假设有数组对象 a…","html":"\n
\n

原型链的前提规则

\n
    \n
  1. \n

    任何对象都拥有__proto__属性,指向其 构造函数 (constructor function)原型 (prototype) 对象

    \n
      \n
    • 例: 假设有数组对象 a,因为它是由数组构造函数Array创建的,那么a.__proto__将指向Array.prototype
    • \n
    \n
  2. \n
\n

这里可以引申出 2 个推论:

\n
\n

推论 1.1:因为构造函数 (constructor function)是函数,而函数都是对象,所以构造函数也是对象。它也有__proto__属性,__proto__指向构造函数之构造函数的原型 (prototype) 对象;

\n
\n
\n

推论 1.2原型 (prototype) 对象也是对象,所以也有__proto__属性,并指向 Object 构造函数原型Object.prototype

\n
\n

疑问 1.1Object.prototype是否也是对象?如果是,那么它也应该有__proto__属性,这个属性应该指向它自身?如果不是对象,那它是什么?

\n
    \n
  1. \n

    任何函数都是 函数 (Function) 创建的实例,且拥有prototype属性,该属性指向函数对应的原型 (prototype) 对象Function.prototype

    \n

    根据 2 和推论 1.1,可以得到推论:

    \n
  2. \n
\n
\n

推论 2.1:构造函数既是对象,又是函数实例,因此它不仅拥有__proto__属性,也拥有prototype属性

\n
\n
\n

推论 2.2:构造函数的__proto__属性指向其上一级构造函数原型 (prototype) 对象,即Function.prototype, 它的prototype属性指向[[constructor]].prototype

\n
\n

疑问 2.1Function作为元构造函数,其自身又是哪个构造函数的实例呢?如果Function是自身的实例,那么其__proto__属性应该指向Function.prototype;如果不是,它的__proto__属性会指向哪里?

\n
    \n
  1. \n

    构造函数的原型 (prototype)对象都有一个构造函数(constructor)属性,指向其对应的构造函数

    \n
      \n
    • 例:即 Array.prototype.constructor 将指向 Array
    • \n
    \n
  2. \n
\n

原型链关系试验

\n
/*** 疑问1.1 ***/\ntypeof Object.prototype; // 'object'\nObject.prototype === null; // false\n//解释:Object.prototype是对象,按照基础概念1,它有__proto__属性\n\nObject.prototype.__proto__; // null\n//解释:Object.prototype.__proto__指向null,它没有__proto__属性\n\nObject.prototype instanceof Object; // false\n//解释:Object.prototype不是Object的实例\n\n/************************************************************/\n\n/*** 疑问2.1***/\ntypeof Function; // 'function'\nFunction instanceof Function; // true\nFunction instanceof Object; // true\n//解释:Function是构造函数,它是函数,也是对象,所以既有prototype属性,也有__proto__属性\n\nFunction.__proto__ == Function.prototype; // true\n//解释:根据推论1.1,Function的构造函数是它自己\n\ntypeof Function.prototype; // 'function'\nFunction.prototype.prototype; // undefined\n//解释:Function.prototype是函数,但它没有prototype属性\n\nFunction.prototype instanceof Function; // fasle\nFunction.prototype instanceof Object; // true\nFunction.prototype.__proto__ == Object.prototype; // true\n//解释:Function.prototype是函数,但它不是Function的实例,却是Object的实例\n\ntypeof Object; // 'function'\nObject instanceof Function; // true\nObject.__proto__ == Function.prototype; // true\n//解释:Object是构造函数,它是Function的实例
\n

这里出现了 2 个矛盾点,集中在Object.prototypeFunction.prototype这 2 个对象:

\n
    \n
  1. Object.prototype是对象,却不是 Object 创建的
  2. \n
  3. Function.prototype是函数,却不是 Function 创建的,而是由 Object 创建,但 Object 明明是 Function 的实例
  4. \n
\n

如果说按照常理,第一点已经怪异到看不懂,那么第二点则是直接变成了“先有鸡 (Function),还是先有蛋 (Object)”的哲学拷问。

\n

试验的一点解释

\n

逻辑上这样自然说不通,那么只能说明一开始的前提规则错了,或者更具体点说,提到的这 2 个对象是超越规则的存在,不受前提规则的约束。查了下标准,果然这两个东西是基于规则创建的,为了兼容旧版本 JS 设定了一些规则,和构造函数其实没什么关系。

\n

关于 Object.prototype(注意加粗部分)

\n
\n

ECMA-262 19.1.3 Properties of the Object Prototype Object

\n

The Object prototype object is the intrinsic object %ObjectPrototype%. The Object prototype object is an ordinary object.

\n

The value of the [[Prototype]] internal slot of the Object prototype object is null and the initial value of the [[Extensible]] internal slot is true.

\n
\n

关于 Function.prototype(注意加粗部分)

\n
\n

ECMA-262 19.2.3 Properties of the Function Prototype Object

\n

The Function prototype object is the intrinsic object %FunctionPrototype%. The Function prototype object is itself a built-in function object. When invoked, it accepts any arguments and returns undefined. It does not have a [[Construct]] internal method so it is not a constructor.

\n

NOTE - The Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.

\n

The value of the [[Prototype]] internal slot of the Function prototype object is the intrinsic object %ObjectPrototype% (19.1.3). The initial value of the [[Extensible]] internal slot of the Function prototype object is true.

\n

The Function prototype object does not have a prototype property.

\n

The value of the length property of the Function prototype object is 0.

\n

The value of the name property of the Function prototype object is the empty String.

\n
\n

原型链关系图

\n

最后附上一张自己理解的图,权当费脑子的证明吧

\n

\n \n \n \n \n

","frontmatter":{"date":"March 24, 2019","title":"JavaScript中的原型链","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/JavaScript中的原型链/","previous":{"fields":{"slug":"/Blog/判断有序数组B是否为有序数组A的子集/"},"frontmatter":{"title":"判断有序数组B是否为有序数组A的子集"}},"next":{"fields":{"slug":"/Blog/2019半年小结/"},"frontmatter":{"title":"2019半年小结"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/JavaScript\345\211\215\347\253\257RSA\345\212\240\345\257\206/page-data.json" "b/page-data/Blog/JavaScript\345\211\215\347\253\257RSA\345\212\240\345\257\206/page-data.json" new file mode 100644 index 0000000..19f0db7 --- /dev/null +++ "b/page-data/Blog/JavaScript\345\211\215\347\253\257RSA\345\212\240\345\257\206/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/JavaScript前端RSA加密/","result":{"data":{"markdownRemark":{"id":"f0205ecb-fbdb-50a5-b0f3-7e5964c32191","excerpt":"照例挖坑","html":"

照例挖坑

","frontmatter":{"date":"May 02, 2018","title":"JavaScript前端RSA加密","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/JavaScript前端RSA加密/","previous":{"fields":{"slug":"/Blog/JavaScript加密URL/"},"frontmatter":{"title":"JavaScript加密URL"}},"next":{"fields":{"slug":"/Blog/null和undefined的比较/"},"frontmatter":{"title":"null和undefined的比较"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/JavaScript\345\212\240\345\257\206URL/page-data.json" "b/page-data/Blog/JavaScript\345\212\240\345\257\206URL/page-data.json" new file mode 100644 index 0000000..725e13c --- /dev/null +++ "b/page-data/Blog/JavaScript\345\212\240\345\257\206URL/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/JavaScript加密URL/","result":{"data":{"markdownRemark":{"id":"8ec57150-bb10-5dae-8b7c-0f0890c82e6f","excerpt":"挖坑,等填 调试 REST API 遇到的问题\n用户密码加密后,还要再经过一边 URL 加密\nencodeURIComponent","html":"

挖坑,等填

\n

调试 REST API 遇到的问题\n用户密码加密后,还要再经过一边 URL 加密\nencodeURIComponent

","frontmatter":{"date":"May 01, 2018","title":"JavaScript加密URL","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/JavaScript加密URL/","previous":{"fields":{"slug":"/Blog/normalizr扁平化递归结构的json/"},"frontmatter":{"title":"normalizr扁平化递归结构的json"}},"next":{"fields":{"slug":"/Blog/JavaScript前端RSA加密/"},"frontmatter":{"title":"JavaScript前端RSA加密"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/JavaScript\347\274\226\347\240\201URL/page-data.json" "b/page-data/Blog/JavaScript\347\274\226\347\240\201URL/page-data.json" new file mode 100644 index 0000000..0f9b139 --- /dev/null +++ "b/page-data/Blog/JavaScript\347\274\226\347\240\201URL/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/JavaScript编码URL/","result":{"data":{"markdownRemark":{"id":"df6bd36a-4bd1-5dcb-988c-2d3bffe11ec0","excerpt":"挖坑,等填 调试 REST API 遇到的问题\n用户密码加密后,还要再经过一边 URL 加密\nencodeURIComponent","html":"

挖坑,等填

\n

调试 REST API 遇到的问题\n用户密码加密后,还要再经过一边 URL 加密\nencodeURIComponent

","frontmatter":{"date":"May 01, 2018","title":"JavaScript编码URL","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/JavaScript编码URL/","previous":{"fields":{"slug":"/Blog/normalizr扁平化递归结构的json/"},"frontmatter":{"title":"normalizr扁平化递归结构的json"}},"next":{"fields":{"slug":"/Blog/JavaScript前端RSA加密/"},"frontmatter":{"title":"JavaScript前端RSA加密"}}}}} \ No newline at end of file diff --git a/page-data/Blog/LeetCode-1-Two Sum/page-data.json b/page-data/Blog/LeetCode-1-Two Sum/page-data.json new file mode 100644 index 0000000..66d57b7 --- /dev/null +++ b/page-data/Blog/LeetCode-1-Two Sum/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/LeetCode-1-Two Sum/","result":{"data":{"markdownRemark":{"id":"10736f50-ca44-5117-a343-1d80c5d049fc","excerpt":"Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input…","html":"

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

\n

You may assume that each input would have exactly one solution, and you may not use the same element twice.

\n

Example:

\n
\n

Given nums = [2, 7, 11, 15], target = 9,

\n

Because nums[0] + nums[1] = 2 + 7 = 9,\nreturn [0, 1].

\n
\n

题目类型分析

\n

Two Sum 可以说是 LC 最经典的题目,没做过 Two Sum 甚至都不好意思说自己刷过 LC。每次看到这道题都会想起自己刷题初期的窘迫,百感交集。

\n

这道题没有什么复杂的规则,属于数据结构应用。

\n

解法

\n
    \n
  1. \n

    暴力解法

    \n

    什么也不想的情况下,第一反应肯定是 brutal force ,2 个 for 循环就完事了。时间复杂度  O(n2)\\ O(n^2) O(n2), 效率实在不高。

    \n
    var twoSum = function(nums, target) {\n var res = [];\n for (let i = 0; i < nums.length; i++) {\n   for (let j = i + 1; j < nums.length; j++) {\n     if (nums[i] + nums[j] == target) {\n       res[0] = nums[i];\n       res[1] = nums[j];\n     }\n   }\n }\n return res;\n};
    \n
  2. \n
  3. \n

    hashmap 两次遍历

    \n

    换一个思路,可以用空间来换时间,先遍历数组,在 hashmap 里建立元素索引,然后再遍历数组,在 hashmap 里找对应元素的配对。这样就把时间复杂度降低到了 O(n)\\ O(n) O(n),当然空间复杂度也提升到了 O(n)\\ O(n) O(n)

    \n
    var twoSum = function(nums, target) {\n var map = {},\n   res = [];\n //建立索引\n for (let i = 0; i < nums.length; i++) {\n   if (map[nums[i]] == undefined) map[nums[i]] = i;\n }\n //查找配对元素\n for (let i = 0; i < nums.length; i++) {\n   let residual = target - nums[i];\n   if (map[residual] != undefined && map[residual] != i) {\n     res.push(map[residual]);\n     res.push(i);\n     break;\n   }\n }\n return res;\n};
    \n
  4. \n
  5. \n

    hashmap 一次遍历

    \n

    解法 2 当然可以再优化一下,只需要一次遍历就可以找到结果。少了一次遍历,时间复杂度和空间复杂度同上。

    \n
  6. \n
\n
var twoSum = function(nums, target) {\n  var map = {},\n    res = [];\n  for (let i = 0; i < nums.length; i++) {\n    let curElement = nums[i];\n    let residual = target - curElement;\n    //找到当前元素的配对\n    if (map[residual] !== undefined) {\n      res.push(map[residual]);\n      res.push(i);\n      break;\n    }\n    //建立元素索引\n    map[curElement] = i;\n  }\n  return res;\n};
","frontmatter":{"date":"February 28, 2019","title":"[LeetCode 1] Two Sum","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/LeetCode-1-Two Sum/","previous":{"fields":{"slug":"/Blog/转-如何有效地写算法题/"},"frontmatter":{"title":"[转] 如何有效地写算法题"}},"next":{"fields":{"slug":"/Blog/判断有序数组B是否为有序数组A的子集/"},"frontmatter":{"title":"判断有序数组B是否为有序数组A的子集"}}}}} \ No newline at end of file diff --git a/page-data/Blog/LeetCode-2-Add Two Numbers/page-data.json b/page-data/Blog/LeetCode-2-Add Two Numbers/page-data.json new file mode 100644 index 0000000..21b2193 --- /dev/null +++ b/page-data/Blog/LeetCode-2-Add Two Numbers/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/LeetCode-2-Add Two Numbers/","result":{"data":{"markdownRemark":{"id":"e89253ca-e84d-5893-8d2c-c2cb71b6a2ba","excerpt":"","html":"","frontmatter":{"date":"January 15, 2020","title":"LeetCode-2-Add Two Numbers","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/LeetCode-2-Add Two Numbers/","previous":{"fields":{"slug":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/"},"frontmatter":{"title":"配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问"}},"next":{"fields":{"slug":"/Blog/nginx基本配置/"},"frontmatter":{"title":"nginx基本配置"}}}}} \ No newline at end of file diff --git a/page-data/Blog/LeetCode-278-First Bad Version/page-data.json b/page-data/Blog/LeetCode-278-First Bad Version/page-data.json new file mode 100644 index 0000000..5fdfba6 --- /dev/null +++ b/page-data/Blog/LeetCode-278-First Bad Version/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/LeetCode-278-First Bad Version/","result":{"data":{"markdownRemark":{"id":"a4081362-7685-58ab-8015-0ba2200b9a88","excerpt":"You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the…","html":"

You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.

\n

Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one, which causes all the following ones to be bad.

\n

You are given an API bool isBadVersion(version) which will return whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

\n

题目类型分析

\n

很明显属于查找算法题。
\n题目要求 API 函数使用次数尽可能少,而且查找对象是自增的自然数序列,直接考虑 Binary Search。

\n

解法

\n
    \n
  1. 生搬硬套 binary search 的解法
  2. \n
\n
var solution = function(isBadVersion) {\n  /**\n   * @param {integer} n Total versions\n   * @return {integer} The first bad version\n   */\n  return function(n) {\n    var min = 0;\n    var max = n;\n    var mid;\n    while (max >= min) {\n      mid = Math.floor((max - min) / 2) + min;\n      let result = isBadVersion(mid);\n      if (result ^ isBadVersion(mid - 1)) {\n        return mid;\n      }\n      if (result) {\n        max = mid - 1;\n      } else {\n        min = mid + 1;\n      }\n    }\n  };\n};
\n

上面是硬套 binary search 形式的笨拙解法,通过 min 和 max 两个 pointer 逼近 target,以 mid pointer 及其前一个元素调用 API 的结果来判断 mid 是否为 bad version。

\n

以本题的限制条件来看,上面这段代码中其实有一行逻辑不合理:max=mid-1,尽管它导致的副作用被if (result ^ isBadVersion(mid - 1))排除掉了。

\n

原因:只有当 mid 为 bad version 时,max 才会被修改,但根据返回的信息,我们只能确认 mid 是 bad version,而它恰好有可能是第一个 bad version。因此更合理的写法应该是max=mid。这样修改之后,if (result ^ isBadVersion(mid - 1))这几行代码也不需要了,减少了代码行数,也减少了 API 调用次数。

\n

结束了吗?还没有,循环的判断条件还要修改为max>min;否则当max==min的时候,程序就陷入死循环了。修改之后,当max==min时循环结束,任意返回二者之一就是答案(也可以重新计算mid,再将其返回,此时 max,min,mid 三者相等)。

\n

现在结束了。

\n
    \n
  1. 按题目限制优化后的 binary search 解法
  2. \n
\n

根据上面的思路,优化后的代码如下:

\n
var solution = function(isBadVersion) {\n  /**\n   * @param {integer} n Total versions\n   * @return {integer} The first bad version\n   */\n  return function(n) {\n    var min = 0;\n    var max = n;\n    var mid;\n    while (max > min) {\n      mid = Math.floor((max - min) / 2) + min;\n      if (isBadVersion(mid)) {\n        max = mid;\n      } else {\n        min = mid + 1;\n      }\n    }\n    return max;\n  };\n};
\n

类似题目

\n
    \n
  1. [LeetCode 374] Guess Number Higher or Lower
  2. \n
  3. [LeetCode 34] Find First and Last Position of Element in Sorted Array
  4. \n
  5. [LeetCode 35] Search Insert Position
  6. \n
","frontmatter":{"date":"February 13, 2019","title":"[LeetCode 278] First Bad Version","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/LeetCode-278-First Bad Version/","previous":{"fields":{"slug":"/Blog/LeetCode-88-Merge Sorted Array/"},"frontmatter":{"title":"[LeetCode 88] Merge Sorted Array"}},"next":{"fields":{"slug":"/Blog/转-如何有效地写算法题/"},"frontmatter":{"title":"[转] 如何有效地写算法题"}}}}} \ No newline at end of file diff --git a/page-data/Blog/LeetCode-3-Longest Substring Without Repeating Characters/page-data.json b/page-data/Blog/LeetCode-3-Longest Substring Without Repeating Characters/page-data.json new file mode 100644 index 0000000..7149500 --- /dev/null +++ b/page-data/Blog/LeetCode-3-Longest Substring Without Repeating Characters/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/","result":{"data":{"markdownRemark":{"id":"0f100913-0711-5c14-b7c4-088682d17473","excerpt":"","html":"","frontmatter":{"date":"January 16, 2020","title":"LeetCode-3-Longest Substring Without Repeating Characters","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/","previous":{"fields":{"slug":"/Blog/nginx基本配置/"},"frontmatter":{"title":"nginx基本配置"}},"next":{"fields":{"slug":"/Blog/2019总结与2020年计划/"},"frontmatter":{"title":"2019总结与2020年计划"}}}}} \ No newline at end of file diff --git a/page-data/Blog/LeetCode-461-Hamming Distance/page-data.json b/page-data/Blog/LeetCode-461-Hamming Distance/page-data.json new file mode 100644 index 0000000..810246b --- /dev/null +++ b/page-data/Blog/LeetCode-461-Hamming Distance/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/LeetCode-461-Hamming Distance/","result":{"data":{"markdownRemark":{"id":"5a6f3fb4-05aa-5791-aa3c-4ffa8e3365b4","excerpt":"The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and…","html":"

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

\n

Given two integers x and y, calculate the Hamming distance.

\n

Note:  0x,y<231.\\ 0 ≤ x, y < 2^{31}. 0x,y<231.

\n

题目类型分析

\n

题目要求汉明距离,即统计 2 个数在二进制形式下,不同二进制位的数量。
\n开始没有思路,只能判断出它不是考查数据结构、也不是某种算法的应用,先归入数学类应该是比较稳妥的。

\n

解法

\n
    \n
  1. \n

    暴力求解法
    \n没有思路的情况下最容易想到暴力求解法,大概的流程如下:

    \n
      \n
    • 比较 x, y,假设 x 为二者中较大的一个,并以它为比较基准
    • \n
    • 将 x, y 分别转换为二进制字符串,并将位数对齐
    • \n
    • 从 x 的 LSB 开始,循环比较 y 对应位置的二进制位
    • \n
    • 如果相同,计数不变;如果不同,计数+1
    • \n
    • 循环结束,返回计数结果
    • \n
    \n

    边界情况:如果 x, y 相等,那么直接返回 0;否则按照上述流程进行计算

    \n

    缺陷:存在大量的字符串拼接操作,也保存了完整的二进制字符串。考虑上述两个缺陷,改进的思路有了:1.不使用字符串,考虑直接使用数值进行比较 2. 不保存完整的二进制位,逐位比较完毕后直接丢弃,于是有了下面的解法。

    \n
  2. \n
  3. \n

    改进一点的暴力求解法
    \n用“除二取余法”通过数值计算逐位获取二进制表示,同时完成比较,每次比较完毕后就丢弃结果。与上面提到的改进方向一致,大致流程如下:

    \n
      \n
    • x, y 分别对 2 取余数
    • \n
    • 余数相同,则计数+1;否则不变
    • \n
    • x, y 分别除以 2,不能整除则向下取整
    • \n
    • 重复以上步骤,直至 x, y 均为 0 时,结束循环,返回计数
    • \n
    \n

    边界情况: 同上

    \n

    缺陷:比方法 1 节省了字符串操作和存储,但仍然需要循环计算。

    \n

    能不能免去循环计算的过程呢?当然可以,请看下文。

    \n
  4. \n
  5. \n

    利用数学原理求解
    \n查一下 wiki,汉明距离的标准算法就是 2 个数进行逻辑异或,结果中只包含二者不同的二进制位(也就是'1'),那么把结果中 1 的个数统计出来就是答案。(逻辑运算真是太美好了!)这个方法完整步骤太简单,就不写了。

    \n

    边界情况:同上

    \n

    缺陷: 继承了方法 2 的优点,不仅免去了循环计算,还更容易理解,重要结果一步就可以得到,应该是最优方案了吧。

    \n
  6. \n
","frontmatter":{"date":"February 11, 2019","title":"[LeetCode 461] Hamming Distance","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/LeetCode-461-Hamming Distance/","previous":{"fields":{"slug":"/Blog/开始刷leetcode/"},"frontmatter":{"title":"开始刷leetcode"}},"next":{"fields":{"slug":"/Blog/LeetCode-88-Merge Sorted Array/"},"frontmatter":{"title":"[LeetCode 88] Merge Sorted Array"}}}}} \ No newline at end of file diff --git a/page-data/Blog/LeetCode-88-Merge Sorted Array/page-data.json b/page-data/Blog/LeetCode-88-Merge Sorted Array/page-data.json new file mode 100644 index 0000000..3994955 --- /dev/null +++ b/page-data/Blog/LeetCode-88-Merge Sorted Array/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/LeetCode-88-Merge Sorted Array/","result":{"data":{"markdownRemark":{"id":"05690cee-9b94-5b65-b457-d9d1d763112c","excerpt":"Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: The number of elements initialized in…","html":"

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.

\n

Note:

\n

The number of elements initialized in nums1 and nums2 are m and n respectively.\nYou may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.

\n

题目类型分析

\n

Merge Sort 算法题目,尽可能往这个方向上考虑具体思路。
\n如果不能第一时间想到 Merge Sort 说明数据结构和算法基础需要复习,补好基础继续解题才是正确的路。

\n

解法

\n

现有条件相当于 merge sort 剩最后 2 个子数组,直接比较各自元素再 merge 。
\n题目有限制,要求直接修改 nums1,如果使用额外空间会报错,需要对合并步骤做一些调整。\n题目说明 nums1 长度足够,从数组尾部开始,从后往前向 nums1 中复制元素就可以了,步骤如下:

\n
    \n
  • 比较 nums1 和 nums2 初始尾部元素大小,大的那个移动到 nums1 未使用的尾部
  • \n
  • 重复以上步骤,依次把二个子数组当前最大元素复制到 nums1 的尾部,直至二者其中之一所有元素都已复制
  • \n
  • 因为是将 nums2 元素合并到 nums1 中,所以只需要考虑剩余数组是 nums2 的情况,继续赋值 nums2 的元素,直至将 nums1 数组填满
  • \n
  • 新的 nums1 就是合并后的结果,结束
  • \n
\n

类似题目

\n

不同数据结构的类似题目

\n
    \n
  1. [LeetCode 21] Merge Two Sorted List
  2. \n
  3. [LeetCode 617] Merge Two Binary Trees
  4. \n
","frontmatter":{"date":"February 12, 2019","title":"[LeetCode 88] Merge Sorted Array","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/LeetCode-88-Merge Sorted Array/","previous":{"fields":{"slug":"/Blog/LeetCode-461-Hamming Distance/"},"frontmatter":{"title":"[LeetCode 461] Hamming Distance"}},"next":{"fields":{"slug":"/Blog/LeetCode-278-First Bad Version/"},"frontmatter":{"title":"[LeetCode 278] First Bad Version"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Mac\346\241\214\351\235\242\347\253\257webview\346\211\223\345\274\200\351\241\265\351\235\242\345\244\261\350\264\245\346\216\222\346\237\245/page-data.json" "b/page-data/Blog/Mac\346\241\214\351\235\242\347\253\257webview\346\211\223\345\274\200\351\241\265\351\235\242\345\244\261\350\264\245\346\216\222\346\237\245/page-data.json" new file mode 100644 index 0000000..e289eba --- /dev/null +++ "b/page-data/Blog/Mac\346\241\214\351\235\242\347\253\257webview\346\211\223\345\274\200\351\241\265\351\235\242\345\244\261\350\264\245\346\216\222\346\237\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Mac桌面端webview打开页面失败排查/","result":{"data":{"markdownRemark":{"id":"66c9e06e-fbf8-58c6-873c-cd862e329846","excerpt":"背景 公司产品的Mac桌面端使用webview打开公司PC端主页,主页上有多个Tab。 其中一个Tab(以下简称A Tab,对应地址以下代称为:https://correct.domain.com)可以跳转到我负责的PC端页面(以下简称B页,对应地址https://correct…","html":"

背景

\n

公司产品的Mac桌面端使用webview打开公司PC端主页,主页上有多个Tab。
\n其中一个Tab(以下简称A Tab,对应地址以下代称为:https://correct.domain.com)可以跳转到我负责的PC端页面(以下简称B页,对应地址https://correct.domain.com/desktop)。

\n

问题描述

\n

Mac开发同事反馈在Mac桌面端里点击A Tab无法成功跳转,变成了空白页面,而其他Tab都可以正常点击跳转。

\n

排查过程

\n

这个bug已知信息非常少,而且涉及到2个项目的代码,只有一步步排查了。

\n
    \n
  1. 查看bug是否可以复现
    \nMac客户端内点击A Tab,页面确实变成空白,并且可以稳定复现。
  2. \n
  3. 查看主页上的跳转链接是否正确
    \n浏览器inspect就可以直接看,链接正确。
  4. \n
  5. 打开charles抓包Mac请求
    \n点击A Tab看如何跳转,结果发现了2条有意思的记录:
  6. \n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
url状态码
https://correct.domain.com302
http://correct.domain.com/desktop301
\n

302跳转是预期中的,从业务主域名跳转对应的PC端主页,但不知为什么本来该出现的https变成了http。

\n

所以可以定位问题了,点击确实可以跳转,但是因为出现了http链接,所以被webview拦截了。 接下来只需要排查哪一步出现这个重定向就可以了。

\n
\n

注:苹果推出了ATS,非https请求都会被拦截

\n
\n
    \n
  1. \n

    排查Nginx
    \nNginx里只有如下的配置可能会影响到地址,但它只是重写http为https协议而已,并没有重定向到/desktop的功能。

    \n
    rewrite      ^(.*)$ https://$host$1 permanent;
    \n
  2. \n
\n

事实上在浏览器上如果同样点击A Tab,跳转过程会有如下3条记录:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
url状态码
https://correct.domain.com302
http://correct.domain.com/desktop301
https://correct.domain.com/desktop200
\n

普通浏览器没有ATS机制,所以第2条http地址是可以301跳转到对应的https地址的。

\n

排除Nginx配置问题,只能是代码层面的问题了。

\n
    \n
  1. 排查代码
    \n先搜索后端代码,以/desktop为关键字,然后在PHP路由文件里找到下面这段代码,问题就在这一行了。
  2. \n
\n
$url = $this->params[\"domain\"].'desktop';\n$params = $this->request->get();\nif (!empty($params)) {\n    $url = ['/desktop'];    foreach ($params as $key => $val) {\n        $url[$key] = $val;\n    }\n}\n$this->redirect($url);
\n
    \n
  1. 交给后端同事改了一下这段代码,确保是https跳转,重新发布,bug消失
  2. \n
\n

小结

\n

后端路由代码疏忽,无意中返回了http地址。因为http地址在浏览器中表现正常,能够正常跳转,所以没发现这个bug。

\n

总耗时:断断续续大约2小时

","frontmatter":{"date":"October 12, 2020","title":"Mac桌面端webview打开页面失败排查","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/","previous":{"fields":{"slug":"/Blog/Server-Side GraphQL/"},"frontmatter":{"title":"Server-Side GraphQL"}},"next":{"fields":{"slug":"/Blog/Google XSS game Level 1/"},"frontmatter":{"title":"Google XSS game - Level 1"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Native Module xxx tried to override xxx native module\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/page-data.json" "b/page-data/Blog/Native Module xxx tried to override xxx native module\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/page-data.json" new file mode 100644 index 0000000..5826ad2 --- /dev/null +++ "b/page-data/Blog/Native Module xxx tried to override xxx native module\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/","result":{"data":{"markdownRemark":{"id":"743e7946-0a7f-5e1c-b5fe-f4deea4abfa4","excerpt":"安卓下又报了个错误 Native module SplashScreenModule tired to override SplashScreenModule for module name SplashScreenModule. If this was your…","html":"

安卓下又报了个错误

\n
\n

Native module SplashScreenModule tired to override SplashScreenModule for module name SplashScreenModule. If this was your intention, set canOverrideExistingModule=true

\n
\n

错误原因

\n

这是Project\\android\\app\\src\\main\\java\\com\\project\\MainApplication.java里面多引用了一个同名模块导致,可能是手动添加了一遍后又自动加了一遍,\n删除掉多余的就好了

\n
 protected List<ReactPackage> getPackages() {\n      return Arrays.<ReactPackage>asList(\n          new MainReactPackage(),\n            new SplashScreenReactPackage(),            .\n            .\n            .\n            new PickerPackage(),\n            new SplashScreenReactPackage(),//删除这行就好了            new RNDeviceInfo()\n      );\n    }
","frontmatter":{"date":"March 13, 2018","title":"Native Module xxx tried to override xxx native module错误解决办法","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/","previous":{"fields":{"slug":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/"},"frontmatter":{"title":"RN0.53+react-native-splash-screen3.0.1,Android启动闪退"}},"next":{"fields":{"slug":"/Blog/Android键盘遮挡问题/"},"frontmatter":{"title":"Android键盘遮挡问题"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/PM2\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/page-data.json" "b/page-data/Blog/PM2\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/page-data.json" new file mode 100644 index 0000000..9d4b973 --- /dev/null +++ "b/page-data/Blog/PM2\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\351\227\256\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/PM2遇到的一个小问题/","result":{"data":{"markdownRemark":{"id":"5be4d78e-7d0a-52d1-af56-0df5ba30f087","excerpt":"写在前面 这篇是大概一个半月前部署node项目时遇到的一个小问题,写下来备忘 问题描述 部署完毕,运行报错的时候才发现服务器没有pm2.config.js配置的文件路径 ssh…","html":"

写在前面

\n

这篇是大概一个半月前部署node项目时遇到的一个小问题,写下来备忘

\n

问题描述

\n
    \n
  1. 部署完毕,运行报错的时候才发现服务器没有pm2.config.js配置的文件路径
  2. \n
  3. ssh登陆服务器,准备手动建好文件路径,结果发现登陆账户权限不足...
  4. \n
  5. 迫于无奈,在登陆账户权限范围内新建了文件夹路径,同时改了pm2和nginx配置文件的路径
  6. \n
  7. 重启pm2和nginx,再运行不报错了
  8. \n
  9. 直接访问项目, 502
  10. \n
  11. 输入 pm2 list发现项目重启了500多次,最后还是挂了
  12. \n
  13. 搜了一下,找到了解决方案: pm2 delete xxx, 删了项目服务再重启
  14. \n
  15. 再次访问项目,ok了
  16. \n
\n

原因

\n

pm2的配置文件某些配置项会有缓存,即使重启也没用,最好还是删了进程再重启

\n

Done.

","frontmatter":{"date":"September 25, 2019","title":"PM2遇到的一个小问题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/PM2遇到的一个小问题/","previous":{"fields":{"slug":"/Blog/一个关于babel的愚蠢小错误/"},"frontmatter":{"title":"一个关于babel的愚蠢错误"}},"next":{"fields":{"slug":"/Blog/JSBridge的一点总结/"},"frontmatter":{"title":"JSBridge的一点总结"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/RN Animated API\344\275\277\347\224\250/page-data.json" "b/page-data/Blog/RN Animated API\344\275\277\347\224\250/page-data.json" new file mode 100644 index 0000000..0de005d --- /dev/null +++ "b/page-data/Blog/RN Animated API\344\275\277\347\224\250/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/RN Animated API使用/","result":{"data":{"markdownRemark":{"id":"c76cf011-e5be-5b68-8ee3-0fd86675f13d","excerpt":"RN 也用了小一段时间了,之前都着重实现功能+赶工期,交互体验方面基本无暇顾及。 最近项目周期不算太紧,于是小小试验了一下 Animated 的 API,模拟器上的效果还不错。\n简单记录一下 API 的内容,以后备查:\n---先挖坑,以后再填--- 组件 自带的有Animated…","html":"

RN 也用了小一段时间了,之前都着重实现功能+赶工期,交互体验方面基本无暇顾及。
\n最近项目周期不算太紧,于是小小试验了一下 Animated 的 API,模拟器上的效果还不错。\n简单记录一下 API 的内容,以后备查:\n---先挖坑,以后再填---

\n
    \n
  1. 组件
  2. \n
  3. 自带的有Animated.View, Animated.Image, Animated.Text
    \n一般用上面的基本就足够了,或者基于上面 3 个自行封装新的动画组件
  4. \n
  5. 还可以用createAnimatedComponent()方法创建自定义的动画组件
    \n用过方法包装自己封装的扩展button组件,动画效果没出来,不知道是不是因为自己的button用了其他非Animated组件的原因
  6. \n
  7. API
  8. \n
  9. timing
  10. \n
  11. spring
  12. \n
  13. interpolate
  14. \n
  15. 单个动画实现
  16. \n
  17. 组合动画实现
  18. \n
","frontmatter":{"date":"March 29, 2018","title":"RN Animated API使用","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/RN Animated API使用/","previous":{"fields":{"slug":"/Blog/React-Navigation中去掉header下的阴影/"},"frontmatter":{"title":"React-Navigation中去掉header下的阴影"}},"next":{"fields":{"slug":"/Blog/Android模拟器访问本地web服务的url/"},"frontmatter":{"title":"Android模拟器访问本地web服务的url"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/RN0.53+react-native-splash-screen3.0.1\357\274\214Android\345\220\257\345\212\250\351\227\252\351\200\200/page-data.json" "b/page-data/Blog/RN0.53+react-native-splash-screen3.0.1\357\274\214Android\345\220\257\345\212\250\351\227\252\351\200\200/page-data.json" new file mode 100644 index 0000000..d6e667e --- /dev/null +++ "b/page-data/Blog/RN0.53+react-native-splash-screen3.0.1\357\274\214Android\345\220\257\345\212\250\351\227\252\351\200\200/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/","result":{"data":{"markdownRemark":{"id":"ce2b210d-bf2d-54d6-9c14-1820e4be885d","excerpt":"splash-screen 这个 RN 插件挺好用的,升级之后启动 Android 版 APP 就闪退\n查了 issue 之后发现是文档没更新,在按照说明操作之后,还需要做额外调整: 插件 github 地址 MainActivity.java…","html":"

splash-screen 这个 RN 插件挺好用的,升级之后启动 Android 版 APP 就闪退\n查了 issue 之后发现是文档没更新,在按照说明操作之后,还需要做额外调整:

\n

插件 github 地址

\n
    \n
  1. MainActivity.java 修改为
  2. \n
\n
SplashScreen.show(this);//原代码\n\nSplashScreen.show(this, true);//修改成这样
\n
    \n
  1. 然后修改插件源代码\n在node_modules> react-native-splash-screen> android> src> SplashScreen.java
  2. \n
\n
//原代码,删掉\nmSplashDialog = new Dialog(activity, fullScreen ? R.style.SplashScreen_Fullscreen : R.style.SplashScreen_SplashTheme);\n//修改为下面的mSplashDialog = new Dialog(activity, R.layout.launch_screen);
\n

之后就可以正常运行了

","frontmatter":{"date":"March 13, 2018","title":"RN0.53+react-native-splash-screen3.0.1,Android启动闪退","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/","previous":{"fields":{"slug":"/Blog/实现自定义tabbar component/"},"frontmatter":{"title":"实现自定义tabbar component"}},"next":{"fields":{"slug":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/"},"frontmatter":{"title":"Native Module xxx tried to override xxx native module错误解决办法"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/RN0.53\346\211\276\344\270\215\345\210\260remote debugger\350\247\243\345\206\263\346\226\271\346\241\210/page-data.json" "b/page-data/Blog/RN0.53\346\211\276\344\270\215\345\210\260remote debugger\350\247\243\345\206\263\346\226\271\346\241\210/page-data.json" new file mode 100644 index 0000000..357d3e8 --- /dev/null +++ "b/page-data/Blog/RN0.53\346\211\276\344\270\215\345\210\260remote debugger\350\247\243\345\206\263\346\226\271\346\241\210/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/RN0.53找不到remote debugger解决方案/","result":{"data":{"markdownRemark":{"id":"746c6106-0b82-5e9f-960d-88e1a9763b83","excerpt":"更新:\n换了 0.53 版本的 RN,目前 android 遇到的,而且只有模拟器,真机调试都不会有以下问题 现象: 直接打开调试会找 10.0.2.2:8081/debugger-ui/,但是这个地址并不能连接成功 解决方法: 手动修改地址为http://localhost…","html":"
\n

更新:\n换了 0.53 版本的 RN,目前 android 遇到的,而且只有模拟器,真机调试都不会有以下问题

\n
\n
现象:
\n

直接打开调试会找 10.0.2.2:8081/debugger-ui/,但是这个地址并不能连接成功

\n
解决方法:
\n

手动修改地址为http://localhost:8081/debugger-ui/ ,然后重新启动 app,就可以成功开始 debug 了

\n
\n

话说 RN 这个版本怎么这么坑啊...

","frontmatter":{"date":"March 08, 2018","title":"RN0.53找不到remote debugger解决方案","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/RN0.53找不到remote debugger解决方案/","previous":{"fields":{"slug":"/Blog/react-native-init以指定版本创建project/"},"frontmatter":{"title":"react-native-init以指定版本创建project"}},"next":{"fields":{"slug":"/Blog/antd-mobile引用错误解决办法/"},"frontmatter":{"title":"antd-mobile引用错误解决办法"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/React-Navigation\344\270\255tabNavigator\345\216\273\346\216\211\346\214\207\347\244\272\347\272\277/page-data.json" "b/page-data/Blog/React-Navigation\344\270\255tabNavigator\345\216\273\346\216\211\346\214\207\347\244\272\347\272\277/page-data.json" new file mode 100644 index 0000000..f882ce6 --- /dev/null +++ "b/page-data/Blog/React-Navigation\344\270\255tabNavigator\345\216\273\346\216\211\346\214\207\347\244\272\347\272\277/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/React-Navigation中tabNavigator去掉指示线/","result":{"data":{"markdownRemark":{"id":"c46bf79c-2d86-54de-9e3a-0c891c301e7f","excerpt":"bottom 模式的 tabBar 也出现了 indicator(就是选中某个 tabbar icon 的时候,出现的那根线,一般是出现在 top 模式下的)\n感觉很烦人,想去掉,开始自然想到把这根线调为透明 发现不管用。 查了一下 issue,发现了下面这个解决方案: 搞定!","html":"

bottom 模式的 tabBar 也出现了 indicator(就是选中某个 tabbar icon 的时候,出现的那根线,一般是出现在 top 模式下的)\n感觉很烦人,想去掉,开始自然想到把这根线调为透明

\n
tabBarOption: {\n  indicatorStyle: {\n    opacity: 0,    }\n}
\n

发现不管用。

\n

查了一下 issue,发现了下面这个解决方案:

\n
export const AppNavigator = TabNavigator(\n {\n    screenA:  screen1\n  },\n  {\n    screenB: screen2\n  },\n  {\n     tabBarOptions: {        renderIndicator: () => null//加上这句就不会渲染indicator了     }  }\n}
\n

搞定!

","frontmatter":{"date":"March 12, 2018","title":"React-Navigation中tabNavigator去掉指示线","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/React-Navigation中tabNavigator去掉指示线/","previous":{"fields":{"slug":"/Blog/antd-mobile引用错误解决办法/"},"frontmatter":{"title":"antd-mobile引用错误解决办法"}},"next":{"fields":{"slug":"/Blog/实现自定义tabbar component/"},"frontmatter":{"title":"实现自定义tabbar component"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/React-Navigation\344\270\255\345\216\273\346\216\211header\344\270\213\347\232\204\351\230\264\345\275\261/page-data.json" "b/page-data/Blog/React-Navigation\344\270\255\345\216\273\346\216\211header\344\270\213\347\232\204\351\230\264\345\275\261/page-data.json" new file mode 100644 index 0000000..77aa0af --- /dev/null +++ "b/page-data/Blog/React-Navigation\344\270\255\345\216\273\346\216\211header\344\270\213\347\232\204\351\230\264\345\275\261/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/React-Navigation中去掉header下的阴影/","result":{"data":{"markdownRemark":{"id":"d540c216-50da-5bcc-a8a7-d6f73fee29b1","excerpt":"StackNavigator 在navigationOptions里修改headerStyle TabNavigator 在tabBarOptions修改style 代码 最好在navigator定义时设置navigationOptions…","html":"
    \n
  1. StackNavigator
    \n在navigationOptions里修改headerStyle
  2. \n
  3. TabNavigator
    \n在tabBarOptions修改style
  4. \n
\n

代码

\n
//Android\nelevation:0\n//iOS\nshadowOpacity:0
\n

最好在navigator定义时设置navigationOptions,否则在页面嵌套的时候容易冲突,可能设置不起作用

","frontmatter":{"date":"March 18, 2018","title":"React-Navigation中去掉header下的阴影","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/React-Navigation中去掉header下的阴影/","previous":{"fields":{"slug":"/Blog/Android键盘遮挡问题/"},"frontmatter":{"title":"Android键盘遮挡问题"}},"next":{"fields":{"slug":"/Blog/RN Animated API使用/"},"frontmatter":{"title":"RN Animated API使用"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Sequelize\345\222\214MySql\346\227\266\351\227\264\346\240\274\345\274\217\345\260\217\350\256\260/page-data.json" "b/page-data/Blog/Sequelize\345\222\214MySql\346\227\266\351\227\264\346\240\274\345\274\217\345\260\217\350\256\260/page-data.json" new file mode 100644 index 0000000..489b5f3 --- /dev/null +++ "b/page-data/Blog/Sequelize\345\222\214MySql\346\227\266\351\227\264\346\240\274\345\274\217\345\260\217\350\256\260/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Sequelize和MySql时间格式小记/","result":{"data":{"markdownRemark":{"id":"e066ab84-1aa5-5179-ad5a-e586738cdb89","excerpt":"写在前面 Sequelize内部时间格式","html":"

写在前面

\n

Sequelize内部时间格式

","frontmatter":{"date":"September 17, 2019","title":"Sequelize和MySql时间格式小记","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Sequelize和MySql时间格式小记/","previous":{"fields":{"slug":"/Blog/移动端网页调试技巧/"},"frontmatter":{"title":"移动端网页调试技巧"}},"next":{"fields":{"slug":"/Blog/一个关于babel的愚蠢小错误/"},"frontmatter":{"title":"一个关于babel的愚蠢错误"}}}}} \ No newline at end of file diff --git a/page-data/Blog/Server-Side GraphQL/page-data.json b/page-data/Blog/Server-Side GraphQL/page-data.json new file mode 100644 index 0000000..f21532e --- /dev/null +++ b/page-data/Blog/Server-Side GraphQL/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Server-Side GraphQL/","result":{"data":{"markdownRemark":{"id":"9f40db4b-0cfd-5ade-a564-d65471bbde5c","excerpt":"","html":"","frontmatter":{"date":"June 25, 2020","title":"Server-Side GraphQL","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Server-Side GraphQL/","previous":{"fields":{"slug":"/Blog/手写bind/"},"frontmatter":{"title":"手写bind"}},"next":{"fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"frontmatter":{"title":"Mac桌面端webview打开页面失败排查"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/StackNavigator Header\345\242\236\345\212\240\342\200\234\350\277\224\345\233\236\342\200\235\346\214\211\351\222\256/page-data.json" "b/page-data/Blog/StackNavigator Header\345\242\236\345\212\240\342\200\234\350\277\224\345\233\236\342\200\235\346\214\211\351\222\256/page-data.json" new file mode 100644 index 0000000..d5ae442 --- /dev/null +++ "b/page-data/Blog/StackNavigator Header\345\242\236\345\212\240\342\200\234\350\277\224\345\233\236\342\200\235\346\214\211\351\222\256/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/StackNavigator Header增加“返回”按钮/","result":{"data":{"markdownRemark":{"id":"02af43cc-b90b-5167-9a31-fa325b4d0cdc","excerpt":"StackNavigator 自带了 navigationOptions 属性,但必须以静态对象申明 实现有 3 个要点: navigationOptions 对象里,创建{param}常量,然后 headerLeft 或者 headerRight…","html":"

StackNavigator 自带了 navigationOptions 属性,但必须以静态对象申明

\n

实现有 3 个要点:

\n
    \n
  1. navigationOptions 对象里,创建{param}常量,然后 headerLeft 或者 headerRight 里配置好闭包函数
    \n这样做是因为 navigation 是类的实例成员,无法通过类成员访问,所以需要用闭包绕开这一限制
  2. \n
  3. 在 DidMount 事件中配置 params 的闭包函数对象
  4. \n
  5. 页面跳转的执行函数
  6. \n
\n
static navigationOptions = ({navigation}) => ({\n      const {params} = navigation.state;\n      title: 'PlayGround',\n      headerRight: <View />,//之前提到过,占位的用的空view\n      headerLeft:        <Button onPress={params.handleNavigation && params.handleNavigation()} />,      headerStyle: {\n        backgroundColor: 'white',\n      },\n      headerTitleStyle: {\n        textAlign: \"center\",\n        alignSelf: \"center\",\n        fontSize: 16,\n      }\n  });\n  //页面跳转执行函数  toOtherScreen(){    this.props.navigation.navigate('pageDest');  }\n  componentDidMount(){\n    this.navigation.setParams(\n      handleNavigation: ()=>{this.toOtherScreen()}\n    )\n  }
","frontmatter":{"date":"September 26, 2017","title":"StackNavigator Header增加“返回”按钮","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/StackNavigator Header增加“返回”按钮/","previous":{"fields":{"slug":"/Blog/header title在Android下不居中问题的解决技巧/"},"frontmatter":{"title":"header title在Android下不居中问题的解决技巧"}},"next":{"fields":{"slug":"/Blog/react-native-init以指定版本创建project/"},"frontmatter":{"title":"react-native-init以指定版本创建project"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Svelte\345\210\235\346\216\242/page-data.json" "b/page-data/Blog/Svelte\345\210\235\346\216\242/page-data.json" new file mode 100644 index 0000000..d9123e9 --- /dev/null +++ "b/page-data/Blog/Svelte\345\210\235\346\216\242/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Svelte初探/","result":{"data":{"markdownRemark":{"id":"e1f6e456-c9f4-56e8-b6c7-5cb7cf415407","excerpt":"","html":"","frontmatter":{"date":"May 26, 2020","title":"Svelte初探","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Svelte初探/","previous":{"fields":{"slug":"/Blog/background-image踩坑/"},"frontmatter":{"title":"background-image踩坑"}},"next":{"fields":{"slug":"/Blog/手写new/"},"frontmatter":{"title":"手写new"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/TCP\344\270\211\346\254\241\346\217\241\346\211\213/page-data.json" "b/page-data/Blog/TCP\344\270\211\346\254\241\346\217\241\346\211\213/page-data.json" new file mode 100644 index 0000000..5f44e41 --- /dev/null +++ "b/page-data/Blog/TCP\344\270\211\346\254\241\346\217\241\346\211\213/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/TCP三次握手/","result":{"data":{"markdownRemark":{"id":"7b235de6-6b7a-5fab-a80c-26afde87bdb6","excerpt":"","html":"","frontmatter":{"date":"February 09, 2020","title":"TCP三次握手","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/TCP三次握手/","previous":{"fields":{"slug":"/Blog/2019总结与2020年计划/"},"frontmatter":{"title":"2019总结与2020年计划"}},"next":{"fields":{"slug":"/Blog/HTTPS初步/"},"frontmatter":{"title":"HTTPS初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/The Virtual DOM\351\230\205\350\257\273\347\254\224\350\256\260/page-data.json" "b/page-data/Blog/The Virtual DOM\351\230\205\350\257\273\347\254\224\350\256\260/page-data.json" new file mode 100644 index 0000000..fcfd85e --- /dev/null +++ "b/page-data/Blog/The Virtual DOM\351\230\205\350\257\273\347\254\224\350\256\260/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/The Virtual DOM阅读笔记/","result":{"data":{"markdownRemark":{"id":"49d45663-8fe9-5dc1-8ba3-2f4b668d4f0a","excerpt":"Dan Abramov 在 2018-11-24 发了一系列推文是说明 React 的本质。他提到 Virtual DOM 这个词该退休了,这个词并没有说清楚 React 到底是什么。React 本质是“UI 类型”,和 JS…","html":"

Dan Abramov 在 2018-11-24 发了一系列推文是说明 React 的本质。他提到 Virtual DOM 这个词该退休了,这个词并没有说清楚 React 到底是什么。React 本质是“UI 类型”,和 JS 中其他类型一样可以保存、修改和操作,可表现性才是它的本质,而不是通过 diff 来减少 DOM 更改。

\n

=====以下的理解全部错误=========

\n

React 出现的原因

\n

因为前端页面大量的 DOM 操作,其中很大一部分是因为不必要的 DOM 更新。比如只是改了 10 个对象中的 1 个,在之前的框架下没变化的 9 个也不得不一起跟随刷新,显然这个 9 个操作是不必要的。有点像当年的 AJAX 的出现是为了解决网页部件的不必要更新一样,React 也是为了只更新变化的部分。
\n减少了更新的部分,自然也就减少了更新 DOM 的操作,于是得到了性能的提高。

\n

实现的手段 Virtual DOM

\n

React 实现了一个 Virtual DOM 的对象,可以认为是真实 DOM 的一个复制品,区别在于 virtual DOM 并不展现到屏幕上。\n因为不必显示,virtual DOM 的更改速度快得多。通过更新 virtual DOM,再将 virtual DOM 的变化映射到真实 DOM,达到修改的目的。\n感觉设计理念有那么一点像当年的微软做过的 DataSet,数据在内存中修改之后一次性提交,减少频繁的数据库操作,提高响应速度。

\n

更新 DOM 的流程

\n

更新的时候先建立一个 T0 时刻的 pre-virtual DOM,然后开始更新,得到 T1 时刻 virtual DOM;\n更新完毕比较 T0 和 T1 时刻的 virtual DOM 变化,这一步叫做 diffing\n只将变化的部分提交到 DOM;\nDOM 的变化引起显示的改变,更新完毕;

\n

原文链接

","frontmatter":{"date":"August 22, 2017","title":"The Virtual DOM阅读笔记","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/The Virtual DOM阅读笔记/","previous":null,"next":{"fields":{"slug":"/Blog/搭建RN开发环境/"},"frontmatter":{"title":"搭建RN开发环境"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Vue\344\270\255v-if\345\222\214v-show\351\201\207\345\210\260\347\232\204\345\260\217\351\227\256\351\242\230/page-data.json" "b/page-data/Blog/Vue\344\270\255v-if\345\222\214v-show\351\201\207\345\210\260\347\232\204\345\260\217\351\227\256\351\242\230/page-data.json" new file mode 100644 index 0000000..08d9666 --- /dev/null +++ "b/page-data/Blog/Vue\344\270\255v-if\345\222\214v-show\351\201\207\345\210\260\347\232\204\345\260\217\351\227\256\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Vue中v-if和v-show遇到的小问题/","result":{"data":{"markdownRemark":{"id":"e3a61e55-c1c0-5a96-b0f9-8957af55a3b6","excerpt":"同一个页面有多个相同组件,根据配置分别控制显隐,使用v-if时始终都只有第一个组件能取到props,第二个没有被初始化","html":"

同一个页面有多个相同组件,根据配置分别控制显隐,使用v-if时始终都只有第一个组件能取到props,第二个没有被初始化

","frontmatter":{"date":"November 02, 2019","title":"Vue中v-if和v-show遇到的小问题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Vue中v-if和v-show遇到的小问题/","previous":{"fields":{"slug":"/Blog/ES2015-ES2020/"},"frontmatter":{"title":"ES2015-ES2020"}},"next":{"fields":{"slug":"/Blog/使用eslint+prettier+husky规范项目代码风格/"},"frontmatter":{"title":"使用eslint+prettier+husky规范项目代码风格"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Vue\344\275\277\347\224\250provide-inject\347\211\271\346\200\247\346\263\250\345\205\245\347\232\256\350\202\244\351\205\215\347\275\256/page-data.json" "b/page-data/Blog/Vue\344\275\277\347\224\250provide-inject\347\211\271\346\200\247\346\263\250\345\205\245\347\232\256\350\202\244\351\205\215\347\275\256/page-data.json" new file mode 100644 index 0000000..5c2e597 --- /dev/null +++ "b/page-data/Blog/Vue\344\275\277\347\224\250provide-inject\347\211\271\346\200\247\346\263\250\345\205\245\347\232\256\350\202\244\351\205\215\347\275\256/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Vue使用provide-inject特性注入皮肤配置/","result":{"data":{"markdownRemark":{"id":"fd2d5b3f-7c43-5a03-a5f2-71fb5e9d1309","excerpt":"背景 H5页面主题皮肤切换,有2条路线,一是使用css实现,一是使用js实现。 其实需求很简单,希望组件本身可以和皮肤主题解耦,这样至少有…","html":"

背景

\n

H5页面主题皮肤切换,有2条路线,一是使用css实现,一是使用js实现。

\n

其实需求很简单,希望组件本身可以和皮肤主题解耦,这样至少有2个好处:

\n
    \n
  • 更改的时候只用在皮肤设置文件更改一次
  • \n
  • 组件本身与主题样式无关,只在需要的时候把组件和主题组合使用,有足够的灵活性
  • \n
\n

现有方案的问题

\n

现有方案使用的less,在每个组件中引入less variables,然后再按照css规则渲染主题。

\n

其实已经基本够用了,只是必须每个组件分别编写对应主题下的规则,引入了主题和组件的强耦合,不是特别好的设计,也无法做到实时更改主题。

\n

本来可以用sass的mixin,但同事都比较排斥sass,只好放弃。

\n

于是考虑尝试js的方案。

\n

JS的方案

\n

搜索的过程中看到了vuetify,它的主题实现就用的provide模式,看了文档之后发现这个就是vue版的React context,来了兴趣就试验了一下。

\n

废话完毕,先看看基本使用

\n

Provide-Eject基本使用

\n

查下vue的官方文档就明白了,2句话:

\n
    \n
  1. 父组件配置provide,注入属性
  2. \n
  3. 子组件配置inject,使用属性
  4. \n
\n

当然vue本身还支持provide-inject之间互传信息的,对于主题来说,内部注入主题已经足够了,所以没有再继续深究这个特性。

\n

版本一:基本使用

\n

版本二:结合mixin

\n

版本三:实时换主题

","frontmatter":{"date":"January 03, 2020","title":"Vue使用provide-inject特性注入皮肤配置","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Vue使用provide-inject特性注入皮肤配置/","previous":{"fields":{"slug":"/Blog/iTerm2自动填充密码访问ssh/"},"frontmatter":{"title":"iTerm2自动填充密码访问ssh"}},"next":{"fields":{"slug":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/"},"frontmatter":{"title":"配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Vue\345\256\236\344\276\213\346\226\271\346\263\225\347\232\204this\346\214\207\345\220\221/page-data.json" "b/page-data/Blog/Vue\345\256\236\344\276\213\346\226\271\346\263\225\347\232\204this\346\214\207\345\220\221/page-data.json" new file mode 100644 index 0000000..1c384b0 --- /dev/null +++ "b/page-data/Blog/Vue\345\256\236\344\276\213\346\226\271\346\263\225\347\232\204this\346\214\207\345\220\221/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Vue实例方法的this指向/","result":{"data":{"markdownRemark":{"id":"0bbe4a7f-d87d-592c-a034-38926ae81a87","excerpt":"背景 做Code Review的时候遇到一段Vue的SFC代码,需要在mounted生命周期里绑定document的scroll事件 下面这段代码的问题有哪些? 另一个例子 再看一个其他例子 答案 第一个console输出的是Vue实例 第二个console…","html":"

背景

\n

做Code Review的时候遇到一段Vue的SFC代码,需要在mounted生命周期里绑定document的scroll事件

\n

下面这段代码的问题有哪些?

\n
export default {\n    methods:{\n        testThis(){\n            console.log(this);\n        }\n    },\n    mounted(){\n        const vm = this;\n        window.addEventListener.add('scroll',vm.testThis);\n    }\n}\n// 窗口滚动后输出是什么?
\n

另一个例子

\n

再看一个其他例子

\n
const obj = {\n    a(){\n        console.log(this);\n    },\n    b(){\n        window.addEventListener('scroll',this.a);\n    }\n}\n\n// 全局作用域下执行\nobj.b()\n// 窗口滚动后输出是什么?
\n

答案

\n
    \n
  1. 第一个console输出的是Vue实例
  2. \n
  3. 第二个console输出的是window
  4. \n
\n

原因

\n
    \n
  • \n

    第二个console的才是正常的情况

    \n

    根据MDN的文档,执行event handler的时候,如果没有指定this对象,那么this指向event listener的对象,即指向window。

    \n
  • \n
  • \n

    在第一个console里,Vue肯定帮我们做了些事情

    \n

    经过查看源码,发现Vue在初始化方法initMethods的时候,为每一个方法都做了this绑定。

    \n
    function(vm, methods){\n    ...\n    for(var key in methods){\n        ...\n        vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key],vm);\n    }\n}
    \n
  • \n
\n

第一段代码的问题

\n

最后再说会Code Review的问题,有2个错误:

\n
    \n
  • 用了this被shadowing的方法,来处理this指向问题,属于概念不清
  • \n
  • 在不清楚this指向问题的时候,没有用bind来绑定this
  • \n
\n

结论

\n
    \n
  • Vue实例方法中,只要不存在this shadowing的情况,直接传this.[method]就可以了
  • \n
  • 不清楚this指向,this.[method]内部又使用了this.xxx需要确认this指向关系的,可以用bind方法绑定后再传入
  • \n
\n

以上~

","frontmatter":{"date":"June 09, 2020","title":"Vue实例方法的this指向","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Vue实例方法的this指向/","previous":{"fields":{"slug":"/Blog/手写new/"},"frontmatter":{"title":"手写new"}},"next":{"fields":{"slug":"/Blog/Client-Side GraphQL/"},"frontmatter":{"title":"Client-Side GraphQL"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/Websocket\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/Websocket\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..204e56c --- /dev/null +++ "b/page-data/Blog/Websocket\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/Websocket初步/","result":{"data":{"markdownRemark":{"id":"7cf95374-586d-5c2f-98c6-3021aea78171","excerpt":"","html":"","frontmatter":{"date":"May 03, 2020","title":"Websocket初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/Websocket初步/","previous":{"fields":{"slug":"/Blog/Intro to Functional Programming/"},"frontmatter":{"title":"Intro to Functional Programming"}},"next":{"fields":{"slug":"/Blog/Intro to Docker/"},"frontmatter":{"title":"Intro to Docker"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/XMLHttpRequest\345\233\236\351\241\276/page-data.json" "b/page-data/Blog/XMLHttpRequest\345\233\236\351\241\276/page-data.json" new file mode 100644 index 0000000..a675cf0 --- /dev/null +++ "b/page-data/Blog/XMLHttpRequest\345\233\236\351\241\276/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/XMLHttpRequest回顾/","result":{"data":{"markdownRemark":{"id":"677ea431-8aa1-5b18-8cae-e2420f5022df","excerpt":"","html":"","frontmatter":{"date":"February 21, 2020","title":"XMLHttpRequest回顾","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/XMLHttpRequest回顾/","previous":{"fields":{"slug":"/Blog/HTTPS初步/"},"frontmatter":{"title":"HTTPS初步"}},"next":{"fields":{"slug":"/Blog/HTTP缓存小结/"},"frontmatter":{"title":"HTTP缓存小结"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/antd-mobile\345\274\225\347\224\250\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/page-data.json" "b/page-data/Blog/antd-mobile\345\274\225\347\224\250\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/page-data.json" new file mode 100644 index 0000000..57bc9c9 --- /dev/null +++ "b/page-data/Blog/antd-mobile\345\274\225\347\224\250\351\224\231\350\257\257\350\247\243\345\206\263\345\212\236\346\263\225/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/antd-mobile引用错误解决办法/","result":{"data":{"markdownRemark":{"id":"3c88f723-4d0b-55db-afd2-3f229841b66f","excerpt":"问题: 创建 APP 代码完整框架的时候,因为升级到了 2.x 版本的antd-mobile,报了下面错误 但是运行时出现依赖 react-dom 的错误 \"Unable to resolve module react-dom from /Users/xiesubin…","html":"

问题:

\n

创建 APP 代码完整框架的时候,因为升级到了 2.x 版本的antd-mobile,报了下面错误

\n
\n

但是运行时出现依赖 react-dom 的错误

\n
\n

\"Unable to resolve module react-dom from /Users/xiesubin/Workspace/Project/seller-pad-rn/node_modules/rc-animate/lib/AnimateChild.js

\n
\n
\n

原因:

\n

1.创建项目使用的react-native init,官方说明是

\n
\n

有人反映通过 react-native init 创建的项目在使用时可能会报 Unable to resolve module react-dom 的错误 ,\n此时不妨安装 babel-plugin-module-resolver 试试~

\n
\n

2.issue 里有人分析是因为

\n
\n

查看babel-preset-expo 源码,发现比 babel-preset-react-native 多个插件 babel-plugin-module-resolver

\n
\n

所以没有用babel-preset-expo创建项目的话,需要加上babel-plugin-importbabel-plugin-module-resolver的引用

\n

解决办法:

\n
    \n
  1. npm i antd-mobile
  2. \n
  3. npm i -D babel-plugin-import babel-plugin-module-resolver
  4. \n
  5. update .babelrc:
  6. \n
\n
  {\n    \"presets\": [\"react-native\"],\n    \"plugins\": [[\"import\", { \"libraryName\": \"antd-mobile\" }]],\n    \"env\": {\n      \"development\": {\n        \"plugins\": [\"transform-react-jsx-source\"]\n      }\n    }\n  }
","frontmatter":{"date":"March 09, 2018","title":"antd-mobile引用错误解决办法","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/antd-mobile引用错误解决办法/","previous":{"fields":{"slug":"/Blog/RN0.53找不到remote debugger解决方案/"},"frontmatter":{"title":"RN0.53找不到remote debugger解决方案"}},"next":{"fields":{"slug":"/Blog/React-Navigation中tabNavigator去掉指示线/"},"frontmatter":{"title":"React-Navigation中tabNavigator去掉指示线"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/array.indexof\345\222\214array.includes/page-data.json" "b/page-data/Blog/array.indexof\345\222\214array.includes/page-data.json" new file mode 100644 index 0000000..e61a6f1 --- /dev/null +++ "b/page-data/Blog/array.indexof\345\222\214array.includes/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/array.indexof和array.includes/","result":{"data":{"markdownRemark":{"id":"f34e0db1-4140-59a5-9355-c4721c9fc774","excerpt":"date: 2018-10-03 一点微小差别 为什么 结论 参考文献 一点微小差别 indexOf 和 includes 都可以用来判断数组是否包含某个元素,二者到底有什么区别呢?看一个例子: 为什么 二者内部使用的算法不同: indexof…","html":"\n

一点微小差别

\n

indexOf 和 includes 都可以用来判断数组是否包含某个元素,二者到底有什么区别呢?看一个例子:

\n
let a = [1,2,3,null,undefined,NaN];\n\nif(a.indexOf(NaN)!==-1){\n  console.log('using Array.indexOf: Found NaN in Array a!');\n}else{\n  console.log('using Array.indexOf: No NaN found in Array a~');\n}\n\nif(a.includes(NaN)){\n  console.log('using Array.includes: Found NaN in Array a!');\n}else{\n  console.log('using Array.includes: No NaN found in Array a~');\n}\n\n//输出:\n>'using Array.indexOf: No NaN found in Array a~'\n>'using Array.includes: Found NaN in Array a!'
\n

为什么

\n

二者内部使用的算法不同:

\n
    \n
  • indexof 内部使用全等操作符,即===进行比较;
  • \n
  • includes 内部使用的算法是SameValueZero
  • \n
\n

全等操作符进行NaN===NaN比较时,必然返回false,所以indexOf无法判断数组内是否含有 NaN。

\n

SameValueZero规则 2.1解释了原因:

\n
    \n
  1. x,y类型不同,返回false
  2. \n
  3. \n

    x,y同为number类型,那么

    \n
      \n
    1. 同为NaN时,返回true
    2. \n
    3. 同为 0 时(不管 0 之前的符号),返回true
    4. \n
    5. 数值相等时,返回true
    6. \n
    7. 其他情况,返回false
    8. \n
    \n
  4. \n
  5. x,y同为其他类型,仅在值相同时返回true
  6. \n
\n

结论

\n

其实indexOfincludes二者的搜索机制差不多,只有比较算法不同。实际使用我倾向于后者,一方面因为前者这个隐含的坑,另一方面后者直接返回true/false,更加直观。

\n

参考文献

\n","frontmatter":{"date":"October 03, 2018","title":"array.indexOf和array.includes","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/array.indexof和array.includes/","previous":{"fields":{"slug":"/Blog/IEEE-754标准与JS中的number类型/"},"frontmatter":{"title":"IEEE-754标准与JS中的number类型"}},"next":{"fields":{"slug":"/Blog/几个JS高阶函数的简单底层实现/"},"frontmatter":{"title":"几个JS高阶函数的简单底层实现"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/background-image\350\270\251\345\235\221/page-data.json" "b/page-data/Blog/background-image\350\270\251\345\235\221/page-data.json" new file mode 100644 index 0000000..acf1a42 --- /dev/null +++ "b/page-data/Blog/background-image\350\270\251\345\235\221/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/background-image踩坑/","result":{"data":{"markdownRemark":{"id":"90c3fcde-bc1e-5ab9-a666-74fe764e33f0","excerpt":"现象 用了一个雪碧图,图片的真实宽高是 112px*22px,对应了 4 种情况下的 4 个图标 A,B,C,D, 每个分别是 28pt*22pt,折算到两倍屏就是 14pt*11pt 的图标尺寸。 @1x,@2x,@3x 整数倍 dpr…","html":"

现象

\n

用了一个雪碧图,图片的真实宽高是 112px*22px,对应了 4 种情况下的 4 个图标 A,B,C,D, 每个分别是 28pt*22pt,折算到两倍屏就是 14pt*11pt 的图标尺寸。

\n
.icon {\n    width: 14px;\n    height: 11px;\n    background-image: url('path/to/icon');\n    background-size: cover;\n    background-repeat: no-repeat;\n    background-position: -42px -0px;//x为14的负整数倍,-42,-28,-14,0\n}
\n

@1x,@2x,@3x 整数倍 dpr 的屏幕显示都正常。但是某些 Android 手机的 dpr 不是整数,比如小米 9 是 2.75,发现显示的图标变形了,漏出其他部分的边缘,非常难看。

\n

解决: 修改 background-size 属性值

\n

把 background-size 设置为了图片的真实尺寸,按@2x 计算是 56pt*11pt,之后显示一切正常了。

\n

总结

\n

使用pt指定图片显示尺寸,position使用px

","frontmatter":{"date":"May 25, 2020","title":"background-image踩坑","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/background-image踩坑/","previous":{"fields":{"slug":"/Blog/scroll事件踩坑记录/"},"frontmatter":{"title":"scroll事件踩坑记录"}},"next":{"fields":{"slug":"/Blog/Svelte初探/"},"frontmatter":{"title":"Svelte初探"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/echarts\344\275\277\347\224\250\345\260\217\350\256\260/page-data.json" "b/page-data/Blog/echarts\344\275\277\347\224\250\345\260\217\350\256\260/page-data.json" new file mode 100644 index 0000000..1221636 --- /dev/null +++ "b/page-data/Blog/echarts\344\275\277\347\224\250\345\260\217\350\256\260/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/echarts使用小记/","result":{"data":{"markdownRemark":{"id":"6a857de3-8465-5902-8fb2-990446eccc51","excerpt":"","html":"","frontmatter":{"date":"November 21, 2019","title":"echarts使用小记","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/echarts使用小记/","previous":{"fields":{"slug":"/Blog/使用eslint+prettier+husky规范项目代码风格/"},"frontmatter":{"title":"使用eslint+prettier+husky规范项目代码风格"}},"next":{"fields":{"slug":"/Blog/echarts封装Vue组件/"},"frontmatter":{"title":"echarts封装Vue组件"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/echarts\345\260\201\350\243\205Vue\347\273\204\344\273\266/page-data.json" "b/page-data/Blog/echarts\345\260\201\350\243\205Vue\347\273\204\344\273\266/page-data.json" new file mode 100644 index 0000000..7d8ac59 --- /dev/null +++ "b/page-data/Blog/echarts\345\260\201\350\243\205Vue\347\273\204\344\273\266/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/echarts封装Vue组件/","result":{"data":{"markdownRemark":{"id":"3e857be3-26b5-5e58-9f9f-c1e24b745e6d","excerpt":"","html":"","frontmatter":{"date":"November 27, 2019","title":"echarts封装Vue组件","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/echarts封装Vue组件/","previous":{"fields":{"slug":"/Blog/echarts使用小记/"},"frontmatter":{"title":"echarts使用小记"}},"next":{"fields":{"slug":"/Blog/iTerm2自动填充密码访问ssh/"},"frontmatter":{"title":"iTerm2自动填充密码访问ssh"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/header title\345\234\250Android\344\270\213\344\270\215\345\261\205\344\270\255\351\227\256\351\242\230\347\232\204\350\247\243\345\206\263\346\212\200\345\267\247/page-data.json" "b/page-data/Blog/header title\345\234\250Android\344\270\213\344\270\215\345\261\205\344\270\255\351\227\256\351\242\230\347\232\204\350\247\243\345\206\263\346\212\200\345\267\247/page-data.json" new file mode 100644 index 0000000..bfe932c --- /dev/null +++ "b/page-data/Blog/header title\345\234\250Android\344\270\213\344\270\215\345\261\205\344\270\255\351\227\256\351\242\230\347\232\204\350\247\243\345\206\263\346\212\200\345\267\247/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/header title在Android下不居中问题的解决技巧/","result":{"data":{"markdownRemark":{"id":"71c8f3ae-0ce7-5539-ac52-d167b9625a0d","excerpt":"页面用了 stackNavigator,header left 加了一个 button,header titleStyle 也设置了居中 iOS 下没有问题,但是在 Android 下发现 title 向右偏移 系统版本 RN 0.47.2 NODE 8.4 NPM 4.6.…","html":"

页面用了 stackNavigator,header left 加了一个 button,header titleStyle 也设置了居中

\n

iOS 下没有问题,但是在 Android 下发现 title 向右偏移

\n

系统版本

\n
    \n
  • RN 0.47.2
  • \n
  • NODE 8.4
  • \n
  • NPM 4.6.2
  • \n
\n

解决办法

\n

header right 增加一个空的 view 占位,之后就可以保证 title 在 Android 下居中了

","frontmatter":{"date":"September 22, 2017","title":"header title在Android下不居中问题的解决技巧","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/header title在Android下不居中问题的解决技巧/","previous":{"fields":{"slug":"/Blog/搭建RN开发环境/"},"frontmatter":{"title":"搭建RN开发环境"}},"next":{"fields":{"slug":"/Blog/StackNavigator Header增加“返回”按钮/"},"frontmatter":{"title":"StackNavigator Header增加“返回”按钮"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/iTerm2\350\207\252\345\212\250\345\241\253\345\205\205\345\257\206\347\240\201\350\256\277\351\227\256ssh/page-data.json" "b/page-data/Blog/iTerm2\350\207\252\345\212\250\345\241\253\345\205\205\345\257\206\347\240\201\350\256\277\351\227\256ssh/page-data.json" new file mode 100644 index 0000000..f30b822 --- /dev/null +++ "b/page-data/Blog/iTerm2\350\207\252\345\212\250\345\241\253\345\205\205\345\257\206\347\240\201\350\256\277\351\227\256ssh/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/iTerm2自动填充密码访问ssh/","result":{"data":{"markdownRemark":{"id":"8921904a-72d4-5e7e-9542-c5ec2b648d10","excerpt":"","html":"

","frontmatter":{"date":"November 29, 2019","title":"iTerm2自动填充密码访问ssh","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/iTerm2自动填充密码访问ssh/","previous":{"fields":{"slug":"/Blog/echarts封装Vue组件/"},"frontmatter":{"title":"echarts封装Vue组件"}},"next":{"fields":{"slug":"/Blog/Vue使用provide-inject特性注入皮肤配置/"},"frontmatter":{"title":"Vue使用provide-inject特性注入皮肤配置"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/mac\347\273\210\347\253\257\344\270\255\346\226\207\346\230\276\347\244\272\346\225\260\345\255\227\347\274\226\347\240\201\347\232\204\350\256\276\347\275\256\351\227\256\351\242\230/page-data.json" "b/page-data/Blog/mac\347\273\210\347\253\257\344\270\255\346\226\207\346\230\276\347\244\272\346\225\260\345\255\227\347\274\226\347\240\201\347\232\204\350\256\276\347\275\256\351\227\256\351\242\230/page-data.json" new file mode 100644 index 0000000..5c2503f --- /dev/null +++ "b/page-data/Blog/mac\347\273\210\347\253\257\344\270\255\346\226\207\346\230\276\347\244\272\346\225\260\345\255\227\347\274\226\347\240\201\347\232\204\350\256\276\347\275\256\351\227\256\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/mac终端中文显示数字编码的设置问题/","result":{"data":{"markdownRemark":{"id":"1fa48a2a-9891-592d-98e4-11da760e3ab6","excerpt":"问题描述 新部署的服务器,查看git commit message不显示中文了,全是各种数字编码,而旧服务器显示一切正常,这显然是编码问题了。 原因 简单google了一下,发现是服务器字符集和本机字符集不匹配。 输入locale查看本机的配置,发现LANG和LC_ALL…","html":"

问题描述

\n

新部署的服务器,查看git commit message不显示中文了,全是各种数字编码,而旧服务器显示一切正常,这显然是编码问题了。

\n

原因

\n

简单google了一下,发现是服务器字符集和本机字符集不匹配。

\n

输入locale查看本机的配置,发现LANG和LC_ALL都为空

\n
LANG=\nLC_COLLATE=\"C\"\nLC_CTYPE=\"UTF-8\"\nLC_MESSAGES=\"C\"\nLC_MONETARY=\"C\"\nLC_NUMERIC=\"C\"\nLC_TIME=\"C\"\nLC_ALL=
\n

而服务器上的LANG和LC_ALL都是utf-8

\n
LANG=\"en_US.UTF-8\"\nLC_CTYPE=\"en_US.UTF-8\"\nLC_NUMERIC=\"en_US.UTF-8\"\nLC_TIME=\"en_US.UTF-8\"\nLC_COLLATE=\"en_US.UTF-8\"\nLC_MONETARY=\"en_US.UTF-8\"\nLC_MESSAGES=\"en_US.UTF-8\"\nLC_PAPER=\"en_US.UTF-8\"\nLC_NAME=\"en_US.UTF-8\"\nLC_ADDRESS=\"en_US.UTF-8\"\nLC_TELEPHONE=\"en_US.UTF-8\"\nLC_MEASUREMENT=\"en_US.UTF-8\"\nLC_IDENTIFICATION=\"en_US.UTF-8\"\nLC_ALL=\"en_US.UTF-8\"
\n

解决方案

\n

本地用的zsh,所以在本地打开zsh配置文件vi ~/.zshrc,有一段注释的代码,输入下面的内容

\n
# You may need to manually set your language environment\n  export LANG=\"en_US.UTF-8\"\n  export LC_ALL=\"en_US.UTF-8\"
\n

接着重启终端,或者 source ~/.zshrc使设置生效就可以了,done

","frontmatter":{"date":"October 16, 2019","title":"mac终端中文显示数字编码的设置问题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/mac终端中文显示数字编码的设置问题/","previous":{"fields":{"slug":"/Blog/HTML中自闭合Vue组件的bug/"},"frontmatter":{"title":"HTML中自闭合Vue组件的bug"}},"next":{"fields":{"slug":"/Blog/ES2015-ES2020/"},"frontmatter":{"title":"ES2015-ES2020"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/nginx\345\237\272\346\234\254\351\205\215\347\275\256/page-data.json" "b/page-data/Blog/nginx\345\237\272\346\234\254\351\205\215\347\275\256/page-data.json" new file mode 100644 index 0000000..5a3a246 --- /dev/null +++ "b/page-data/Blog/nginx\345\237\272\346\234\254\351\205\215\347\275\256/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/nginx基本配置/","result":{"data":{"markdownRemark":{"id":"a9c3daec-c088-5db7-91e5-87226adeb45b","excerpt":"三个主要字段 http,server,location location配置 优先级 = ^~ ~ ~* / 反向代理配置 proxy_pass gzip配置 案例","html":"

三个主要字段

\n

http,server,location

\n

location配置

\n

优先级

\n

=

\n

^~

\n

~

\n

~*

\n

/

\n

反向代理配置

\n

proxy_pass

\n

gzip配置

\n
gzip on;\ngzip_min_length 1k; \ngzip_buffers   4 16k;\ngzip_http_version 1.1; # 为什是1.1\ngzip_comp_level 2;  # 为什么选择2\ngzip_types    \n\t\ttext/plain \n\t\ttext/javascript\n\t\tapplication/javascript \n\t\ttext/css \n\t\tapplication/json\n\t\tapplication/xml;\n    \tgzip_vary on;\n\ngzip_proxied any;
\n

案例

","frontmatter":{"date":"January 15, 2020","title":"nginx基本配置","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/nginx基本配置/","previous":{"fields":{"slug":"/Blog/LeetCode-2-Add Two Numbers/"},"frontmatter":{"title":"LeetCode-2-Add Two Numbers"}},"next":{"fields":{"slug":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/"},"frontmatter":{"title":"LeetCode-3-Longest Substring Without Repeating Characters"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/nginx\351\205\215\347\275\256\347\232\204\344\270\200\344\270\252\345\260\217\351\224\231\350\257\257/page-data.json" "b/page-data/Blog/nginx\351\205\215\347\275\256\347\232\204\344\270\200\344\270\252\345\260\217\351\224\231\350\257\257/page-data.json" new file mode 100644 index 0000000..78de742 --- /dev/null +++ "b/page-data/Blog/nginx\351\205\215\347\275\256\347\232\204\344\270\200\344\270\252\345\260\217\351\224\231\350\257\257/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/nginx配置的一个小错误/","result":{"data":{"markdownRemark":{"id":"a9751351-ab54-589f-804d-cf3d7be07d7a","excerpt":"写在前面 最近一次帮同事找错误的经历,虽然最后发现是很低级的错误,但是过程挺有意思 问题描述 之前搭建的新管理后台项目A上线了,搭档想在本地调试,于是按照文档配好了nginx配置文件,本地启动项目,按域名访问却被重定向到了另一个项目B的页面 排查过程 检查项目A的ip…","html":"

写在前面

\n

最近一次帮同事找错误的经历,虽然最后发现是很低级的错误,但是过程挺有意思

\n

问题描述

\n

之前搭建的新管理后台项目A上线了,搭档想在本地调试,于是按照文档配好了nginx配置文件,本地启动项目,按域名访问却被重定向到了另一个项目B的页面

\n

排查过程

\n
    \n
  1. \n

    检查项目A的ip地址是否正确

    \n

    确认是本机ip,没有错,刷新页面,问题依旧

    \n
  2. \n
  3. \n

    switchHosts关闭其他项目的host配置,只保留项目A的配置

    \n

    清理dns缓存,刷新页面,问题依旧,怀疑nginx配置没有生效

    \n
  4. \n
  5. \n

    nginx -t 检查配置

    \n

    检查失败,报错“duplicate upstream a-proxy”,定位到A的nginx配置文件

    \n

    a-proxy是配置的反向代理,在配置文件里大概是这样的

    \n
    server {\n    ...\n    location / {\n        ...\n        proxy_pass http://a-proxy;\n    }\n}\nupstream a-proxy {\n   server 127.0.0.1: 12076;\n}
    \n

    google了一下这个错误,说是出现了这个错误说明a-proxy出现了多次,删除多余的就可以,于是排查配置文件

    \n
  6. \n
  7. \n

    A的nginx配置文件中搜索重复的a-proxy

    \n

    没有找到

    \n
  8. \n
  9. \n

    排查其他servernginx配置文件,搜索重复的a-proxy

    \n

    没有找到

    \n
  10. \n
  11. \n

    排查合并的主nginx配置文件,搜索重复的a-proxy

    \n

    还是没有找到

    \n
  12. \n
  13. \n

    a-proxy改名,看是否还是报错

    \n

    仍然报相同的错误,“duplicate upstream xxx-proxy”,这样基本上可以确认是A的同一份配置文件被加载了多次导致的错误

    \n
  14. \n
  15. \n

    回到主nginx配置文件,开始查找加载的配置代码

    \n

    经过排查发现 include servers/*代码出现了多次,正是这个代码导致了同一份配置文件被多次加载。\n于是删除多余代码,重新nginx -t检查通过,重启nginx后项目访问正常

    \n
  16. \n
\n

总耗时: 1小时

\n

总结

\n

经过搭档回忆,起因是之前重装nginx复制粘贴配置文件的时候不小心复制重复了一些内容。

\n

其他配置尽管重复加载,但没有遇到这个不允许重复的情况,这个问题一直没有暴露出来,直到这次...

\n

自己对nginx不太熟悉,以后还要抽时间补一补相关知识,以上。

","frontmatter":{"date":"October 11, 2019","title":"nginx配置的一个小错误","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/nginx配置的一个小错误/","previous":{"fields":{"slug":"/Blog/部署node管理后台遇到的一个问题/"},"frontmatter":{"title":"部署node管理后台遇到的几个问题"}},"next":{"fields":{"slug":"/Blog/HTML中自闭合Vue组件的bug/"},"frontmatter":{"title":"HTML中自闭合Vue组件的bug"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/node\345\274\200\345\217\221\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\345\235\221/page-data.json" "b/page-data/Blog/node\345\274\200\345\217\221\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\345\235\221/page-data.json" new file mode 100644 index 0000000..e537d28 --- /dev/null +++ "b/page-data/Blog/node\345\274\200\345\217\221\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\345\260\217\345\235\221/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/node开发遇到的一个小坑/","result":{"data":{"markdownRemark":{"id":"8744745f-b72c-589d-a330-a829dde8c7b0","excerpt":"写在前面 大前端之路又迈出了坚实一步。 leader架不住我们前端切图仔的各种游说,终于决定了上node。马上就可以写node接入层了,后端哥们可以专心开发微服务,切图仔们也可以想要什么数据字段就用什么了,毕竟求人不如求己。 leader给我分配了搭建框架的任务,以公司内部koa…","html":"

写在前面

\n

大前端之路又迈出了坚实一步。

\n

leader架不住我们前端切图仔的各种游说,终于决定了上node。马上就可以写node接入层了,后端哥们可以专心开发微服务,切图仔们也可以想要什么数据字段就用什么了,毕竟求人不如求己。

\n

leader给我分配了搭建框架的任务,以公司内部koa2+vue框架为基础,自己改改应该就可以了。毕竟只是个管理后台,做成MPA方便编译、迁移和维护。SPA页面数量过多,热更新直接爆内存堆,之前体会过一次,不想再碰。

\n

踩坑记录

\n

搭框架自然要区分各种运行环境,开发、测试、生产自然是标配。界面上会根据环境不同给一些信息提示,在node里很自然就要写这样的语句env = process.env.NODE_ENV来判断当前所处的环境。

\n

用的现成框架,却在EJS条件渲染视图文件的时候总是失败,始终没有触发到我想要的逻辑分支。看了几分钟,开始看页面env变量的值。

\n

结果居然发现框架里是这么写的

\n
const env = JSON.stringify(process.env.NODE_ENV || 'development')
\n

而我的模板条件渲染语句是这么写的

\n
<% if(env=='development') {%>\n    //do something \n<% } %>
\n

打印一看,当然不能进入分支逻辑

\n
var a = JSON.stringify('development'); // '\"development\"'\nvar b = 'development'; // 'development'\na == b; // false\na === b; // false
\n

框架大佬多此一举用了JSON.stringify,把字符串'development'变成了有额外双引号的字符串'\"development\"',二者的比较自然变成了develpmentdevelopment+双引号的比较,永远不会相等,不管使用严格相等===还是转换类型相等==

\n

踩坑记录完毕

","frontmatter":{"date":"September 03, 2019","title":"node开发遇到的一个小坑","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/node开发遇到的一个小坑/","previous":{"fields":{"slug":"/Blog/一次App内页的bug溯源/"},"frontmatter":{"title":"一次App内页的bug溯源"}},"next":{"fields":{"slug":"/Blog/使用Charles抓包移动端网络请求/"},"frontmatter":{"title":"使用Charles抓包移动端网络请求"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/normalizr\346\211\201\345\271\263\345\214\226\351\200\222\345\275\222\347\273\223\346\236\204\347\232\204json/page-data.json" "b/page-data/Blog/normalizr\346\211\201\345\271\263\345\214\226\351\200\222\345\275\222\347\273\223\346\236\204\347\232\204json/page-data.json" new file mode 100644 index 0000000..b2eb008 --- /dev/null +++ "b/page-data/Blog/normalizr\346\211\201\345\271\263\345\214\226\351\200\222\345\275\222\347\273\223\346\236\204\347\232\204json/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/normalizr扁平化递归结构的json/","result":{"data":{"markdownRemark":{"id":"f5930753-9030-5e83-bc82-027553933968","excerpt":"挖坑待填","html":"
挖坑待填
","frontmatter":{"date":"April 23, 2018","title":"normalizr扁平化递归结构的json","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/normalizr扁平化递归结构的json/","previous":{"fields":{"slug":"/Blog/Android模拟器访问本地web服务的url/"},"frontmatter":{"title":"Android模拟器访问本地web服务的url"}},"next":{"fields":{"slug":"/Blog/JavaScript加密URL/"},"frontmatter":{"title":"JavaScript加密URL"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/null\345\222\214undefined\347\232\204\346\257\224\350\276\203/page-data.json" "b/page-data/Blog/null\345\222\214undefined\347\232\204\346\257\224\350\276\203/page-data.json" new file mode 100644 index 0000000..0c6743e --- /dev/null +++ "b/page-data/Blog/null\345\222\214undefined\347\232\204\346\257\224\350\276\203/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/null和undefined的比较/","result":{"data":{"markdownRemark":{"id":"aede8ad6-3f0c-5cad-aa35-6b731fbaed2c","excerpt":"相同点 均为基本类型 都属于“假值”,用Boolean()转换类型后都为false 使用==进行比较时,二者相等 看 2 个可能会遇到的情况: 例 1 中,这几个值在 if 语句中都会被隐式转换为boolean类型,而且恰好都为假值,取反之后均为真,因此 三个 if…","html":"

相同点

\n
\n
    \n
  1. 均为基本类型
  2. \n
  3. 都属于“假值”,用Boolean()转换类型后都为false
  4. \n
  5. 使用==进行比较时,二者相等
  6. \n
\n

看 2 个可能会遇到的情况:

\n
//例1\nvar a = null;\nvar b;\nvar c = 0;\nif (!a) {\n  console.log('abc'); //a 为 null\n}\nif (!b) {\n  console.log('abc'); //b 为 undefined\n}\nif (!c) {\n  console.log('abc'); //c 为 0\n}\n\n//例2\nif (b == a) {\n  console.log('a,b');\n}\nif (b === undefined) {\n  console.log('b');\n}
\n

例 1 中,这几个值在 if 语句中都会被隐式转换为boolean类型,而且恰好都为假值,取反之后均为真,因此 三个 if 内部的 console 语句都可以执行。

\n

如果要区分具体值,需要指明比较的对象。比如例 2 中第一个 if 语句,当 b 为undefinednull时,才判定为真;在第二个 if 语句中,只有当 b 为undefined时才判定为真,null也无法通过。

\n

不同点

\n
\n
    \n
  1. 类型不同,因此二者用===比较不相等,typeof的值也不同
  2. \n
  3. 转换为 string,number 后,二者不相同
  4. \n
\n
//例3\n\nundefined === null; //false\n\ntypeof undefined; //'undefined'\ntypeof null; //'object'\n\nString(undefined); //'undefined'\nString(null); //'null'\n\nNumber(undefined); //NaN\nNumber(null); //0
","frontmatter":{"date":"May 03, 2018","title":"null和undefined的比较","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/null和undefined的比较/","previous":{"fields":{"slug":"/Blog/JavaScript前端RSA加密/"},"frontmatter":{"title":"JavaScript前端RSA加密"}},"next":{"fields":{"slug":"/Blog/如何判断日期是否为今天/"},"frontmatter":{"title":"如何判断日期是否为今天"}}}}} \ No newline at end of file diff --git a/page-data/Blog/page-data.json b/page-data/Blog/page-data.json new file mode 100644 index 0000000..c57973b --- /dev/null +++ b/page-data/Blog/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-blog-js","path":"/Blog/","result":{"data":{"site":{"siteMetadata":{"sloganBlog":"\"The ultimate test of your knowledge is your capacity to convey it to another.\""}},"bgImg":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHP2hwgeH//xAAYEAEAAwEAAAAAAAAAAAAAAAABABARE//aAAgBAQABBQKIlDk6LX//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAACAwAAAAAAAAAAAAAAAAAAIRBBkf/aAAgBAQAGPwIcsrD/xAAaEAADAAMBAAAAAAAAAAAAAAAAAREQMUGR/9oACAEBAAE/ISJDVwxqtjZ6ZbzwP//aAAwDAQACAAMAAAAQIM//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAdEAEAAgEFAQAAAAAAAAAAAAABABFBECExkbHR/9oACAEBAAE/EICsIsq9AO2OJfzZlp9GDF9vyn//2Q==","aspectRatio":1.5,"src":"/static/eb67e3f208d38d097ab5d170245ece93/01fdc/osman-rana-263708-unsplash.jpg","srcSet":"/static/eb67e3f208d38d097ab5d170245ece93/7ebb6/osman-rana-263708-unsplash.jpg 750w,\n/static/eb67e3f208d38d097ab5d170245ece93/03fe8/osman-rana-263708-unsplash.jpg 1500w,\n/static/eb67e3f208d38d097ab5d170245ece93/01fdc/osman-rana-263708-unsplash.jpg 3000w,\n/static/eb67e3f208d38d097ab5d170245ece93/71d73/osman-rana-263708-unsplash.jpg 4500w,\n/static/eb67e3f208d38d097ab5d170245ece93/582c1/osman-rana-263708-unsplash.jpg 4534w","sizes":"(max-width: 3000px) 100vw, 3000px"}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was…","fields":{"slug":"/Blog/Google XSS game Level 1/"},"id":"2f1f8b91-417f-51ce-976a-efe06d73c404","frontmatter":{"date":"November 18, 2020","title":"Google XSS game - Level 1"}}},{"node":{"excerpt":"背景 公司产品的Mac桌面端使用webview打开公司PC端主页,主页上有多个Tab。 其中一个Tab(以下简称A Tab,对应地址以下代称为:https://correct.domain.com)可以跳转到我负责的PC端页面(以下简称B页,对应地址https://correct…","fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"id":"66c9e06e-fbf8-58c6-873c-cd862e329846","frontmatter":{"date":"October 12, 2020","title":"Mac桌面端webview打开页面失败排查"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Server-Side GraphQL/"},"id":"9f40db4b-0cfd-5ade-a564-d65471bbde5c","frontmatter":{"date":"June 25, 2020","title":"Server-Side GraphQL"}}},{"node":{"excerpt":"前端知识复习 code snippet Function.prototype.bind 标准 When the bind method is called with argument thisArg and zero or more args, it performs the…","fields":{"slug":"/Blog/手写bind/"},"id":"2a0b1fca-b55a-56ee-9ad0-63d480e9aa31","frontmatter":{"date":"June 17, 2020","title":"手写bind"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Design Systems with Storybook/"},"id":"5b284b1b-e8d2-5ddb-9dc4-65aabcfb0280","frontmatter":{"date":"June 15, 2020","title":"Design Systems with Storybook"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Client-Side GraphQL/"},"id":"140d550b-dd69-57e9-890a-da83ea6ed869","frontmatter":{"date":"June 15, 2020","title":"Client-Side GraphQL"}}},{"node":{"excerpt":"前端知识复习 code snippet instanceof 标准 If Type(target) is not Object, throw a TypeError exception. Let instOfHandler be ? GetMethod(target…","fields":{"slug":"/Blog/手写instanceof/"},"id":"9b39a23f-9cb2-5e10-8493-44f92d28297c","frontmatter":{"date":"June 15, 2020","title":"手写instanceof"}}},{"node":{"excerpt":"背景 做Code Review的时候遇到一段Vue的SFC代码,需要在mounted生命周期里绑定document的scroll事件 下面这段代码的问题有哪些? 另一个例子 再看一个其他例子 答案 第一个console输出的是Vue实例 第二个console…","fields":{"slug":"/Blog/Vue实例方法的this指向/"},"id":"0bbe4a7f-d87d-592c-a034-38926ae81a87","frontmatter":{"date":"June 09, 2020","title":"Vue实例方法的this指向"}}},{"node":{"excerpt":"前端知识复习 code snippet 根据MDN,new主要做了4件事情 The new keyword does the following things: Creates a blank, plain JavaScript object; Links (sets the…","fields":{"slug":"/Blog/手写new/"},"id":"f28f6d8e-a799-5a30-89f3-82317cbfc986","frontmatter":{"date":"May 28, 2020","title":"手写new"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Svelte初探/"},"id":"e1f6e456-c9f4-56e8-b6c7-5cb7cf415407","frontmatter":{"date":"May 26, 2020","title":"Svelte初探"}}},{"node":{"excerpt":"现象 用了一个雪碧图,图片的真实宽高是 112px*22px,对应了 4 种情况下的 4 个图标 A,B,C,D, 每个分别是 28pt*22pt,折算到两倍屏就是 14pt*11pt 的图标尺寸。 @1x,@2x,@3x 整数倍 dpr…","fields":{"slug":"/Blog/background-image踩坑/"},"id":"90c3fcde-bc1e-5ab9-a666-74fe764e33f0","frontmatter":{"date":"May 25, 2020","title":"background-image踩坑"}}},{"node":{"excerpt":"背景 使用Vue重构一个jQuery的H5/PC页面,一个列表组件实现滚动加载更多的时候踩了个坑。 现象 没有触发滚动\n开始是把滚动事件绑定在列表组件的父级元素,然后发现无论如何都无法触发滚动事件 实现父元素滚动的布局导致了刘海屏下的一个兼容性bug\n让html和body…","fields":{"slug":"/Blog/scroll事件踩坑记录/"},"id":"0b6bd893-0d6b-514d-ad4a-160327e1f97d","frontmatter":{"date":"May 25, 2020","title":"scroll事件踩坑记录"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.every 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","fields":{"slug":"/Blog/手写Array.prototype.every/"},"id":"73eaddd5-bc49-52b3-bb19-6eebc47d6607","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.every"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.pop 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If len is zero, then Perform…","fields":{"slug":"/Blog/手写Array.prototype.pop/"},"id":"4f66deb7-bf30-5339-a9a5-cbb87ff09c95","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.pop"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.push 标准 t O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). Let items be a List whose…","fields":{"slug":"/Blog/手写Array.prototype.push/"},"id":"603756e2-ff0b-5ca3-aef9-fff4557b8d22","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.push"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.some 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn) is…","fields":{"slug":"/Blog/手写Array.prototype.some/"},"id":"5010b486-92c1-5f77-be25-2154d3d877ad","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.some"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.foreach 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","fields":{"slug":"/Blog/手写Array.prototype.forEach/"},"id":"8f739d39-7b65-59b7-8837-6fdb4b3387f2","frontmatter":{"date":"May 23, 2020","title":"手写Array.prototype.forEach"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.filter 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","fields":{"slug":"/Blog/手写Array.prototype.filter/"},"id":"3a2a9a67-7077-5fc5-90a0-c39132697111","frontmatter":{"date":"May 22, 2020","title":"手写Array.prototype.filter"}}},{"node":{"excerpt":"前端知识复习 code snippet 先看 array.prototype.reduce 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable…","fields":{"slug":"/Blog/手写Array.prototype.reduce/"},"id":"3e05ec7f-10db-5f38-a5e0-6b538033dd72","frontmatter":{"date":"May 21, 2020","title":"手写Array.prototype.reduce"}}},{"node":{"excerpt":"前端知识复习 code snippet 废话少说,先看 array.prototype.map 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable…","fields":{"slug":"/Blog/手写Array.prototype.map/"},"id":"b0f6f384-9672-512b-ac7e-0a4cf63787a1","frontmatter":{"date":"May 20, 2020","title":"手写Array.prototype.map"}}},{"node":{"excerpt":"reference:https://www.cloudflare.com/learning/security/glossary/bgp-hijacking/","fields":{"slug":"/Blog/BGP Hijacking/"},"id":"947c1159-00ce-523d-86d6-7931d7de665c","frontmatter":{"date":"May 18, 2020","title":"BGP Hijacking"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Intro to Docker/"},"id":"362bffe2-a8a0-514b-b5f4-7916692907d8","frontmatter":{"date":"May 15, 2020","title":"Intro to Docker"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Websocket初步/"},"id":"7cf95374-586d-5c2f-98c6-3021aea78171","frontmatter":{"date":"May 03, 2020","title":"Websocket初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Intro to Functional Programming/"},"id":"642301ea-ca1f-50da-8876-12246915c618","frontmatter":{"date":"May 02, 2020","title":"Intro to Functional Programming"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/php调参优化小记/"},"id":"3a2dc2b4-0203-51bf-8d4c-ea89d1021dcb","frontmatter":{"date":"April 28, 2020","title":"php调参优化小记"}}},{"node":{"excerpt":"写在前面 公司项目网站改版在即,需要扩充国际化和本地化支持。 查资料看了下这两个东西,理清了一些概念,简单记录一下。 国际化和本地化 根据wiki的说法,国际化与本地化(internationalization and localization…","fields":{"slug":"/Blog/国际化和本地化初步/"},"id":"8a32452e-abbf-555e-adce-ce304b54693f","frontmatter":{"date":"April 27, 2020","title":"国际化和本地化初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/shell脚本合并csv文件/"},"id":"d0c5b21d-fd38-5c8f-a2bf-86402ef3440c","frontmatter":{"date":"April 26, 2020","title":"shell脚本合并csv文件"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web图片优化初步/"},"id":"63ebd2f2-b369-595b-807b-870e37018de7","frontmatter":{"date":"April 21, 2020","title":"web图片优化初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web性能测试-locust/"},"id":"eb8cc83c-273e-5edc-baca-94c27f35e406","frontmatter":{"date":"April 18, 2020","title":"web性能测试-locust"}}},{"node":{"excerpt":"写在前面 1.sequence request - server responds - domContentLoaded - load Choose the metrics web.dev/user-centric-performance-metrics 2.1 Is there…","fields":{"slug":"/Blog/web性能优化指标解析/"},"id":"28edb7f8-457f-5fe4-bd0b-a1406bec1de5","frontmatter":{"date":"April 12, 2020","title":"web性能优化指标解析"}}},{"node":{"excerpt":"写在前面 图片消耗了网页流量的50%(中位数),移动端图片消耗了大约900Kb ​ - httparchive.org, 2020.01 图片优化的…","fields":{"slug":"/Blog/响应式图片优化/"},"id":"e0fbe291-555e-51e5-b342-d22459126a9e","frontmatter":{"date":"April 12, 2020","title":"响应式图片优化"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web性能测试-jmeter/"},"id":"05374403-0fc9-576b-a1d5-76b27aa2e6f5","frontmatter":{"date":"April 11, 2020","title":"web性能测试-jmeter"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web性能测试初步/"},"id":"a17a33c5-c83a-5c6e-859b-2d9cbed6a64c","frontmatter":{"date":"April 08, 2020","title":"web性能测试初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-数据库model/"},"id":"edca47b0-5826-5638-81c1-3074764524a2","frontmatter":{"date":"April 07, 2020","title":"后端单元测试-数据库model"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-接入层请求mock/"},"id":"81d585ad-d91a-570a-a3f4-0ce9e10d8b97","frontmatter":{"date":"April 06, 2020","title":"后端单元测试-接入层请求mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web安全初步/"},"id":"cf0f9da2-05aa-5aa6-9889-2513e1837ad5","frontmatter":{"date":"April 02, 2020","title":"web安全初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-service/"},"id":"e4c03580-a16a-5867-abf0-c2d2c95b3736","frontmatter":{"date":"April 02, 2020","title":"后端单元测试-service"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-Koa中间件测试/"},"id":"9e7ed8c5-4235-54fa-acad-f6dcfd7bd4c8","frontmatter":{"date":"March 29, 2020","title":"后端单元测试-Koa中间件测试"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-controller/"},"id":"997e63e1-57f0-53f9-b328-fb0da58c2260","frontmatter":{"date":"March 23, 2020","title":"后端单元测试-controller"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-测试组件/"},"id":"5c2012e3-3d1c-5bc0-af34-f3dd62491acb","frontmatter":{"date":"March 19, 2020","title":"前端单元测试-测试组件"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-Vue组件mock/"},"id":"e8d712f4-e45b-5cbd-baf8-529d651ecde7","frontmatter":{"date":"March 17, 2020","title":"前端单元测试-Vue组件Mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-Axios对象Mock/"},"id":"f2c90e0f-f550-5eba-9efd-4881c115409e","frontmatter":{"date":"March 15, 2020","title":"前端单元测试-Axios对象Mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-Vue对象Mock/"},"id":"e4090338-39f6-5d5c-87e9-6996d08640b6","frontmatter":{"date":"March 12, 2020","title":"前端单元测试-Vue对象Mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/入坑TypeScript/"},"id":"237ddafe-9bc6-5063-bc8d-24a25dfdd2d7","frontmatter":{"date":"March 11, 2020","title":"入坑TypeScript"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/自己实现Promise/"},"id":"71da6e18-470a-5f6c-be65-5c8d2965dffd","frontmatter":{"date":"March 11, 2020","title":"自己实现Promise"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/单元测试初步/"},"id":"350d6ea2-e5d7-5c00-8b15-613fc7a93874","frontmatter":{"date":"March 09, 2020","title":"单元测试初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端错误监控与上报原理/"},"id":"9fd36c51-f455-5273-b2b0-213c9ca6ef0f","frontmatter":{"date":"March 08, 2020","title":"前端错误监控与上报原理"}}},{"node":{"excerpt":"写在前面 最近增加Node多语言的支持,后端获取语言参数的优先级有点不清楚 特意查了些文档,在这里记录一下 优先级 Domain: 顶级域名(TLD, Top Level Domain),如.cn, .de等 Subdomain: 子域名,如cn.amazon.com…","fields":{"slug":"/Blog/多语言的判断优先级/"},"id":"25c6cc2f-53d2-5f10-af94-0e39d8c8f5ee","frontmatter":{"date":"March 05, 2020","title":"多语言的判断优先级"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/HTTP2.0初步/"},"id":"35f8591d-1ecb-55af-8d98-639aa8ad0276","frontmatter":{"date":"February 28, 2020","title":"HTTP/2初步"}}},{"node":{"excerpt":"常见相关HTTP Header HTTP 1.0 Pragma 与HTTP 1.1 Cache-Control对等,为了兼容而存在; 如果Cache-Control同时存在,Pragma会被忽略; 通常设置为Pragma: no-cache; HTTP 1.1 Cache…","fields":{"slug":"/Blog/HTTP缓存小结/"},"id":"7c460279-2a30-572b-8a20-49b67e336392","frontmatter":{"date":"February 25, 2020","title":"HTTP缓存小结"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/XMLHttpRequest回顾/"},"id":"677ea431-8aa1-5b18-8cae-e2420f5022df","frontmatter":{"date":"February 21, 2020","title":"XMLHttpRequest回顾"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/HTTPS初步/"},"id":"a5367ab2-d182-5be3-b310-7838fadb13a6","frontmatter":{"date":"February 19, 2020","title":"HTTPS初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/TCP三次握手/"},"id":"7b235de6-6b7a-5fab-a80c-26afde87bdb6","frontmatter":{"date":"February 09, 2020","title":"TCP三次握手"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/2019总结与2020年计划/"},"id":"f4bb9bc4-b1a8-50e0-9435-f6ed736fd43d","frontmatter":{"date":"January 31, 2020","title":"2019总结与2020年计划"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/"},"id":"0f100913-0711-5c14-b7c4-088682d17473","frontmatter":{"date":"January 16, 2020","title":"LeetCode-3-Longest Substring Without Repeating Characters"}}},{"node":{"excerpt":"三个主要字段 http,server,location location配置 优先级 = ^~ ~ ~* / 反向代理配置 proxy_pass gzip配置 案例","fields":{"slug":"/Blog/nginx基本配置/"},"id":"a9c3daec-c088-5db7-91e5-87226adeb45b","frontmatter":{"date":"January 15, 2020","title":"nginx基本配置"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/LeetCode-2-Add Two Numbers/"},"id":"e89253ca-e84d-5893-8d2c-c2cb71b6a2ba","frontmatter":{"date":"January 15, 2020","title":"LeetCode-2-Add Two Numbers"}}},{"node":{"excerpt":"开始之前,先推荐一个工具网站 用于测试配置文件中location匹配,感觉很方便 Nginx location match tester: https://nginx.viraptor.info/ 背景 node…","fields":{"slug":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/"},"id":"9e5c733d-c0a1-5de8-aac8-6790c0f6b061","frontmatter":{"date":"January 07, 2020","title":"配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问"}}},{"node":{"excerpt":"背景 H5页面主题皮肤切换,有2条路线,一是使用css实现,一是使用js实现。 其实需求很简单,希望组件本身可以和皮肤主题解耦,这样至少有…","fields":{"slug":"/Blog/Vue使用provide-inject特性注入皮肤配置/"},"id":"fd2d5b3f-7c43-5a03-a5f2-71fb5e9d1309","frontmatter":{"date":"January 03, 2020","title":"Vue使用provide-inject特性注入皮肤配置"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/iTerm2自动填充密码访问ssh/"},"id":"8921904a-72d4-5e7e-9542-c5ec2b648d10","frontmatter":{"date":"November 29, 2019","title":"iTerm2自动填充密码访问ssh"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/echarts封装Vue组件/"},"id":"3e857be3-26b5-5e58-9f9f-c1e24b745e6d","frontmatter":{"date":"November 27, 2019","title":"echarts封装Vue组件"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/echarts使用小记/"},"id":"6a857de3-8465-5902-8fb2-990446eccc51","frontmatter":{"date":"November 21, 2019","title":"echarts使用小记"}}},{"node":{"excerpt":"写在前面 项目配置 ESLint eslint babel-eslint eslint-config-airbnb-base eslint-plugin-vue eslint-config-futu eslint-plugin-import, 不认识webpack…","fields":{"slug":"/Blog/使用eslint+prettier+husky规范项目代码风格/"},"id":"f46bbcb3-d0da-5e3e-ae88-8e967791e8df","frontmatter":{"date":"November 05, 2019","title":"使用eslint+prettier+husky规范项目代码风格"}}},{"node":{"excerpt":"同一个页面有多个相同组件,根据配置分别控制显隐,使用v-if时始终都只有第一个组件能取到props,第二个没有被初始化","fields":{"slug":"/Blog/Vue中v-if和v-show遇到的小问题/"},"id":"e3a61e55-c1c0-5a96-b0f9-8957af55a3b6","frontmatter":{"date":"November 02, 2019","title":"Vue中v-if和v-show遇到的小问题"}}},{"node":{"excerpt":"1. TC39 工作流程 - 标准一般每年6-7月发布 2. ES2015(ES6):常用特性 2.1 模版字符串 2.2 解构赋值,rest/spread操作符 2.3 Symbol / Iterator / Generator 3. ES2016(ES7) 4. ES…","fields":{"slug":"/Blog/ES2015-ES2020/"},"id":"a0cbb589-3084-57ea-9d0c-b08d3bab8d2a","frontmatter":{"date":"October 31, 2019","title":"ES2015-ES2020"}}},{"node":{"excerpt":"问题描述 新部署的服务器,查看git commit message不显示中文了,全是各种数字编码,而旧服务器显示一切正常,这显然是编码问题了。 原因 简单google了一下,发现是服务器字符集和本机字符集不匹配。 输入locale查看本机的配置,发现LANG和LC_ALL…","fields":{"slug":"/Blog/mac终端中文显示数字编码的设置问题/"},"id":"1fa48a2a-9891-592d-98e4-11da760e3ab6","frontmatter":{"date":"October 16, 2019","title":"mac终端中文显示数字编码的设置问题"}}},{"node":{"excerpt":"写在前面 今天犯了个低级错误,页面新增加了一个vue组件,因为是直接在html里写的(需要用php的后端直出,没有用vue单文件的写法),在使用自闭合标记写法的情况下这个组件没有直接渲染,而是把它后面的div…","fields":{"slug":"/Blog/HTML中自闭合Vue组件的bug/"},"id":"5966dc21-09c0-50a0-be45-1fe9dbdbc1fa","frontmatter":{"date":"October 12, 2019","title":"HTML中自闭合Vue组件的bug"}}},{"node":{"excerpt":"写在前面 最近一次帮同事找错误的经历,虽然最后发现是很低级的错误,但是过程挺有意思 问题描述 之前搭建的新管理后台项目A上线了,搭档想在本地调试,于是按照文档配好了nginx配置文件,本地启动项目,按域名访问却被重定向到了另一个项目B的页面 排查过程 检查项目A的ip…","fields":{"slug":"/Blog/nginx配置的一个小错误/"},"id":"a9751351-ab54-589f-804d-cf3d7be07d7a","frontmatter":{"date":"October 11, 2019","title":"nginx配置的一个小错误"}}},{"node":{"excerpt":"写在前面 核心服务扩容,之前预定分配给node管理后台用的服务器不能用了。 不得不重新申请了一台服务器部署,结果部署成功后业务一直运行不起来,花了3天才排查到原因,真是尴尬。 这里记录一下,留作备忘。 背景信息 开始安装又卸载node…","fields":{"slug":"/Blog/部署node管理后台遇到的一个问题/"},"id":"6aef6008-329b-5323-abb5-95225f7b1387","frontmatter":{"date":"October 10, 2019","title":"部署node管理后台遇到的几个问题"}}},{"node":{"excerpt":"很多年以后,我可能仍然会记得2017年7月某个下午的那场谈话。 入职第一天,项目负责人笑眯眯的给我说,公司项目有了变化,临时前端缺人,需要我支持一下。就这样,本以为做java后台开发的我,误打误撞进了前端的门。 从什么前端知识都不会,到可以使用react-native…","fields":{"slug":"/Blog/前端二年/"},"id":"57d1b658-9f0d-52c2-9c09-0aa67bfcc0e6","frontmatter":{"date":"October 08, 2019","title":"前端二年"}}},{"node":{"excerpt":"写在前面 最近做了几个混合App开发的需求,涉及到了JSBridge,记录一下 一点总结 webview的URL最大长度,跟使用的浏览器内核有关,和客户端同学测试过是8182个字符,和chrome标称的长度一致,所以我司webview内核用的应该是chrome","fields":{"slug":"/Blog/JSBridge的一点总结/"},"id":"f10505f3-3720-58aa-8aad-b78722974c24","frontmatter":{"date":"September 28, 2019","title":"JSBridge的一点总结"}}},{"node":{"excerpt":"写在前面 这篇是大概一个半月前部署node项目时遇到的一个小问题,写下来备忘 问题描述 部署完毕,运行报错的时候才发现服务器没有pm2.config.js配置的文件路径 ssh…","fields":{"slug":"/Blog/PM2遇到的一个小问题/"},"id":"5be4d78e-7d0a-52d1-af56-0df5ba30f087","frontmatter":{"date":"September 25, 2019","title":"PM2遇到的一个小问题"}}},{"node":{"excerpt":"TL;DR babel不会打包node_modules里的文件,所以引入组件时,必须用组件打包后的代码 问题描述 npm install安装了公司内部组件之后,使用时import了源文件,然后项目打包报错: ... UglifyJS unexpected token: punc…","fields":{"slug":"/Blog/一个关于babel的愚蠢小错误/"},"id":"aca42108-7c9b-5114-aa02-19dd68185375","frontmatter":{"date":"September 19, 2019","title":"一个关于babel的愚蠢错误"}}},{"node":{"excerpt":"写在前面 Sequelize内部时间格式","fields":{"slug":"/Blog/Sequelize和MySql时间格式小记/"},"id":"e066ab84-1aa5-5179-ad5a-e586738cdb89","frontmatter":{"date":"September 17, 2019","title":"Sequelize和MySql时间格式小记"}}},{"node":{"excerpt":"写在前面 这是4个月前的一篇工作记录,是上一篇Charles使用的扩展版。 因为平时用Mac,所以只列出了Mac调试不同移动端的情况,windows没有涉及。 在Mac下调试App常用3种手段: USB调试 使用腾讯开源的vConsole 使用Charles调试 USB…","fields":{"slug":"/Blog/移动端网页调试技巧/"},"id":"b4ea2cba-b13c-5b3a-94fd-2511d2b008c5","frontmatter":{"date":"September 08, 2019","title":"移动端网页调试技巧"}}},{"node":{"excerpt":"写在前面 这是4个月前的一篇简要工作记录,重新编辑整理了一下,算是自己技能成长的一个见证。 可以抓包移动端网络请求的工具很多,windows下有fiddler和wireshark,Mac下有Charlse和Surge for Mac(Surge iOS版甚至可以在iOS…","fields":{"slug":"/Blog/使用Charles抓包移动端网络请求/"},"id":"3a355e3e-4e71-5c85-a8f5-2598e81462bc","frontmatter":{"date":"September 07, 2019","title":"使用Charles抓包移动端网络请求"}}},{"node":{"excerpt":"写在前面 大前端之路又迈出了坚实一步。 leader架不住我们前端切图仔的各种游说,终于决定了上node。马上就可以写node接入层了,后端哥们可以专心开发微服务,切图仔们也可以想要什么数据字段就用什么了,毕竟求人不如求己。 leader给我分配了搭建框架的任务,以公司内部koa…","fields":{"slug":"/Blog/node开发遇到的一个小坑/"},"id":"8744745f-b72c-589d-a330-a829dde8c7b0","frontmatter":{"date":"September 03, 2019","title":"node开发遇到的一个小坑"}}},{"node":{"excerpt":"写在前面 上一篇博客中提到的业务,这次引发了另一个bug 背景信息 上一次的H5页面上线有段时间了,客户端同学终于赶上了进度,把页面用到了App里更多的地方。 这次bug的主角是2个页面,一个列表页(以下简称L),一个详情页(以下简称D)。L由内嵌webview为容器,作为App…","fields":{"slug":"/Blog/一次App内页的bug溯源/"},"id":"ce599e5a-c388-55a0-871f-53bed85780f6","frontmatter":{"date":"September 02, 2019","title":"一次App内页的bug溯源"}}},{"node":{"excerpt":"写在前面 这是大概3个月之前的一次线上调试过程,最后排查到的原因很简单,但调试过程让我认识了所谓“线上环境复杂”是什么意思。 背景信息 这是入职后接手的第一个H…","fields":{"slug":"/Blog/CDN缓存不同步,一次线上调试的经历/"},"id":"6d3f78a2-9d9e-5150-8f8a-cc925982a1b3","frontmatter":{"date":"August 31, 2019","title":"CDN缓存不同步:一次线上调试的经历"}}},{"node":{"excerpt":"写在前面 2019 年计划完成情况 写在前面 这是今年的第十篇博客。距离上一次写博客已经过去四个月了。 4 月份入职了新公司做 web…","fields":{"slug":"/Blog/2019半年小结/"},"id":"a7c262c0-f025-544b-89d9-c287d05b5344","frontmatter":{"date":"July 28, 2019","title":"2019半年小结"}}},{"node":{"excerpt":"原型链的前提规则 原型链关系试验 试验的一点解释 原型链关系图 原型链的前提规则 任何对象都拥有__proto__属性,指向其 构造函数 (constructor function) 的 原型 (prototype) 对象 例: 假设有数组对象 a…","fields":{"slug":"/Blog/JavaScript中的原型链/"},"id":"3f2a1e16-aa8f-5c90-a824-edea76e7b8b4","frontmatter":{"date":"March 24, 2019","title":"JavaScript中的原型链"}}},{"node":{"excerpt":"富途面试遇到的手写算法题:\n2 个有序数组 A 和 B,只含有数字,每个数组内的元素都有可能重复。请写一个函数,判断 B 是否为 A 的子集。如果是,返回 true;反之,返回 false…","fields":{"slug":"/Blog/判断有序数组B是否为有序数组A的子集/"},"id":"f3cacb59-6c95-53db-9236-d7f8b347d42e","frontmatter":{"date":"March 12, 2019","title":"判断有序数组B是否为有序数组A的子集"}}},{"node":{"excerpt":"Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input…","fields":{"slug":"/Blog/LeetCode-1-Two Sum/"},"id":"10736f50-ca44-5117-a343-1d80c5d049fc","frontmatter":{"date":"February 28, 2019","title":"[LeetCode 1] Two Sum"}}},{"node":{"excerpt":"…","fields":{"slug":"/Blog/转-如何有效地写算法题/"},"id":"0b8dd816-4830-5200-885f-0f2aa77f8ef3","frontmatter":{"date":"February 14, 2019","title":"[转] 如何有效地写算法题"}}},{"node":{"excerpt":"You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the…","fields":{"slug":"/Blog/LeetCode-278-First Bad Version/"},"id":"a4081362-7685-58ab-8015-0ba2200b9a88","frontmatter":{"date":"February 13, 2019","title":"[LeetCode 278] First Bad Version"}}},{"node":{"excerpt":"Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: The number of elements initialized in…","fields":{"slug":"/Blog/LeetCode-88-Merge Sorted Array/"},"id":"05690cee-9b94-5b65-b457-d9d1d763112c","frontmatter":{"date":"February 12, 2019","title":"[LeetCode 88] Merge Sorted Array"}}},{"node":{"excerpt":"The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and…","fields":{"slug":"/Blog/LeetCode-461-Hamming Distance/"},"id":"5a6f3fb4-05aa-5791-aa3c-4ffa8e3365b4","frontmatter":{"date":"February 11, 2019","title":"[LeetCode 461] Hamming Distance"}}},{"node":{"excerpt":"可能是今年 flag 里包含项目最多的一个,今天正式开始 leetcode 刷题,目标是 7 月 31 日之前至少刷完一遍。 leetcode 官方放出了一个 top interview questions list,一共 151 题: easy 共 49 题 medium…","fields":{"slug":"/Blog/开始刷leetcode/"},"id":"4050fece-1838-5092-bc55-e7ec6df7cb69","frontmatter":{"date":"February 11, 2019","title":"开始刷leetcode"}}},{"node":{"excerpt":"近期因为家里各种事情的耽误,一直没有时间完成这篇总结与希望。新的一年已经过完 1/12,这篇姗姗来迟的文章还没开始就有点过时了。 2018 年总结 工作 阅读 代码 2019 希望 2018 年总结 如果要用一个词概括我的 2018,那么这个主题词是:“转型” 工作 201…","fields":{"slug":"/Blog/2018总结与2019希望/"},"id":"b723930e-fcfc-5d82-bf85-9094ddc2a466","frontmatter":{"date":"January 31, 2019","title":"2018总结与2019希望"}}},{"node":{"excerpt":"花了 3,4 天,用 Gatsby 断断续续的重写了之前的博客,现在是 SPA 了,哈哈哈。Gatsby 包装了各种插件,用起来挺方便,最关键是不用自己配置 webpack 了,省事不少。当然了,新东西 bug…","fields":{"slug":"/Blog/用Gatsby重写了博客/"},"id":"9b252f6d-1912-5ff3-a78e-f3b262435809","frontmatter":{"date":"December 16, 2018","title":"用Gatsby重写了博客"}}},{"node":{"excerpt":"写在前面:这是一篇译文,是原作者系列文章的第一篇,第二篇主题是 CSS , 第三篇是 HTML。 作者:Peter Jang 原文名:Modern JavaScript Explained For Dinosaurs 原文于 2017 年 10 月 19 日发表于 medium…","fields":{"slug":"/Blog/译-写给恐龙的现代Javascript指南/"},"id":"8646b4e3-546e-5695-abf6-7229c1a5b9e3","frontmatter":{"date":"December 08, 2018","title":"[译]写给恐龙的现代Javascript指南"}}},{"node":{"excerpt":"以前一直迷迷糊糊的,parameter 和 argument,形参和实参,这 2 个概念中英文完全对不上,现在终于弄清楚了 parameter: 函数声明中用来占位的参数名,中译“形参” 其实它就是 placeholder,翻译成“参数占位符”更容易理解 argument…","fields":{"slug":"/Blog/parameter与argument/"},"id":"ca6f475d-7f00-5394-afc8-39723c3f2219","frontmatter":{"date":"November 21, 2018","title":"parameter与argument"}}},{"node":{"excerpt":"date: 2018-10-29 引子 带返回值的构造函数 一点引申: 单例模式 引子 理论上说,只要对函数使用new语法,任何function都可以作为constructor创建新实例,但是如果function…","fields":{"slug":"/Blog/恶趣味构造函数/"},"id":"3857c34c-ce84-55fb-b2d4-db2cf3baf44a","frontmatter":{"date":"October 29, 2018","title":"恶趣味构造函数"}}},{"node":{"excerpt":"typeof instanceof typeof typeof可以用来测试变量的类型,语法是typeof myVariable,返回值为变量类型的字符串。一般来说,基本类型会返回描述基本类型的字符串,而对象则返回'object'字符串,但是有…","fields":{"slug":"/Blog/typeof与instanceof/"},"id":"f9508ca1-1b79-5469-8dc1-7e60ca32e787","frontmatter":{"date":"October 22, 2018","title":"typeof与instanceof"}}},{"node":{"excerpt":"高阶函数 Array.prototype.forEach Array.prototype.map Array.prototype.filter Array.prototype.every Array.protytype.some Array.protytype.reduce…","fields":{"slug":"/Blog/几个JS高阶函数的简单底层实现/"},"id":"2b10b427-cc23-5c7e-829e-2da304fb0796","frontmatter":{"date":"October 07, 2018","title":"几个JS高阶函数的简单底层实现"}}},{"node":{"excerpt":"date: 2018-10-03 一点微小差别 为什么 结论 参考文献 一点微小差别 indexOf 和 includes 都可以用来判断数组是否包含某个元素,二者到底有什么区别呢?看一个例子: 为什么 二者内部使用的算法不同: indexof…","fields":{"slug":"/Blog/array.indexof和array.includes/"},"id":"f34e0db1-4140-59a5-9355-c4721c9fc774","frontmatter":{"date":"October 03, 2018","title":"array.indexOf和array.includes"}}},{"node":{"excerpt":"title: 'IEEE-754标准与JS中的number类型' 引子: 0.1+0.2===0.3 ? Number类型的二进制表示 二进制小数与二进制科学记数法 IEEE-754双精度浮点数 存储结构 计算方法 特殊情况 浮点数的误差 十进制转浮点数 舍入 0.1+0.…","fields":{"slug":"/Blog/IEEE-754标准与JS中的number类型/"},"id":"2f6626d8-952d-54a8-8347-6e0ca34b51ae","frontmatter":{"date":"October 01, 2018","title":"IEEE-754标准与JS中的number类型"}}},{"node":{"excerpt":"date: 2018-09-21 基本类型隐式转换 基本类型转换为Boolean类型 基本类型转换为String类型 基本类型转换为Number类型 对象隐式转换为基本类型 基本类型隐式转换 基本类型转换为Boolean类型 隐式转换相当于调用Boolean(value…","fields":{"slug":"/Blog/JS中的隐式转换/"},"id":"03287e36-0dba-56a1-b4f5-a1090bd5b8e6","frontmatter":{"date":"September 21, 2018","title":"JS中的隐式转换"}}},{"node":{"excerpt":"date: 2018-09-18 引子 +操作符规则 题目解析 引子 JavaScript上手快…","fields":{"slug":"/Blog/加法操作符/"},"id":"59936140-86b7-5f18-8570-44d5f3e9c4ef","frontmatter":{"date":"September 18, 2018","title":"加法操作符"}}},{"node":{"excerpt":"引子 操作符运算规则 全等操作符判定规则 - Strict Equality Comparison(SEC) 相等操作符判定规则 - Abstract Equality Comparison(AEC) 对象转换基本类型规则 - Object To Primitive(OTP…","fields":{"slug":"/Blog/相等操作符/"},"id":"370dd3a5-9614-5664-be9d-c20ad770a15a","frontmatter":{"date":"September 15, 2018","title":"相等操作符"}}},{"node":{"excerpt":"--先挖坑,有时间再填-- 超简单服务器 20 秒 done(只用于数据测试) 自定义 API route 复杂 API 模拟服务器实现 结合 Fake.js 实现随机数据 API 模拟服务器","fields":{"slug":"/Blog/使用json-server搭建API模拟服务器/"},"id":"896f075f-3140-5c6c-a524-4241bdb18731","frontmatter":{"date":"May 29, 2018","title":"使用json-server搭建API模拟服务器"}}},{"node":{"excerpt":"问题描述 列表 FlatList 直接放在 View 里面,无法 pull to refresh 原因排查 因为 FlatList 基于 ScrollView 和 VirtualizedList 封装,查看了 ScrollView 的官方文档说明 Keep in mind…","fields":{"slug":"/Blog/FlatList和ScrollView的一个小问题/"},"id":"fbe672a3-1f5b-5580-8441-38065ff3de58","frontmatter":{"date":"May 19, 2018","title":"使用FlatList(ScrollView)的一个小问题"}}},{"node":{"excerpt":"date: 2018-05-15 问题描述 排查过程 CST & GMT 冷知识 问题解决 反思 问题描述 今天偶然发现了一个问题,JAVA 后台返回的时间字符串解析后居然比原始数据差了 14 个小时 后台时间字符串:Thu Feb 17 16:31:52 CST 201…","fields":{"slug":"/Blog/CST与GMT的差别/"},"id":"397d76da-580b-54f8-a699-682d12826d62","frontmatter":{"date":"May 15, 2018","title":"CST与GMT的差别"}}},{"node":{"excerpt":"问题出现 APP 某个页面加载时访问了 2 个 API,两者的返回数据都分别有type字段,用于区分对应的数据列表中项目的类别,前端界面再根据类别渲染不同的界面 这个时候问题出现了,第一个 API 一切正常,第二个 API 返回列表本应全是type=…","fields":{"slug":"/Blog/一次搞笑而深刻的bug调试/"},"id":"5b0f3306-22a6-5439-885c-4b40b7b0debd","frontmatter":{"date":"May 04, 2018","title":"一次搞笑而深刻的bug调试"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/如何判断日期是否为今天/"},"id":"fcb9d14b-f410-5d3e-bd9e-5af1f2d34019","frontmatter":{"date":"May 04, 2018","title":"如何判断日期是否为今天"}}},{"node":{"excerpt":"相同点 均为基本类型 都属于“假值”,用Boolean()转换类型后都为false 使用==进行比较时,二者相等 看 2 个可能会遇到的情况: 例 1 中,这几个值在 if 语句中都会被隐式转换为boolean类型,而且恰好都为假值,取反之后均为真,因此 三个 if…","fields":{"slug":"/Blog/null和undefined的比较/"},"id":"aede8ad6-3f0c-5cad-aa35-6b731fbaed2c","frontmatter":{"date":"May 03, 2018","title":"null和undefined的比较"}}},{"node":{"excerpt":"照例挖坑","fields":{"slug":"/Blog/JavaScript前端RSA加密/"},"id":"f0205ecb-fbdb-50a5-b0f3-7e5964c32191","frontmatter":{"date":"May 02, 2018","title":"JavaScript前端RSA加密"}}},{"node":{"excerpt":"挖坑,等填 调试 REST API 遇到的问题\n用户密码加密后,还要再经过一边 URL 加密\nencodeURIComponent","fields":{"slug":"/Blog/JavaScript编码URL/"},"id":"df6bd36a-4bd1-5dcb-988c-2d3bffe11ec0","frontmatter":{"date":"May 01, 2018","title":"JavaScript编码URL"}}},{"node":{"excerpt":"挖坑待填","fields":{"slug":"/Blog/normalizr扁平化递归结构的json/"},"id":"f5930753-9030-5e83-bc82-027553933968","frontmatter":{"date":"April 23, 2018","title":"normalizr扁平化递归结构的json"}}},{"node":{"excerpt":"不会自己搭mock server的前端不是好前端。 后台开发和前端开发不能完全实现同步,一直停下等后台是要出问题的。\n于是基于json-server搭了一个 API 本地测试服务器,却遇到了一个莫名其妙但极其简单的问题,简单记录一下,避免以后二次踩坑。 TL;DR Android…","fields":{"slug":"/Blog/Android模拟器访问本地web服务的url/"},"id":"e7c733d6-aec8-54d0-8303-505a775565a2","frontmatter":{"date":"March 29, 2018","title":"Android模拟器访问本地web服务的url"}}},{"node":{"excerpt":"RN 也用了小一段时间了,之前都着重实现功能+赶工期,交互体验方面基本无暇顾及。 最近项目周期不算太紧,于是小小试验了一下 Animated 的 API,模拟器上的效果还不错。\n简单记录一下 API 的内容,以后备查:\n---先挖坑,以后再填--- 组件 自带的有Animated…","fields":{"slug":"/Blog/RN Animated API使用/"},"id":"c76cf011-e5be-5b68-8ee3-0fd86675f13d","frontmatter":{"date":"March 29, 2018","title":"RN Animated API使用"}}},{"node":{"excerpt":"StackNavigator 在navigationOptions里修改headerStyle TabNavigator 在tabBarOptions修改style 代码 最好在navigator定义时设置navigationOptions…","fields":{"slug":"/Blog/React-Navigation中去掉header下的阴影/"},"id":"d540c216-50da-5bcc-a8a7-d6f73fee29b1","frontmatter":{"date":"March 18, 2018","title":"React-Navigation中去掉header下的阴影"}}},{"node":{"excerpt":"有时候需要键盘遮挡住屏幕的一部分,有时候不需要,可以配置android\\app\\src\\main\\AndroidManifest.xml文件 android:windowSoftInputMode=\"adjustResize\"可以让键盘推起页面 android…","fields":{"slug":"/Blog/Android键盘遮挡问题/"},"id":"1a5a2f8f-5c1c-58c2-8cfe-0bcd3bfbb64c","frontmatter":{"date":"March 14, 2018","title":"Android键盘遮挡问题"}}},{"node":{"excerpt":"安卓下又报了个错误 Native module SplashScreenModule tired to override SplashScreenModule for module name SplashScreenModule. If this was your…","fields":{"slug":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/"},"id":"743e7946-0a7f-5e1c-b5fe-f4deea4abfa4","frontmatter":{"date":"March 13, 2018","title":"Native Module xxx tried to override xxx native module错误解决办法"}}},{"node":{"excerpt":"splash-screen 这个 RN 插件挺好用的,升级之后启动 Android 版 APP 就闪退\n查了 issue 之后发现是文档没更新,在按照说明操作之后,还需要做额外调整: 插件 github 地址 MainActivity.java…","fields":{"slug":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/"},"id":"ce2b210d-bf2d-54d6-9c14-1820e4be885d","frontmatter":{"date":"March 13, 2018","title":"RN0.53+react-native-splash-screen3.0.1,Android启动闪退"}}},{"node":{"excerpt":"需要覆盖 tabbar component 如果是 bottom 模式,就需要覆盖 tabbarBottom 如果是 top 模式,就需要覆盖该 tabbarTop 参考这里","fields":{"slug":"/Blog/实现自定义tabbar component/"},"id":"16a13c24-9ba6-5b59-a5ed-006fa77c6301","frontmatter":{"date":"March 13, 2018","title":"实现自定义tabbar component"}}},{"node":{"excerpt":"bottom 模式的 tabBar 也出现了 indicator(就是选中某个 tabbar icon 的时候,出现的那根线,一般是出现在 top 模式下的)\n感觉很烦人,想去掉,开始自然想到把这根线调为透明 发现不管用。 查了一下 issue,发现了下面这个解决方案: 搞定!","fields":{"slug":"/Blog/React-Navigation中tabNavigator去掉指示线/"},"id":"c46bf79c-2d86-54de-9e3a-0c891c301e7f","frontmatter":{"date":"March 12, 2018","title":"React-Navigation中tabNavigator去掉指示线"}}},{"node":{"excerpt":"问题: 创建 APP 代码完整框架的时候,因为升级到了 2.x 版本的antd-mobile,报了下面错误 但是运行时出现依赖 react-dom 的错误 \"Unable to resolve module react-dom from /Users/xiesubin…","fields":{"slug":"/Blog/antd-mobile引用错误解决办法/"},"id":"3c88f723-4d0b-55db-afd2-3f229841b66f","frontmatter":{"date":"March 09, 2018","title":"antd-mobile引用错误解决办法"}}},{"node":{"excerpt":"更新:\n换了 0.53 版本的 RN,目前 android 遇到的,而且只有模拟器,真机调试都不会有以下问题 现象: 直接打开调试会找 10.0.2.2:8081/debugger-ui/,但是这个地址并不能连接成功 解决方法: 手动修改地址为http://localhost…","fields":{"slug":"/Blog/RN0.53找不到remote debugger解决方案/"},"id":"746c6106-0b82-5e9f-960d-88e1a9763b83","frontmatter":{"date":"March 08, 2018","title":"RN0.53找不到remote debugger解决方案"}}},{"node":{"excerpt":"RN 版本升级太快,现在以指定版本的 RN 重构老 APP 用 init 创建的格式如下 react-native init yourProject --version react-native@0.53","fields":{"slug":"/Blog/react-native-init以指定版本创建project/"},"id":"ef22f3c3-d5bb-5bc5-9a46-b89a952b9361","frontmatter":{"date":"March 07, 2018","title":"react-native-init以指定版本创建project"}}},{"node":{"excerpt":"StackNavigator 自带了 navigationOptions 属性,但必须以静态对象申明 实现有 3 个要点: navigationOptions 对象里,创建{param}常量,然后 headerLeft 或者 headerRight…","fields":{"slug":"/Blog/StackNavigator Header增加“返回”按钮/"},"id":"02af43cc-b90b-5167-9a31-fa325b4d0cdc","frontmatter":{"date":"September 26, 2017","title":"StackNavigator Header增加“返回”按钮"}}},{"node":{"excerpt":"页面用了 stackNavigator,header left 加了一个 button,header titleStyle 也设置了居中 iOS 下没有问题,但是在 Android 下发现 title 向右偏移 系统版本 RN 0.47.2 NODE 8.4 NPM 4.6.…","fields":{"slug":"/Blog/header title在Android下不居中问题的解决技巧/"},"id":"71c8f3ae-0ce7-5539-ac52-d167b9625a0d","frontmatter":{"date":"September 22, 2017","title":"header title在Android下不居中问题的解决技巧"}}},{"node":{"excerpt":"最近开始用 RN 做项目,第一步当然是搭建开发环境,不过 RN 的环境搭建真是一件要命的事情,不熟悉的话会折腾很久的。 windows 下环境搭建 Mac 下环境搭建 从项目代码开始构建","fields":{"slug":"/Blog/搭建RN开发环境/"},"id":"3facfde5-dfed-54ef-8348-7f5817fbc5b4","frontmatter":{"date":"August 31, 2017","title":"搭建RN开发环境"}}},{"node":{"excerpt":"Dan Abramov 在 2018-11-24 发了一系列推文是说明 React 的本质。他提到 Virtual DOM 这个词该退休了,这个词并没有说清楚 React 到底是什么。React 本质是“UI 类型”,和 JS…","fields":{"slug":"/Blog/The Virtual DOM阅读笔记/"},"id":"49d45663-8fe9-5dc1-8ba3-2f4b668d4f0a","frontmatter":{"date":"August 22, 2017","title":"The Virtual DOM阅读笔记"}}}]}},"pageContext":{}}} \ No newline at end of file diff --git "a/page-data/Blog/parameter\344\270\216argument/page-data.json" "b/page-data/Blog/parameter\344\270\216argument/page-data.json" new file mode 100644 index 0000000..9b1262d --- /dev/null +++ "b/page-data/Blog/parameter\344\270\216argument/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/parameter与argument/","result":{"data":{"markdownRemark":{"id":"ca6f475d-7f00-5394-afc8-39723c3f2219","excerpt":"以前一直迷迷糊糊的,parameter 和 argument,形参和实参,这 2 个概念中英文完全对不上,现在终于弄清楚了 parameter: 函数声明中用来占位的参数名,中译“形参” 其实它就是 placeholder,翻译成“参数占位符”更容易理解 argument…","html":"

以前一直迷迷糊糊的,parameter 和 argument,形参和实参,这 2 个概念中英文完全对不上,现在终于弄清楚了

\n
    \n
  • parameter: 函数声明中用来占位的参数名,中译“形参”
    \n其实它就是 placeholder,翻译成“参数占位符”更容易理解
  • \n
  • argument: 函数调用时候真实传入的参数,中译“实参”
  • \n
\n

---------------------EOF---------------------

","frontmatter":{"date":"November 21, 2018","title":"parameter与argument","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/parameter与argument/","previous":{"fields":{"slug":"/Blog/恶趣味构造函数/"},"frontmatter":{"title":"恶趣味构造函数"}},"next":{"fields":{"slug":"/Blog/译-写给恐龙的现代Javascript指南/"},"frontmatter":{"title":"[译]写给恐龙的现代Javascript指南"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/php\350\260\203\345\217\202\344\274\230\345\214\226\345\260\217\350\256\260/page-data.json" "b/page-data/Blog/php\350\260\203\345\217\202\344\274\230\345\214\226\345\260\217\350\256\260/page-data.json" new file mode 100644 index 0000000..0cd7948 --- /dev/null +++ "b/page-data/Blog/php\350\260\203\345\217\202\344\274\230\345\214\226\345\260\217\350\256\260/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/php调参优化小记/","result":{"data":{"markdownRemark":{"id":"3a2dc2b4-0203-51bf-8d4c-ea89d1021dcb","excerpt":"","html":"","frontmatter":{"date":"April 28, 2020","title":"php调参优化小记","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/php调参优化小记/","previous":{"fields":{"slug":"/Blog/国际化和本地化初步/"},"frontmatter":{"title":"国际化和本地化初步"}},"next":{"fields":{"slug":"/Blog/Intro to Functional Programming/"},"frontmatter":{"title":"Intro to Functional Programming"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/react-native-init\344\273\245\346\214\207\345\256\232\347\211\210\346\234\254\345\210\233\345\273\272project/page-data.json" "b/page-data/Blog/react-native-init\344\273\245\346\214\207\345\256\232\347\211\210\346\234\254\345\210\233\345\273\272project/page-data.json" new file mode 100644 index 0000000..3b39f06 --- /dev/null +++ "b/page-data/Blog/react-native-init\344\273\245\346\214\207\345\256\232\347\211\210\346\234\254\345\210\233\345\273\272project/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/react-native-init以指定版本创建project/","result":{"data":{"markdownRemark":{"id":"ef22f3c3-d5bb-5bc5-9a46-b89a952b9361","excerpt":"RN 版本升级太快,现在以指定版本的 RN 重构老 APP 用 init 创建的格式如下 react-native init yourProject --version react-native@0.53","html":"

RN 版本升级太快,现在以指定版本的 RN 重构老 APP
\n用 init 创建的格式如下
\nreact-native init yourProject --version react-native@0.53

","frontmatter":{"date":"March 07, 2018","title":"react-native-init以指定版本创建project","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/react-native-init以指定版本创建project/","previous":{"fields":{"slug":"/Blog/StackNavigator Header增加“返回”按钮/"},"frontmatter":{"title":"StackNavigator Header增加“返回”按钮"}},"next":{"fields":{"slug":"/Blog/RN0.53找不到remote debugger解决方案/"},"frontmatter":{"title":"RN0.53找不到remote debugger解决方案"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/scroll\344\272\213\344\273\266\350\270\251\345\235\221\350\256\260\345\275\225/page-data.json" "b/page-data/Blog/scroll\344\272\213\344\273\266\350\270\251\345\235\221\350\256\260\345\275\225/page-data.json" new file mode 100644 index 0000000..4742588 --- /dev/null +++ "b/page-data/Blog/scroll\344\272\213\344\273\266\350\270\251\345\235\221\350\256\260\345\275\225/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/scroll事件踩坑记录/","result":{"data":{"markdownRemark":{"id":"0b6bd893-0d6b-514d-ad4a-160327e1f97d","excerpt":"背景 使用Vue重构一个jQuery的H5/PC页面,一个列表组件实现滚动加载更多的时候踩了个坑。 现象 没有触发滚动\n开始是把滚动事件绑定在列表组件的父级元素,然后发现无论如何都无法触发滚动事件 实现父元素滚动的布局导致了刘海屏下的一个兼容性bug\n让html和body…","html":"

背景

\n

使用Vue重构一个jQuery的H5/PC页面,一个列表组件实现滚动加载更多的时候踩了个坑。

\n

现象

\n
    \n
  • 没有触发滚动\n开始是把滚动事件绑定在列表组件的父级元素,然后发现无论如何都无法触发滚动事件
  • \n
  • 实现父元素滚动的布局导致了刘海屏下的一个兼容性bug\n让html和body的高度都为屏高,父元素继承body高度也撑满body,监听父元素的滚动事件。
  • \n
\n

这个布局方式导致safe-area区域不能跟随滚动消失,始终占据了屏幕的底部位置

\n

原因

\n

先说第一个现象的原因

\n

scroll事件冒泡原理

\n
    \n
  • \n

    一般页面元素的scroll事件和普通事件不同,没有事件冒泡过程

    \n

    \n \n \n \n \n

    \n

    也就是在上图的4就结束了,只经过事件捕获 -> 事件触发,没有事件冒泡的过程,之前监听父元素的事件委托做法是行不通的。

    \n
  • \n
  • \n

    来自document元素的scroll事件可以冒泡

    \n

    由于其自身已经是顶层元素了,所以这个场景下事件冒泡与否已经失去了意义。

    \n
  • \n
  • 具体可以参考这篇文章,写的很清楚
  • \n
\n

如何处理scroll事件

\n

确认监听scroll事件目标元素

\n

首先要明确开发功能的目标是在那个元素监听scroll事件。

\n

比如上面提到safe-area的bug,要让safe-area跟随scroll事件收起和展开,需要监听document元素的滚动事件。

\n

但是其他情况,也许不需要在document元素上监听。比如网页内有个固定高度的table元素,要监听他的内部滚动事件,可以只监听table的scroll事件。

\n

具体监听哪个元素的scroll事件,要根据功能目标来确定。这是思考的出发点。

\n

如何判断绑定正确或错误

\n

在明确监听元素之后,再来观察是否监听到了正确的元素。可以通过以下方法来判断(此处以chrome为例子):

\n
    \n
  • devTool - Performance,点击Record开始录制
  • \n
  • 滚动页面
  • \n
  • 结束录制
  • \n
  • 点击Event Log,搜索框内输入scroll,在最右侧就能看到scroll事件绑定的元素
  • \n
  • 确认绑定元素是否为目标元素即可
  • \n
\n

如下图所示:

\n

\n \n \n \n \n

\n

绑定document的处理

\n

需要在Vue的生命周期钩子函数中绑定和解绑scroll事件,考虑到H5页面,因此追加了passive属性

\n
...\nmounted(){\n    window.addEventListener('scroll', this.handleScroll, {passive: true});\n},\ndestroyed(){\n    window.addEventListener('scroll', this.handleScroll, {passive: true});\n}
\n

绑定页面元素的处理

\n

可以在目标元素上绑定scroll事件,同时使用passive属性提高移动端滚动体验

\n
<div @scroll.passive=\"handleScroll\">
\n

元素对应的CSS中要增加overflow-y: scroll或者overflow-y: auto的设置

\n

其他兼容性处理

\n

-webkit-overflow-scrolling: touch

\n

对iOS来说,为了避免滚动卡顿,还需要在滚动的目标元素上设置-webkit-overflow-scrolling: touch,开启硬件加速,提升用户体验

\n

Done

","frontmatter":{"date":"May 25, 2020","title":"scroll事件踩坑记录","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/scroll事件踩坑记录/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.every/"},"frontmatter":{"title":"手写Array.prototype.every"}},"next":{"fields":{"slug":"/Blog/background-image踩坑/"},"frontmatter":{"title":"background-image踩坑"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/shell\350\204\232\346\234\254\345\220\210\345\271\266csv\346\226\207\344\273\266/page-data.json" "b/page-data/Blog/shell\350\204\232\346\234\254\345\220\210\345\271\266csv\346\226\207\344\273\266/page-data.json" new file mode 100644 index 0000000..f95f940 --- /dev/null +++ "b/page-data/Blog/shell\350\204\232\346\234\254\345\220\210\345\271\266csv\346\226\207\344\273\266/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/shell脚本合并csv文件/","result":{"data":{"markdownRemark":{"id":"d0c5b21d-fd38-5c8f-a2bf-86402ef3440c","excerpt":"","html":"","frontmatter":{"date":"April 26, 2020","title":"shell脚本合并csv文件","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/shell脚本合并csv文件/","previous":{"fields":{"slug":"/Blog/web图片优化初步/"},"frontmatter":{"title":"web图片优化初步"}},"next":{"fields":{"slug":"/Blog/国际化和本地化初步/"},"frontmatter":{"title":"国际化和本地化初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/typeof\344\270\216instanceof/page-data.json" "b/page-data/Blog/typeof\344\270\216instanceof/page-data.json" new file mode 100644 index 0000000..c58c43a --- /dev/null +++ "b/page-data/Blog/typeof\344\270\216instanceof/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/typeof与instanceof/","result":{"data":{"markdownRemark":{"id":"f9508ca1-1b79-5469-8dc1-7e60ca32e787","excerpt":"typeof instanceof typeof typeof可以用来测试变量的类型,语法是typeof myVariable,返回值为变量类型的字符串。一般来说,基本类型会返回描述基本类型的字符串,而对象则返回'object'字符串,但是有…","html":"\n

typeof

\n

typeof可以用来测试变量的类型,语法是typeof myVariable,返回值为变量类型的字符串。一般来说,基本类型会返回描述基本类型的字符串,而对象则返回'object'字符串,但是有2个例外。
\n下表简单测试了一下几个浏览器的控制台输出。

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
参数类型ChromeFirefoxEdgeIE11
typeof atypeof atypeof atypeof a
var a=1'number''number''number''number'
var a='1''string''string''string''string'
var a=null'object''object''object''object'
var a=undefined'undefined''undefined''undefined''undefined'
var a=true'boolean''boolean''boolean''boolean'
var a=Symbol('1')'symbol''symbol''symbol'不支持Symbol类型
var a={}'object''object''object''object'
var a=new Object()'object''object''object''object'
var a=[]'object''object''object''object'
var a=new Array()'object''object''object''object'
var a=function(){}'function''function''function''function'
var a=()=>{}'function''function''function'不支持箭头函数
\n
\n

例外
\n1.基本类型null的typeof返回值为'object',这是js里著名的一个bug
\n2.函数也是对象的一种,但是所有浏览器都单独返回'function'的具体类型,而不仅仅是'object'

\n
\n

因为例外1和2的存在,判断变量是否为对象时,至少要先检查变量是否为null以及变量是否为函数,否则会出错,比如下面这段代码就有bug:

\n
let a = null;\nlet b = ()=>{};\nfunction isObject(input){\n  if(typeof input == 'object'){\n    console.log('I am an object!');\n  }else{\n    console.log('I am not an object~');\n  }\n}\nisObject(a);//'I am an object!' \nisObject(b);//'I am not an object~'
\n

有2种方法可以修复这个bug,一种是增加判断,排除null,同时增加function的情况;还有一种是使用Object()方法进行类型转换。

\n
//方法1\nfunction isObject(input){\n  if(input !==null && \n  (typeof input === 'function' || typeof input == 'object')){\n    console.log('I am an object!');\n  }else{\n    console.log('I am not an object~');\n  }\n}\n//方法2\n//调用Object()方法,基本类型会转换为对应的包装类返回,null和undefined会变为空对象{},对象直接返回\nfunction isObject(input){\n  if(input === Object(input)){\n    console.log('I am an object!');\n  }else{\n    console.log('I am not an object~');\n  }\n}
\n

instanceof

\n

instanceof用来判断对象的类型

\n
    \n
  1. 有原型为null的情况\nObject(null) instanceof Object
  2. \n
  3. \n

    有跨框架情况

    \n\n
  4. \n
  5. \n

    跨框架解决方案

    \n
      \n
    • Object.prototype.toString.call(obj)
    • \n
    \n
  6. \n
","frontmatter":{"date":"October 22, 2018","title":"typeof与instanceof","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/typeof与instanceof/","previous":{"fields":{"slug":"/Blog/几个JS高阶函数的简单底层实现/"},"frontmatter":{"title":"几个JS高阶函数的简单底层实现"}},"next":{"fields":{"slug":"/Blog/恶趣味构造函数/"},"frontmatter":{"title":"恶趣味构造函数"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/web\345\233\276\347\211\207\344\274\230\345\214\226\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/web\345\233\276\347\211\207\344\274\230\345\214\226\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..758ab5d --- /dev/null +++ "b/page-data/Blog/web\345\233\276\347\211\207\344\274\230\345\214\226\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/web图片优化初步/","result":{"data":{"markdownRemark":{"id":"63ebd2f2-b369-595b-807b-870e37018de7","excerpt":"","html":"","frontmatter":{"date":"April 21, 2020","title":"web图片优化初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/web图片优化初步/","previous":{"fields":{"slug":"/Blog/web性能测试-locust/"},"frontmatter":{"title":"web性能测试-locust"}},"next":{"fields":{"slug":"/Blog/shell脚本合并csv文件/"},"frontmatter":{"title":"shell脚本合并csv文件"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/web\345\256\211\345\205\250\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/web\345\256\211\345\205\250\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..a98728c --- /dev/null +++ "b/page-data/Blog/web\345\256\211\345\205\250\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/web安全初步/","result":{"data":{"markdownRemark":{"id":"cf0f9da2-05aa-5aa6-9889-2513e1837ad5","excerpt":"","html":"","frontmatter":{"date":"April 02, 2020","title":"web安全初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/web安全初步/","previous":{"fields":{"slug":"/Blog/后端单元测试-service/"},"frontmatter":{"title":"后端单元测试-service"}},"next":{"fields":{"slug":"/Blog/后端单元测试-接入层请求mock/"},"frontmatter":{"title":"后端单元测试-接入层请求mock"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/web\346\200\247\350\203\275\344\274\230\345\214\226\346\214\207\346\240\207\350\247\243\346\236\220/page-data.json" "b/page-data/Blog/web\346\200\247\350\203\275\344\274\230\345\214\226\346\214\207\346\240\207\350\247\243\346\236\220/page-data.json" new file mode 100644 index 0000000..8db1830 --- /dev/null +++ "b/page-data/Blog/web\346\200\247\350\203\275\344\274\230\345\214\226\346\214\207\346\240\207\350\247\243\346\236\220/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/web性能优化指标解析/","result":{"data":{"markdownRemark":{"id":"28edb7f8-457f-5fe4-bd0b-a1406bec1de5","excerpt":"写在前面 1.sequence request - server responds - domContentLoaded - load Choose the metrics web.dev/user-centric-performance-metrics 2.1 Is there…","html":"

写在前面

\n

1.sequence

\n

request - server responds - domContentLoaded - load

\n
    \n
  1. Choose the metrics
  2. \n
\n

web.dev/user-centric-performance-metrics

\n

2.1 Is there content?

\n
    \n
  • \n

    Time to First Byte

    \n

    a) Time from when the browser requests a page to the first bye of the page being received

    \n

    b) Value = time to establish connection + 2*time to transmission + time for server respond

    \n
  • \n
  • \n

    First Paint

    \n

    a) time when the first pixel is painted on the screen

    \n

    b) value greater than TTFB, somewhere after domContentLoaded

    \n
  • \n
  • \n

    First Contentful Paint

    \n

    a) time when the first piece of content from the DOM is rendered

    \n

    b)

    \n

    2.2 is the content meaningful?

    \n
  • \n
  • \n

    Largest Contentful Paint

    \n

    a) successor to FMP, measures the time when the largest piece fo content whithin the viewport is rendered

    \n

    b) better than FMP

    \n
  • \n
  • \n

    Visually Complete

    \n

    a) time taken for the content within the viewport to be fully rendered

    \n

    b) longer than LCP

    \n
  • \n
  • \n

    Speed Index

    \n

    a) score of how quickly visual content is rendered within the viewport

    \n

    b)

    \n

    2.3 is the content interactable?

    \n
  • \n
  • \n

    First Input Delay

    \n

    a) delay between the time a user can attempt to interact with a part fo the site, and the time that the interface is able to respond to that interaction

    \n
  • \n
  • \n

    Max Potential First Input Delay

    \n

    a) maximum possible First Input Delay based on the duration of the longest task

    \n
  • \n
  • \n

    Total Blocking Time

    \n

    a) total duration of JavaScript tasks between the First Contentful Paint and Time to Interactive

    \n
  • \n
  • \n

    Time to Interactive

    \n

    a) time when the. main thread has had up to 5sec with no network activitiy or JavaScript tasks

    \n

    2.4 Are interactions smooth?

    \n
  • \n
  • \n

    Cumulative Layout Shift

    \n

    a) shifts in layout while a page is loading

    \n
  • \n
  • \n

    Frame Rate

    \n

    a) rate at which the browser can produce new frames in response to interactions and/or animations

    \n

    2.5 Example

    \n
  • \n
\n

e.g. News Website

\n
    \n
  • is there content? First Contentful Paint
  • \n
  • is the content meaningful? Largest Contentful Paint, Speed Index
  • \n
  • is the content intractable? Time to Interactive
  • \n
  • Are the interactions smooth? Cumulative Layout Shift
  • \n
  • Define a budget
  • \n
  • a performance budget defines specific values to your metrics that your site should never exceed.
  • \n
\n

e.g. News Website

\n
    \n
  • FCP < 1.5s
  • \n
  • LCP < 2s
  • \n
  • SI < 0.43
  • \n
  • TTI < 4s
  • \n
  • CLS<0.1
  • \n
\n

OR use competitors as a guide/baseline

\n
    \n
  1. Start measuring
  2. \n
  3. Lighthouse
  4. \n
  5. Calibre
  6. \n
","frontmatter":{"date":"April 12, 2020","title":"web性能优化指标解析","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/web性能优化指标解析/","previous":{"fields":{"slug":"/Blog/响应式图片优化/"},"frontmatter":{"title":"响应式图片优化"}},"next":{"fields":{"slug":"/Blog/web性能测试-locust/"},"frontmatter":{"title":"web性能测试-locust"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-jmeter/page-data.json" "b/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-jmeter/page-data.json" new file mode 100644 index 0000000..a3dda19 --- /dev/null +++ "b/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-jmeter/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/web性能测试-jmeter/","result":{"data":{"markdownRemark":{"id":"05374403-0fc9-576b-a1d5-76b27aa2e6f5","excerpt":"","html":"","frontmatter":{"date":"April 11, 2020","title":"web性能测试-jmeter","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/web性能测试-jmeter/","previous":{"fields":{"slug":"/Blog/web性能测试初步/"},"frontmatter":{"title":"web性能测试初步"}},"next":{"fields":{"slug":"/Blog/响应式图片优化/"},"frontmatter":{"title":"响应式图片优化"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-locust/page-data.json" "b/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-locust/page-data.json" new file mode 100644 index 0000000..931c0f2 --- /dev/null +++ "b/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225-locust/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/web性能测试-locust/","result":{"data":{"markdownRemark":{"id":"eb8cc83c-273e-5edc-baca-94c27f35e406","excerpt":"","html":"","frontmatter":{"date":"April 18, 2020","title":"web性能测试-locust","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/web性能测试-locust/","previous":{"fields":{"slug":"/Blog/web性能优化指标解析/"},"frontmatter":{"title":"web性能优化指标解析"}},"next":{"fields":{"slug":"/Blog/web图片优化初步/"},"frontmatter":{"title":"web图片优化初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..f22da57 --- /dev/null +++ "b/page-data/Blog/web\346\200\247\350\203\275\346\265\213\350\257\225\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/web性能测试初步/","result":{"data":{"markdownRemark":{"id":"a17a33c5-c83a-5c6e-859b-2d9cbed6a64c","excerpt":"","html":"","frontmatter":{"date":"April 08, 2020","title":"web性能测试初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/web性能测试初步/","previous":{"fields":{"slug":"/Blog/后端单元测试-数据库model/"},"frontmatter":{"title":"后端单元测试-数据库model"}},"next":{"fields":{"slug":"/Blog/web性能测试-jmeter/"},"frontmatter":{"title":"web性能测试-jmeter"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\344\270\200\344\270\252\345\205\263\344\272\216babel\347\232\204\346\204\232\350\240\242\345\260\217\351\224\231\350\257\257/page-data.json" "b/page-data/Blog/\344\270\200\344\270\252\345\205\263\344\272\216babel\347\232\204\346\204\232\350\240\242\345\260\217\351\224\231\350\257\257/page-data.json" new file mode 100644 index 0000000..a1e3a71 --- /dev/null +++ "b/page-data/Blog/\344\270\200\344\270\252\345\205\263\344\272\216babel\347\232\204\346\204\232\350\240\242\345\260\217\351\224\231\350\257\257/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/一个关于babel的愚蠢小错误/","result":{"data":{"markdownRemark":{"id":"aca42108-7c9b-5114-aa02-19dd68185375","excerpt":"TL;DR babel不会打包node_modules里的文件,所以引入组件时,必须用组件打包后的代码 问题描述 npm install安装了公司内部组件之后,使用时import了源文件,然后项目打包报错: ... UglifyJS unexpected token: punc…","html":"
\n

TL;DR

\n

babel不会打包node_modules里的文件,所以引入组件时,必须用组件打包后的代码

\n
\n

问题描述

\n

npm install安装了公司内部组件之后,使用时import了源文件,然后项目打包报错:

\n
\n

... UglifyJS unexpected token: punc <<(>> ....

\n
\n

开始一直觉得奇怪,google一下是UglifyJS不认识ES6的代码,ES6肯定是babel处理的,自然问题出在babel上。 然后捣鼓了快半个小时,又是配.babelrc,又是安装各种babel-plugin。徒劳无功。

\n

之后鼓起勇气,问了大佬,大佬一句话点醒梦中人: 为了加速打包,babel不会转译node_modules里的文件

\n

然后就没有然后了....

\n

babel不转译,那么源文件里的ES6语法就不会被转为ES5,而UglifyJS不认识ES6语法,所以打包报错...

\n

总结

\n

API dummy没有未来,自己还是太菜了,没有真正理解打包这个过程的真实含义,也没有理解很多webpack配置的背景。只是记住了怎么使用而已。一旦出现死记硬背场景之外的问题,就抓瞎了。

\n

当然,公司组件没有按照commonJS弄个index.js入口文件以方便引入还是很坑的,吐槽结束。

\n

技术进阶之路漫漫,我还要继续努力。

","frontmatter":{"date":"September 19, 2019","title":"一个关于babel的愚蠢错误","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/一个关于babel的愚蠢小错误/","previous":{"fields":{"slug":"/Blog/Sequelize和MySql时间格式小记/"},"frontmatter":{"title":"Sequelize和MySql时间格式小记"}},"next":{"fields":{"slug":"/Blog/PM2遇到的一个小问题/"},"frontmatter":{"title":"PM2遇到的一个小问题"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\344\270\200\346\254\241App\345\206\205\351\241\265\347\232\204bug\346\272\257\346\272\220/page-data.json" "b/page-data/Blog/\344\270\200\346\254\241App\345\206\205\351\241\265\347\232\204bug\346\272\257\346\272\220/page-data.json" new file mode 100644 index 0000000..d7b9e5a --- /dev/null +++ "b/page-data/Blog/\344\270\200\346\254\241App\345\206\205\351\241\265\347\232\204bug\346\272\257\346\272\220/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/一次App内页的bug溯源/","result":{"data":{"markdownRemark":{"id":"ce599e5a-c388-55a0-871f-53bed85780f6","excerpt":"写在前面 上一篇博客中提到的业务,这次引发了另一个bug 背景信息 上一次的H5页面上线有段时间了,客户端同学终于赶上了进度,把页面用到了App里更多的地方。 这次bug的主角是2个页面,一个列表页(以下简称L),一个详情页(以下简称D)。L由内嵌webview为容器,作为App…","html":"

写在前面

\n

上一篇博客中提到的业务,这次引发了另一个bug

\n

背景信息

\n

上一次的H5页面上线有段时间了,客户端同学终于赶上了进度,把页面用到了App里更多的地方。

\n

这次bug的主角是2个页面,一个列表页(以下简称L),一个详情页(以下简称D)。L由内嵌webview为容器,作为App一级页面tabView中的一个tab;点击L打开覆盖全屏的webview,展示D。很常见的一种App导航配置。

\n

需要说明一点,这次的2个页面都有CSRF校验。正是这个CSRF校验,诱发了后续的一系列bug。

\n

BUG排查过程

\n
    \n
  1. \n

    无意发现bug

    \n

    iOS开发哥们反馈L和D在iPad上有bug,聊着聊着突然发现,页面从L到D,随便点击D内一个按钮再返回,L里所有功能按钮点击统统报错。

    \n

    按钮的请求都有CSRF校验,当时很自然想到了应该是CSRF校验失败,否则很难解释这么大面积的功能失灵。

    \n

    结论:CSRF校验失败?

    \n
  2. \n
  3. \n

    CSRF校验失败

    \n

    抓包看了请求的返回数据,也麻烦搭档查了日志,确认是校验失败引起的bug。

    \n

    结论:确认CSRF校验失败

    \n
  4. \n
  5. \n

    只有iOS出现bug

    \n

    于是交给了搭档排查后台。我也不想闲着,试了试Android的页面,并没有像iOS一样出现bug。

    \n

    原因一目了然,Android 返回的时候,会重新请求页面,而iOS使用缓存,不会请求。

    \n

    到这步再一次确认了就是CSRF的问题,并且是因为页面跳转引起了CSRF token变化,而iOS仍然使用缓存的旧页面(token保存在页面meta字端内,即请求还是用旧token),所以无法通过校验以致报错。

    \n

    结论:页面切换导致CSRF token改变,iOS使用缓存所以无法通过校验

    \n
  6. \n
  7. \n

    跨webview跳转bug

    \n

    之前L页在另一个App三级入口,点击后在同一个webview内部跳转D页,再次返回L功能正常。而这次的bug出现在2个webview之间。初步看是因为跨webview有些信息没有传递过去,所以导致了CSRF token变化。

    \n

    结论:跨webview切换缺失数据,导致token变化

    \n
  8. \n
  9. \n

    试图手动共享token失败

    \n

    搭档的排查没有发现原因,但给了一条信息:token会存一个对应的key在cookie里,如果后台渲染页面时发现cookie中有这个key,就不会刷新token。

    \n

    当时也没细想,觉得既然如此,那么跳转页面的时候把key写入local storage,D页面加载时再取出并写入cookie就可以了。居然丝毫没发现这个做法逻辑上的漏洞。

    \n

    很自然的,失败了。

    \n

    抓包数据发现不论怎么写,D页面加载时cookie里都没有这个key。再一想,在回写cookie的时候页面都已经加载,怎么会有效果...更不要说只从L页写local storage,这个key在以后被D页取出的时候很可能存在过期的情况,毕竟D页自身可以刷新,还可能从其他页面跳转过来,并非只有L->D一种路径。

    \n

    要想生效,那么必须在D页请求之前,cookie中就有这个key。这个目标只能靠客户端实现了。

    \n

    死路一条,放弃。

    \n

    结论:web端手段受限,cookie只能被共享给D页,否则页面总会发起一次新请求刷新token

    \n
  10. \n
  11. \n

    共享cookie带来的矛盾

    \n

    抓包继续看,发现D页加载时cookie里没有key,随后请求接口时cookie里key出现了,说明key是页面加载时新请求到的。这个key和L页的不一样。但是从D返回L时,二者的key相同了。说明某个时候,D修改了L的cookie,或者更进一步假设,D修改了cookie,因为cookie二者共享,所以L的cookie也变化了。

    \n

    但马上就可以发现一个新的矛盾:

    \n
      \n
    • 矛盾1:既然共享cookie,为什么D加载时没有key?
    • \n
    • 矛盾2:如果不共享cookie,为什么其他字段都一样,而且D的key变化后能同步给L?
    • \n
    \n

    假设不共享,那么谁改动了cookie?是web后台还是客户端?什么时候改动的?

    \n

    考虑L页的iOS缓存,正常情况下web后台唯一写cookie的时机是在D页加载时,因为此时D页cookie中没有key这个字段。再次返回L页因为缓存缘故,并没有任何网络请求,没有改变cookie的机会。那么只能是客户端有动作了。

    \n

    但这个假设又有挥之不去的另一个矛盾,全过程中除了key之外的字段都是一样的,没理由通过代码全部手工写入。那么这又如何解释呢?感觉好迷。

    \n

    结论:cookie共享?不共享?

    \n
  12. \n
  13. \n

    chrome再现bug场景,发现webview有问题

    \n

    客户端调试手段受限,还是本能希望在浏览器上做调试。

    \n

    组内大佬提醒,chrome隐身模式不共享cookie的。那么普通模式打开一个L页面,隐身模式打开一个D页面,用来模拟cookie不共享的状态。

    \n

    很奇怪的事情出现了,隐身模式和普通模式页面都能正常的工作,彼此并不影响。于是根据这个结果,可以排除cookie不共享的假设,只剩下cookie共享一种可能了。于是我把D的cookie内容全部复制到了L页,再次点击L页按钮,bug复现了。然后为了找到真正的原因,缩小覆盖的范围。

    \n

    最后发现,只要key被覆盖,L页的请求就会失效,并且提示信息和之前App上的一模一样。

    \n

    带着这个信息找搭档,他看了后台源代码后告诉我:CSRF校验过程中,后台有一个token池,cookie中的key能检索出对应的token。当页面请求携带的token跟检索出的token一致,就能通过校验。

    \n

    根本原因找到了:cookie肯定是共享的。但是由于某种原因,客户端在新开webview时没有把key传递过去,于是新webview请求了新的CSRF token-key键值对;又因为cookie共享,新key写入cookie,覆盖了旧key,于是使用缓存的iOS页面就拿着新key+旧token发起请求,自然无法通过验证。

    \n

    结论:只能是客户端webview的问题

    \n
  14. \n
  15. \n

    确认bug根源

    \n

    把以上信息反馈给客户端开发哥们,他们开始了排查。

    \n

    最后发现是一个历史遗留逻辑没有清理,新开webview时会先清空一次cookie,cookie同步机制不定时从NSCookieStorage取cookie,但不会同步key这个字段(当然即使同步了,因为存在不可控延迟,按照现有的了解,页面还是会重新请求token。这样经过同步,L和D总有一个页面会拿到新key+旧token,也就还是会出bug。只有保持cookie一直共享,才不会让后台返回新的key-token键值对)。于是就有了上面的bug。

    \n

    移除这个逻辑,保持cookie共享,问题就消除了。

    \n

    排查总耗时:断断续续花了2天半

    \n
  16. \n
\n

总结

\n

复盘下这个bug。

\n

首先,有内部沟通的问题。产品客户端规划这个页面的时候,没有和web端讨论,否则这个问题可能规划的时候就暴露出来了。其次,这种有安全验证写请求的web页面,似乎不太适合作为App内的一级页面,还是纯读请求的页面感觉更合适,至少风险会小些。最后,自己对web安全验证这一块的机制还是了解不够,早一点知道到key-token这种验证机制,排查出bug的时间应该会少很多。

\n

进阶路漫漫,继续学习

","frontmatter":{"date":"September 02, 2019","title":"一次App内页的bug溯源","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/一次App内页的bug溯源/","previous":{"fields":{"slug":"/Blog/CDN缓存不同步,一次线上调试的经历/"},"frontmatter":{"title":"CDN缓存不同步:一次线上调试的经历"}},"next":{"fields":{"slug":"/Blog/node开发遇到的一个小坑/"},"frontmatter":{"title":"node开发遇到的一个小坑"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\344\270\200\346\254\241\346\220\236\347\254\221\350\200\214\346\267\261\345\210\273\347\232\204bug\350\260\203\350\257\225/page-data.json" "b/page-data/Blog/\344\270\200\346\254\241\346\220\236\347\254\221\350\200\214\346\267\261\345\210\273\347\232\204bug\350\260\203\350\257\225/page-data.json" new file mode 100644 index 0000000..0a50ad8 --- /dev/null +++ "b/page-data/Blog/\344\270\200\346\254\241\346\220\236\347\254\221\350\200\214\346\267\261\345\210\273\347\232\204bug\350\260\203\350\257\225/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/一次搞笑而深刻的bug调试/","result":{"data":{"markdownRemark":{"id":"5b0f3306-22a6-5439-885c-4b40b7b0debd","excerpt":"问题出现 APP 某个页面加载时访问了 2 个 API,两者的返回数据都分别有type字段,用于区分对应的数据列表中项目的类别,前端界面再根据类别渲染不同的界面 这个时候问题出现了,第一个 API 一切正常,第二个 API 返回列表本应全是type=…","html":"

问题出现

\n
\n

APP 某个页面加载时访问了 2 个 API,两者的返回数据都分别有type字段,用于区分对应的数据列表中项目的类别,前端界面再根据类别渲染不同的界面

\n
\n

这个时候问题出现了,第一个 API 一切正常,第二个 API 返回列表本应全是type=1的数据类型,但是每次返回的第一条数据都是type=2

\n

调试

\n
    \n
  1. 很自然打开chrome devTool,打印并查看后台返回数据,嗯,返回的数据type=2,看来是后台问题可能性较大
  2. \n
  3. 再次确认,用postman请求一次接口看看返回数据,咦,怎么返回数据又对了,type=1,反复试了几次,还是对的
  4. \n
  5. 换了一个 API 测试工具,结果和 2 一样,看样子应该是前端的问题了,而且应该是网络层的问题,而网络层是基于 axios 封装的,也就是说 axios 有问题?
  6. \n
  7. 还是觉得需要首先排除后台原因,于是让后台同事打印出接口返回数据,对比之后发现和 API 工具结果一致,基本排除后端责任
  8. \n
  9. 深入到封装的网络层查看axios返回的数据,链式函数里淘宝,分别打印了response=>response.data,二者数据一致错误,数据 bug 复现
  10. \n
  11. 怀疑 axios 老版本不可靠,于是升级到最新版,继续测试,问题依旧
  12. \n
  13. 开始 axios 请求的头部是json,移植之前封装的另一版本网络层代码,头部使用arraybuffer, 解码后response的数据与后台一致了,\n但是response.data数据仍错误,因为二者间只多了一次JSON.parse,定位问题在JSON.parse
  14. \n
  15. 因为 JSON.parse 本身不会有问题,再次开始怀疑 bug 源于后端,返回的 json 字符串格式不标准导致解析错误,可用解析工具可以顺利解析出 json,这里没有问题
  16. \n
  17. 病急乱投医,怀疑 2 个接口同时请求有问题,于是注释第一个正常 API 的所有网络访问代码,返回结果一致,看来接口没有相关性,问题独立出现在第二个接口上
  18. \n
  19. 复制 API 调试工具的返回 json,同时网络层截断发往结果异常 API 接口的所有网络访问,把复制的 json 作为固定数据返回给\nresponse,错误依旧,问题确定位在前端了
  20. \n
  21. 把 10 中的 json 里的 type 属性改名为 mode,axios 解析的数据正常了
  22. \n
  23. 继续看 axios 封装内容,.then(response=>{...})同时打印response, JSON.parse(response.data), 数据又正确了,并且打印出数据一致。\n基本排除 axios 错误的可能性,那么就只剩下前端页面代码 bug 这一种可能性了,开始从网络层逐渐向应用层排查
  24. \n
  25. 最后可耻的在 reducer 里发现了自己写死的代码response[0].type = 2, 根源找到
  26. \n
\n

总耗时: 8 小时

\n

原因

\n

简单说就是 chrome 的 console.log 打印对象时,如果对象后续值被修改了,打印的值也会随之改变,除非打印时就立刻展开对象的所有属性

\n

stackoverflow找到了问题,这个问题(或者说 bug)起源于 webkit 的一个 bug stackoverflow问题地址

\n
\n

Excerpts from the original bug report ([https://bugs.webkit.org/show_bug.cgi?id=35801]):

\n

Description From mitch kramer 2010-03-05 11:37:45 PST

\n
    \n
  1. create an object literal with one or more properties
  2. \n
  3. console.log that object but leave it closed (don't expand it in the console)
  4. \n
  5. change one of the properties to a new value
  6. \n
\n

now open that console.log and you'll see it has the new value for some reason, even though it's value was different at the time it was generated.

\n

I should point out that if you open it, it will retain the correct value if that wasn't clear.

\n
\n

规避方法

\n
    \n
  • 创建对象的一个深拷贝,使它不受后续的影响, 比如把对象转成字符串再读取回来
  • \n
\n
JSON.parse(JSON.stringify(object));
\n
\n

应验了一句老话,眼见也未必为实,今天体会很深

\n
","frontmatter":{"date":"May 04, 2018","title":"一次搞笑而深刻的bug调试","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/一次搞笑而深刻的bug调试/","previous":{"fields":{"slug":"/Blog/如何判断日期是否为今天/"},"frontmatter":{"title":"如何判断日期是否为今天"}},"next":{"fields":{"slug":"/Blog/CST与GMT的差别/"},"frontmatter":{"title":"CST与GMT的差别"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\344\275\277\347\224\250Charles\346\212\223\345\214\205\347\247\273\345\212\250\347\253\257\347\275\221\347\273\234\350\257\267\346\261\202/page-data.json" "b/page-data/Blog/\344\275\277\347\224\250Charles\346\212\223\345\214\205\347\247\273\345\212\250\347\253\257\347\275\221\347\273\234\350\257\267\346\261\202/page-data.json" new file mode 100644 index 0000000..8f3be48 --- /dev/null +++ "b/page-data/Blog/\344\275\277\347\224\250Charles\346\212\223\345\214\205\347\247\273\345\212\250\347\253\257\347\275\221\347\273\234\350\257\267\346\261\202/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/使用Charles抓包移动端网络请求/","result":{"data":{"markdownRemark":{"id":"3a355e3e-4e71-5c85-a8f5-2598e81462bc","excerpt":"写在前面 这是4个月前的一篇简要工作记录,重新编辑整理了一下,算是自己技能成长的一个见证。 可以抓包移动端网络请求的工具很多,windows下有fiddler和wireshark,Mac下有Charlse和Surge for Mac(Surge iOS版甚至可以在iOS…","html":"

写在前面

\n

这是4个月前的一篇简要工作记录,重新编辑整理了一下,算是自己技能成长的一个见证。

\n

可以抓包移动端网络请求的工具很多,windows下有fiddler和wireshark,Mac下有Charlse和Surge for Mac(Surge iOS版甚至可以在iOS设备上直接抓包,功能非常强大)。

\n

因为目前使用Mac,所以本文主要介绍如何使用Charles在Mac上进行抓包。

\n
\n

注意: 以下全程,请保持电脑和手机在同一个局域网内

\n
\n

抓包普通请求

\n
\n

这部分iOS和Android方法类似,以iOS为例说明

\n
\n
    \n
  1. \n

    打开Charles代理设置窗口,点击 Proxy -> Proxy Settings

    \n

    \n \n \n \n \n

    \n
      \n
    • HTTP代理选手动配置
    • \n
    \n

    \n \n \n \n \n

    \n
      \n
    • 服务器配置为电脑的IP,端口设为之前charles配置的端口
    • \n
    \n

    \n \n \n \n \n

    \n
  2. \n
  3. \n

    允许手机连接charles

    \n

    这个时候随便访问一个网页,charles就会提示,选择“允许”

    \n

    \n \n \n \n \n

    \n

    \n \n \n \n \n

    \n
  4. \n
\n

之后手机上的任何http请求,都可以被charles抓包查看了,Done.

\n

抓包https请求

\n

上面的配置只能抓包http请求,但是现在主要网站大都是https的,请求数据会显示为乱码,不可读。需要额外配置让charles可以抓包https的请求。根据官网的说明,抓包https请求需要在手机上安装charles证书。

\n

为什么需要安装证书呢?官方的说明如下:

\n
\n

SSL Proxying

\n

Charles does this by becoming a man-in-the-middle. Instead of your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore you will see a security warning, indicating that the root authority is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings – see below for how to do this.

\n

Charles still communicates via SSL to the web server. The communication is SSL (encrypted) from web browser to Charles and also SSL (encrypted) from Charles to the web server.

\n
\n

这个抓包本质上是一种中间人攻击 (Man in the Middle Attack)。

\n

只不过单纯抓包并没有篡改数据,只是charles作为代理和服务端通信,然后转发数据和charles动态生成的证书给手机。如果不安装证书,手机浏览器会提示证书不可信,以存在安全风险为由,拒绝接受charles发回的数据。

\n

理论上,charles当然也可以篡改数据后再发给手机,似乎某些更高级的功能就是基于此实现的。这不是本文的主题了,以后有机会再写。

\n

废话结束,下面继续说明如何安装证书。

\n

安装证书

\n
Charles启用SSL代理功能
\n\n
手机端配置
\n
\n

证书安装在iOS和Android两端不同,手机端的配置分为两部分写

\n
\n
iOS
\n
    \n
  • \n

    手机Safari打开https://chls.pro/ssl这个网址下载证书

    \n

    \n \n \n \n \n

    \n
  • \n
  • \n

    根据提示下载证书,返回设置,在已下载描述文件中找到该证书

    \n

    \n \n \n \n \n

    \n
  • \n
  • \n

    安装证书

    \n

    \n \n \n \n \n

    \n
  • \n
  • \n

    关于本机开启信任证书

    \n

    \n \n \n \n \n

    \n
  • \n
  • \n

    happy抓包

    \n

    \n \n \n \n \n

    \n
  • \n
  • \n

    如果不开启信任证书

    \n

    \n \n \n \n \n

    \n
  • \n
  • \n

    如果安装失败,可以下载证书文件到本地,选择从存储设备安装(可以参考这篇

    \n
      \n
    • 坚果pro2: 设置 - 解锁与安全 - 高级设置 - 从存储设备安装,见上图
    • \n
    \n
  • \n
  • \n

    happy抓包

    \n

    \n \n \n \n \n

    \n
  • \n
\n

记录完毕,收工

","frontmatter":{"date":"September 07, 2019","title":"使用Charles抓包移动端网络请求","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/使用Charles抓包移动端网络请求/","previous":{"fields":{"slug":"/Blog/node开发遇到的一个小坑/"},"frontmatter":{"title":"node开发遇到的一个小坑"}},"next":{"fields":{"slug":"/Blog/移动端网页调试技巧/"},"frontmatter":{"title":"移动端网页调试技巧"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\344\275\277\347\224\250eslint+prettier+husky\350\247\204\350\214\203\351\241\271\347\233\256\344\273\243\347\240\201\351\243\216\346\240\274/page-data.json" "b/page-data/Blog/\344\275\277\347\224\250eslint+prettier+husky\350\247\204\350\214\203\351\241\271\347\233\256\344\273\243\347\240\201\351\243\216\346\240\274/page-data.json" new file mode 100644 index 0000000..c2d2c06 --- /dev/null +++ "b/page-data/Blog/\344\275\277\347\224\250eslint+prettier+husky\350\247\204\350\214\203\351\241\271\347\233\256\344\273\243\347\240\201\351\243\216\346\240\274/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/使用eslint+prettier+husky规范项目代码风格/","result":{"data":{"markdownRemark":{"id":"f46bbcb3-d0da-5e3e-ae88-8e967791e8df","excerpt":"写在前面 项目配置 ESLint eslint babel-eslint eslint-config-airbnb-base eslint-plugin-vue eslint-config-futu eslint-plugin-import, 不认识webpack…","html":"

写在前面

\n

项目配置

\n

ESLint

\n

eslint

\n

babel-eslint

\n

eslint-config-airbnb-base

\n

eslint-plugin-vue

\n

eslint-config-futu

\n

eslint-plugin-import, 不认识webpack别名 -> eslint-import-resolver-alias

\n

配置.eslint.js.eslintignore文件

\n

Prettier

\n

处理Prettier和ESLint的冲突

\n
\n

以下内容为Prettier官方文档的翻译

\n
\n
Disable formatting rules
\n

eslint-config-prettier is a config that disables rules that conflict with Prettier. Add it to your devDependencies, then extend from it within your .eslintrc configuration. Make sure to put it last in the extends array, so it gets the chance to override other configs.

\n
# yarn\nyarn add --dev eslint-config-prettier\n# npm\nnpm install --dev eslint-config-prettier
\n

Then in .eslintrc.json:

\n
{\n  \"extends\": [\"prettier\"]\n}
\n
Use ESLint to run Prettier
\n

eslint-plugin-prettier is a plugin that adds a rule that formats content using Prettier. Add it to your devDependencies, then enable the plugin and rule.

\n
yarn add --dev eslint-plugin-prettier
\n

Then in .eslintrc.json:

\n
{\n  \"plugins\": [\"prettier\"],\n  \"rules\": {\n    \"prettier/prettier\": \"error\"\n  }\n}
\n
Recommended configuration
\n

eslint-plugin-prettier exposes a \"recommended\" configuration that configures both eslint-plugin-prettier and eslint-config-prettier in a single step. Add both eslint-plugin-prettier and eslint-config-prettier as developer dependencies, then extend the recommended config:

\n
yarn add --dev eslint-config-prettier eslint-plugin-prettier
\n

Then in .eslintrc.json:

\n
{\n  \"extends\": [\"plugin:prettier/recommended\"]\n}
\n

LintStaged和Husky

\n

编辑器插件集成

\n

VSCode

\n

WebStorm

","frontmatter":{"date":"November 05, 2019","title":"使用eslint+prettier+husky规范项目代码风格","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/使用eslint+prettier+husky规范项目代码风格/","previous":{"fields":{"slug":"/Blog/Vue中v-if和v-show遇到的小问题/"},"frontmatter":{"title":"Vue中v-if和v-show遇到的小问题"}},"next":{"fields":{"slug":"/Blog/echarts使用小记/"},"frontmatter":{"title":"echarts使用小记"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\344\275\277\347\224\250json-server\346\220\255\345\273\272API\346\250\241\346\213\237\346\234\215\345\212\241\345\231\250/page-data.json" "b/page-data/Blog/\344\275\277\347\224\250json-server\346\220\255\345\273\272API\346\250\241\346\213\237\346\234\215\345\212\241\345\231\250/page-data.json" new file mode 100644 index 0000000..fb375d3 --- /dev/null +++ "b/page-data/Blog/\344\275\277\347\224\250json-server\346\220\255\345\273\272API\346\250\241\346\213\237\346\234\215\345\212\241\345\231\250/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/使用json-server搭建API模拟服务器/","result":{"data":{"markdownRemark":{"id":"896f075f-3140-5c6c-a524-4241bdb18731","excerpt":"--先挖坑,有时间再填-- 超简单服务器 20 秒 done(只用于数据测试) 自定义 API route 复杂 API 模拟服务器实现 结合 Fake.js 实现随机数据 API 模拟服务器","html":"

--先挖坑,有时间再填--

\n
    \n
  1. 超简单服务器 20 秒 done(只用于数据测试)
  2. \n
  3. 自定义 API route
  4. \n
  5. 复杂 API 模拟服务器实现
  6. \n
  7. 结合 Fake.js 实现随机数据 API 模拟服务器
  8. \n
","frontmatter":{"date":"May 29, 2018","title":"使用json-server搭建API模拟服务器","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/使用json-server搭建API模拟服务器/","previous":{"fields":{"slug":"/Blog/FlatList和ScrollView的一个小问题/"},"frontmatter":{"title":"使用FlatList(ScrollView)的一个小问题"}},"next":{"fields":{"slug":"/Blog/相等操作符/"},"frontmatter":{"title":"相等操作符"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\205\245\345\235\221TypeScript/page-data.json" "b/page-data/Blog/\345\205\245\345\235\221TypeScript/page-data.json" new file mode 100644 index 0000000..b986e01 --- /dev/null +++ "b/page-data/Blog/\345\205\245\345\235\221TypeScript/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/入坑TypeScript/","result":{"data":{"markdownRemark":{"id":"237ddafe-9bc6-5063-bc8d-24a25dfdd2d7","excerpt":"","html":"","frontmatter":{"date":"March 11, 2020","title":"入坑TypeScript","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/入坑TypeScript/","previous":{"fields":{"slug":"/Blog/自己实现Promise/"},"frontmatter":{"title":"自己实现Promise"}},"next":{"fields":{"slug":"/Blog/前端单元测试-Vue对象Mock/"},"frontmatter":{"title":"前端单元测试-Vue对象Mock"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\207\240\344\270\252JS\351\253\230\351\230\266\345\207\275\346\225\260\347\232\204\347\256\200\345\215\225\345\272\225\345\261\202\345\256\236\347\216\260/page-data.json" "b/page-data/Blog/\345\207\240\344\270\252JS\351\253\230\351\230\266\345\207\275\346\225\260\347\232\204\347\256\200\345\215\225\345\272\225\345\261\202\345\256\236\347\216\260/page-data.json" new file mode 100644 index 0000000..aed4a3d --- /dev/null +++ "b/page-data/Blog/\345\207\240\344\270\252JS\351\253\230\351\230\266\345\207\275\346\225\260\347\232\204\347\256\200\345\215\225\345\272\225\345\261\202\345\256\236\347\216\260/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/几个JS高阶函数的简单底层实现/","result":{"data":{"markdownRemark":{"id":"2b10b427-cc23-5c7e-829e-2da304fb0796","excerpt":"高阶函数 Array.prototype.forEach Array.prototype.map Array.prototype.filter Array.prototype.every Array.protytype.some Array.protytype.reduce…","html":"\n

高阶函数

\n

看了 FCC 的函数式编程章节才发现,原来 JS 里的几个高阶函数是典型的函数式编程思想的应用。不改变原值,总是返回新值以避免 side-effect。
\n有点好奇这些函数的底层是如何实现的,干脆练练手,全部自己尝试写一遍。暂时考虑写简化版,所以会略去异常处理部分的代码,实现全部使用 ES5 的语法。

\n

Array.prototype.forEach

\n
Array.prototype.simpleForEach = function(callback, thisArg) {\n  var length = this.length;\n  for (var i = 0; i < length; i++) {\n    callback.call(thisArg, this[i], i, this);\n  }\n};
\n

Array.prototype.map

\n
Array.prototype.simpleMap = function(callback, thisArg) {\n  var newArr = [];\n  var length = this.length;\n  for (var i = 0; i < length; i++) {\n    newArr.push(callback.call(thisArg, this[i], i, this));\n  }\n  return newArr;\n};
\n

Array.prototype.filter

\n
Array.prototype.simpleFilter = function(callback, thisArg) {\n  var newArr = [];\n  var length = this.length;\n  for (var i = 0; i < length; i++) {\n    if (callback.call(thisArg, this[i], i, this)) {\n      newArr.push(this[i]);\n    }\n  }\n  return newArr;\n};
\n

Array.prototype.every

\n
Array.prototype.simpleEvery = function(callback, thisArg) {\n  var length = this.length;\n  for (var i = 0; i < length; i++) {\n    if (!callback.call(thisArg, this[i], i, this)) {\n      return false;\n    }\n  }\n  return true;\n};
\n

Array.protytype.some

\n
Array.prototype.simpleSome = function(callback, thisArg) {\n  var length = this.length;\n  for (var i = 0; i < length; i++) {\n    if (callback.call(thisArg, this[i], i, this)) {\n      return true;\n    }\n  }\n  return false;\n};
\n

Array.protytype.reduce

\n
Array.prototype.simpleReduce = function(callback, initialVal) {\n  var accumulator,\n    length = this.length;\n  if (initialVal === undefined) {\n    //无初值:将首个元素赋给accumulator,并从index=1的元素开始循环\n    accumulator = this[0];\n    for (var i = 1; i < length; i++) {\n      accumulator = callback(accumulator, this[i], i, this);\n    }\n  } else {\n    //有初值:将initialVal赋给accumulator,从index=0的元素开始循环\n    accumulator = initialVal;\n    for (var i = 0; i < length; i++) {\n      accumulator = callback(accumulator, this[i], i, this);\n    }\n  }\n\n  return accumulator;\n};
","frontmatter":{"date":"October 07, 2018","title":"几个JS高阶函数的简单底层实现","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/几个JS高阶函数的简单底层实现/","previous":{"fields":{"slug":"/Blog/array.indexof和array.includes/"},"frontmatter":{"title":"array.indexOf和array.includes"}},"next":{"fields":{"slug":"/Blog/typeof与instanceof/"},"frontmatter":{"title":"typeof与instanceof"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\210\244\346\226\255\346\234\211\345\272\217\346\225\260\347\273\204B\346\230\257\345\220\246\344\270\272\346\234\211\345\272\217\346\225\260\347\273\204A\347\232\204\345\255\220\351\233\206/page-data.json" "b/page-data/Blog/\345\210\244\346\226\255\346\234\211\345\272\217\346\225\260\347\273\204B\346\230\257\345\220\246\344\270\272\346\234\211\345\272\217\346\225\260\347\273\204A\347\232\204\345\255\220\351\233\206/page-data.json" new file mode 100644 index 0000000..01c3233 --- /dev/null +++ "b/page-data/Blog/\345\210\244\346\226\255\346\234\211\345\272\217\346\225\260\347\273\204B\346\230\257\345\220\246\344\270\272\346\234\211\345\272\217\346\225\260\347\273\204A\347\232\204\345\255\220\351\233\206/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/判断有序数组B是否为有序数组A的子集/","result":{"data":{"markdownRemark":{"id":"f3cacb59-6c95-53db-9236-d7f8b347d42e","excerpt":"富途面试遇到的手写算法题:\n2 个有序数组 A 和 B,只含有数字,每个数组内的元素都有可能重复。请写一个函数,判断 B 是否为 A 的子集。如果是,返回 true;反之,返回 false…","html":"

富途面试遇到的手写算法题:\n2 个有序数组 A 和 B,只含有数字,每个数组内的元素都有可能重复。请写一个函数,判断 B 是否为 A 的子集。如果是,返回 true;反之,返回 false。\n要求:不能用内置函数,不能转换为字符串等等做间接比较,算法效率越高越好。

\n

题目分析

\n

典型的数组类问题,有序这个条件已经降低很多难度了,题目难度至多相当于 LC Medium 的题目。

\n

解题方法

\n

有序+数组比较,很自然两个思路:

\n
    \n
  • Two Pointers
  • \n
  • Binary Search
  • \n
\n

现场做的时候选的 1,有几个 corner case 没考虑到,面试官指出来之后放过我了。

\n

时间复杂度 O(n)\\ O(n) O(n), 空间复杂度 O(1)\\ O(1) O(1),简单说下思路:

\n
    \n
  1. 排除 corner case,B 为空,B 比 A 元素多,B 的元素范围超过 A 的范围等等;
  2. \n
  3. 2 个 pointer,分别从 A,B 的第一个元素开始
  4. \n
  5. A 的 pointer 一直前进,找和 B 当前相等的元素,直到找到或者抵达 A 的尾部
  6. \n
  7. 如果找到相同元素,2 个 pointer 同时前进一位
  8. \n
  9. 如果循环中 A 提前到达尾部,那么返回 false,如果 B 先到达尾部,跳出循环返回 true
  10. \n
\n

现场写的代码如下,十分丑陋:

\n
/**\n * @param {sorted src array} a\n * @param {sorted target array} b\n */\nvar isSubset = function isSubset(a, b) {\n  if (b.length == 0) return true;\n  if (b.length > a.length) return false;\n  var len1 = a.length,\n    len2 = b.length;\n  if (b[0] >= a[len1 - 1] || b[len2 - 1] <= a[0]) return false;\n  var p1 = 0,\n    p2 = 0;\n  while (true) {\n    while (a[p1] !== b[p2] && p1 < len1) p1++;\n    if (p1 == len1) return false;\n    p1++;\n    p2++;\n    if (p2 == len2) break;\n  }\n  return true;\n};
\n

其实可以写的更简单一点,这样理解就容易多了:

\n
var isSubset = function isSubset(a, b) {\n  if (b.length == 0) return true;\n  var p1 = 0,\n    p2 = 0;\n  while (p1 < a.length) {\n    if (b[p2] == a[p1]) {\n      p2++;\n      if (p2 == b.length) return true;\n    }\n    p1++;\n  }\n  return false;\n};
\n

Follow Up

\n

LC 有一道题和这个很类似([LeetCode 392] Is Subsequence)

","frontmatter":{"date":"March 12, 2019","title":"判断有序数组B是否为有序数组A的子集","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/判断有序数组B是否为有序数组A的子集/","previous":{"fields":{"slug":"/Blog/LeetCode-1-Two Sum/"},"frontmatter":{"title":"[LeetCode 1] Two Sum"}},"next":{"fields":{"slug":"/Blog/JavaScript中的原型链/"},"frontmatter":{"title":"JavaScript中的原型链"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\211\215\347\253\257\344\272\214\345\271\264/page-data.json" "b/page-data/Blog/\345\211\215\347\253\257\344\272\214\345\271\264/page-data.json" new file mode 100644 index 0000000..55a7673 --- /dev/null +++ "b/page-data/Blog/\345\211\215\347\253\257\344\272\214\345\271\264/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/前端二年/","result":{"data":{"markdownRemark":{"id":"57d1b658-9f0d-52c2-9c09-0aa67bfcc0e6","excerpt":"很多年以后,我可能仍然会记得2017年7月某个下午的那场谈话。 入职第一天,项目负责人笑眯眯的给我说,公司项目有了变化,临时前端缺人,需要我支持一下。就这样,本以为做java后台开发的我,误打误撞进了前端的门。 从什么前端知识都不会,到可以使用react-native…","html":"

很多年以后,我可能仍然会记得2017年7月某个下午的那场谈话。

\n

入职第一天,项目负责人笑眯眯的给我说,公司项目有了变化,临时前端缺人,需要我支持一下。就这样,本以为做java后台开发的我,误打误撞进了前端的门。

\n

从什么前端知识都不会,到可以使用react-native独立开发App,我花了8个月;从学会开发App到能开发web管理后台,花了3个月;从开发web管理后台到学会开发移动端H5页面,花了1个月;从移动端H5页面到学会简单的nodejs接入层开发,花了2周

\n

前端三大框架都接触过,vue和react已经掌握,前端工程化的常规手段比较熟悉,nodejs能开发,但是还不够熟悉后端的一整套,然后还缺一些前端技术场景暂时没接触过,比如小程序、可视化等等,今年结束之前会想办法自己做demo体验一下

\n

不过总的来说,基本上完成了前端一年时立下的目标:大前端

\n

是时候考虑下一步该做什么了,目前有一些朦胧的想法:

\n
    \n
  • 技术补全:可视化,前端监控、埋点,团队开发效率提升的手段
  • \n
  • 业务:承担从0到1的前端业务启动,能在不同阶段选择合适的技术支持业务发展(目前比较感兴趣的是内容产品的前端业务,因为一直在做这块内容)
  • \n
  • 管理:积累前端团队的技术管理经验,或者以准pm角色积累业务管理经验
  • \n
\n

这个阶段暂定时间是2年,希望当自己前端4年时能够做到上面的这些事情,以上

","frontmatter":{"date":"October 08, 2019","title":"前端二年","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/前端二年/","previous":{"fields":{"slug":"/Blog/JSBridge的一点总结/"},"frontmatter":{"title":"JSBridge的一点总结"}},"next":{"fields":{"slug":"/Blog/部署node管理后台遇到的一个问题/"},"frontmatter":{"title":"部署node管理后台遇到的几个问题"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Axios\345\257\271\350\261\241Mock/page-data.json" "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Axios\345\257\271\350\261\241Mock/page-data.json" new file mode 100644 index 0000000..ade126b --- /dev/null +++ "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Axios\345\257\271\350\261\241Mock/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/前端单元测试-Axios对象Mock/","result":{"data":{"markdownRemark":{"id":"f2c90e0f-f550-5eba-9efd-4881c115409e","excerpt":"","html":"","frontmatter":{"date":"March 15, 2020","title":"前端单元测试-Axios对象Mock","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/前端单元测试-Axios对象Mock/","previous":{"fields":{"slug":"/Blog/前端单元测试-Vue对象Mock/"},"frontmatter":{"title":"前端单元测试-Vue对象Mock"}},"next":{"fields":{"slug":"/Blog/前端单元测试-Vue组件mock/"},"frontmatter":{"title":"前端单元测试-Vue组件Mock"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\345\257\271\350\261\241Mock/page-data.json" "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\345\257\271\350\261\241Mock/page-data.json" new file mode 100644 index 0000000..50c1e88 --- /dev/null +++ "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\345\257\271\350\261\241Mock/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/前端单元测试-Vue对象Mock/","result":{"data":{"markdownRemark":{"id":"e4090338-39f6-5d5c-87e9-6996d08640b6","excerpt":"","html":"","frontmatter":{"date":"March 12, 2020","title":"前端单元测试-Vue对象Mock","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/前端单元测试-Vue对象Mock/","previous":{"fields":{"slug":"/Blog/入坑TypeScript/"},"frontmatter":{"title":"入坑TypeScript"}},"next":{"fields":{"slug":"/Blog/前端单元测试-Axios对象Mock/"},"frontmatter":{"title":"前端单元测试-Axios对象Mock"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\347\273\204\344\273\266mock/page-data.json" "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\347\273\204\344\273\266mock/page-data.json" new file mode 100644 index 0000000..11f54d7 --- /dev/null +++ "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Vue\347\273\204\344\273\266mock/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/前端单元测试-Vue组件mock/","result":{"data":{"markdownRemark":{"id":"e8d712f4-e45b-5cbd-baf8-529d651ecde7","excerpt":"","html":"","frontmatter":{"date":"March 17, 2020","title":"前端单元测试-Vue组件Mock","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/前端单元测试-Vue组件mock/","previous":{"fields":{"slug":"/Blog/前端单元测试-Axios对象Mock/"},"frontmatter":{"title":"前端单元测试-Axios对象Mock"}},"next":{"fields":{"slug":"/Blog/前端单元测试-测试组件/"},"frontmatter":{"title":"前端单元测试-测试组件"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\265\213\350\257\225\347\273\204\344\273\266/page-data.json" "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\265\213\350\257\225\347\273\204\344\273\266/page-data.json" new file mode 100644 index 0000000..17ad041 --- /dev/null +++ "b/page-data/Blog/\345\211\215\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\265\213\350\257\225\347\273\204\344\273\266/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/前端单元测试-测试组件/","result":{"data":{"markdownRemark":{"id":"5c2012e3-3d1c-5bc0-af34-f3dd62491acb","excerpt":"","html":"","frontmatter":{"date":"March 19, 2020","title":"前端单元测试-测试组件","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/前端单元测试-测试组件/","previous":{"fields":{"slug":"/Blog/前端单元测试-Vue组件mock/"},"frontmatter":{"title":"前端单元测试-Vue组件Mock"}},"next":{"fields":{"slug":"/Blog/后端单元测试-controller/"},"frontmatter":{"title":"后端单元测试-controller"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\211\215\347\253\257\351\224\231\350\257\257\347\233\221\346\216\247\344\270\216\344\270\212\346\212\245\345\216\237\347\220\206/page-data.json" "b/page-data/Blog/\345\211\215\347\253\257\351\224\231\350\257\257\347\233\221\346\216\247\344\270\216\344\270\212\346\212\245\345\216\237\347\220\206/page-data.json" new file mode 100644 index 0000000..58f5e88 --- /dev/null +++ "b/page-data/Blog/\345\211\215\347\253\257\351\224\231\350\257\257\347\233\221\346\216\247\344\270\216\344\270\212\346\212\245\345\216\237\347\220\206/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/前端错误监控与上报原理/","result":{"data":{"markdownRemark":{"id":"9fd36c51-f455-5273-b2b0-213c9ca6ef0f","excerpt":"","html":"","frontmatter":{"date":"March 08, 2020","title":"前端错误监控与上报原理","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/前端错误监控与上报原理/","previous":{"fields":{"slug":"/Blog/多语言的判断优先级/"},"frontmatter":{"title":"多语言的判断优先级"}},"next":{"fields":{"slug":"/Blog/单元测试初步/"},"frontmatter":{"title":"单元测试初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\212\240\346\263\225\346\223\215\344\275\234\347\254\246/page-data.json" "b/page-data/Blog/\345\212\240\346\263\225\346\223\215\344\275\234\347\254\246/page-data.json" new file mode 100644 index 0000000..d4a31cc --- /dev/null +++ "b/page-data/Blog/\345\212\240\346\263\225\346\223\215\344\275\234\347\254\246/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/加法操作符/","result":{"data":{"markdownRemark":{"id":"59936140-86b7-5f18-8570-44d5f3e9c4ef","excerpt":"date: 2018-09-18 引子 +操作符规则 题目解析 引子 JavaScript上手快…","html":"\n

引子

\n

JavaScript上手快 1 年了,今天无意刷到了几道传统面试题,无法有条理的给出答案,顿感基础薄弱。 这几道题都是关于加法操作符的知识点,先上面试例题:

\n
1. []+[] //''\n\n2. []+{}//'[object Object]'\n\n3. {}+[]//0\n\n4. {}+{}//'[object Object][object Object]'
\n

下面先总结加法操作符规则,之后按照总结的计算规则,依次解题。

\n

+操作符规则

\n

\"+\"作为二元操作符,完成表达式x+y中 2 个变量数值相加或字符串拼接,具体规则如下所示:

\n
    \n
  1. 如果 x, y 至少有一个为对象,将其转换为基本类型
  2. \n
  3. 转换后如果 x, y 至少有一个为string,则将另一个转换为string,执行字符串拼接
  4. \n
  5. 以上均不满足,将 x, y 转换为number,执行数值计算
  6. \n
\n
对象转换为基本类型规则
\n
    \n
  1. 如果 x 是Date对象,返回x.toString()
  2. \n
  3. 如果 x 是其他对象,且x.valueOf()返回值为基本类型,返回x.valueOf()
  4. \n
  5. 如果x.valueOf()返回值不是基本类型,且 x.toString()返回值为基本类型,返回x.toString()
  6. \n
  7. \n

    以上皆不满足,抛出TypeError异常

    \n
    \n

    注:根据 ECMA,对象到基本类型转换实际过程较复杂,以后单独写一篇

    \n
    \n
  8. \n
\n

题目解析

\n

题 1

\n
[] + []; //''
\n

分析:

\n
    \n
  • 均为对象,先将其转换为基本类型,根据对象转换规则,数组首先调用 valueOf(),返回值为自身,继续调用 toString(),返回空字符串'',表达式变为''+''
  • \n
  • 根据+规则-2,执行字符串拼接,表达式返回结果''
  • \n
\n

题 2

\n
[] + {}; //'[object Object]'
\n

分析:

\n
    \n
  • 均为对象,先将其转换为基本类型,根据对象转换规则,首先调用valueOf(),返回值为自身,继续调用toString(),返回空字符串'''[object Object]',表达式变为''+'[object Object]'
  • \n
  • 根据+规则-2,执行字符串拼接,表达式返回结果'[object Object]'
  • \n
\n

题 3

\n
{\n}\n+[]; //0
\n

分析:

\n
    \n
  • 因浏览器将{}解析为代码块注[1],表达式等价于+[],先将其转换为基本类型,根据对象转换规则,数组首先调用valueOf(),返回值为自身,继续调用toString(),返回空字符串'',表达式变为+'',取Number(''),表达式返回0
  • \n
  • 如果将表达式改写为({})+[],将得到与题 2 相同的结果
  • \n
\n

题 4

\n
{\n}\n+{}; //'[object Object][object Object]'
\n

分析:

\n
    \n
  • 这道题比较奇怪
  • \n
  • 按照题 3 的规则,第一个{}将被解析为代码块,表达式等效于+{},按照对象转换规则,先变成+'[object Object]',然后取Number('[object Object]'),应该返回结果NaN才对。FireFox 62EdgeIE11的输出就是这个。
  • \n
  • 可是输入Chrome 69,二者都是被当作对象处理的,最终表达式返回结果'[object Object][object Object]'
  • \n
  • 看来几家浏览器在这种情况下规则有所不同,深入研究需要看parser里的抽象语法树Abstract Syntax Tree(AST) 是如何解析的,以后有时间了再研究
  • \n
\n
\n

下面对题 4 做一点扩展,算作验证
\n题 4-扩展

\n
1. ({})+{}   //Chrome  - '[object Object][object Object]'\n             //FireFox - '[object Object][object Object]'\n             //IE 11   - '[object Object][object Object]'\n             //Edge    - '[object Object][object Object]'\n\n2. {}+({})   //Chrome  - NaN\n             //FireFox - NaN\n             //IE 11   - NaN\n             //Edge    - NaN\n\n3. {}+{}+{}  //Chrome  - '[object Object][object Object][object Object]'\n             //FireFox - 'NaN[object Object]'\n             //IE 11   - 'NaN[object Object]'\n             //Edge    - 'NaN[object Object]'\n\n4. ({})+{}+{}//Chrome  - '[object Object][object Object][object Object]'\n             //FireFox - '[object Object][object Object][object Object]'\n             //IE 11   - '[object Object][object Object][object Object]'\n             //Edge    - '[object Object][object Object][object Object]'\n\n5. {}+({})+{}//Chrome  - '[object Object][object Object][object Object]'\n             //FireFox - 'NaN[object Object]'\n             //IE 11   - 'NaN[object Object]'\n             //Edge    - 'NaN[object Object]'\n\n6. {}+{}+({})//Chrome  - 'NaN[object Object]'\n             //FireFox - 'NaN[object Object]'\n             //IE 11   - 'NaN[object Object]'\n             //Edge    - 'NaN[object Object]'\n\n7. {}+[]+{}  //Chrome  - '[object Object][object Object]'\n             //FireFox - '0[object Object]'\n             //IE 11   - '0[object Object]'\n             //Edge    - '0[object Object]'\n\n8. {}+{}+[]  //Chrome  - 'NaN'\n             //FireFox - 'NaN'\n             //IE 11   - 'NaN'\n             //Edge    - 'NaN'
\n

看起来似乎Chrome对以{}开头且以{}结尾(即'{}+...+{}') 的表达式做了优化解析,不会把遇见的{}视为代码块,而是作为空对象解析。其他浏览器没有这个规则。

\n
\n
注 1
\n
\n

Expression Statement\nSyntax

\n
ExpressionStatement[Yield] :\n       [lookahead ∉ {{, function, class, let [}] Expression[In, ?Yield] ;
\n
\n

NOTE\nAn ExpressionStatement cannot start with a U+007B (LEFT CURLY BRACKET) because that might make it ambiguous with a Block. Also, an ExpressionStatement cannot start with the function or class keywords because that would make it ambiguous with a FunctionDeclaration, a GeneratorDeclaration, or a ClassDeclaration. An ExpressionStatement cannot start with the two token sequence let [ because that would make it ambiguous with a let LexicalDeclaration whose first LexicalBinding was an ArrayBindingPattern.

\n
\n
","frontmatter":{"date":"September 18, 2018","title":"加法操作符","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/加法操作符/","previous":{"fields":{"slug":"/Blog/相等操作符/"},"frontmatter":{"title":"相等操作符"}},"next":{"fields":{"slug":"/Blog/JS中的隐式转换/"},"frontmatter":{"title":"JS中的隐式转换"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\215\225\345\205\203\346\265\213\350\257\225\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/\345\215\225\345\205\203\346\265\213\350\257\225\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..cbd10a0 --- /dev/null +++ "b/page-data/Blog/\345\215\225\345\205\203\346\265\213\350\257\225\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/单元测试初步/","result":{"data":{"markdownRemark":{"id":"350d6ea2-e5d7-5c00-8b15-613fc7a93874","excerpt":"","html":"

","frontmatter":{"date":"March 09, 2020","title":"单元测试初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/单元测试初步/","previous":{"fields":{"slug":"/Blog/前端错误监控与上报原理/"},"frontmatter":{"title":"前端错误监控与上报原理"}},"next":{"fields":{"slug":"/Blog/自己实现Promise/"},"frontmatter":{"title":"自己实现Promise"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Koa\344\270\255\351\227\264\344\273\266\346\265\213\350\257\225/page-data.json" "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Koa\344\270\255\351\227\264\344\273\266\346\265\213\350\257\225/page-data.json" new file mode 100644 index 0000000..2146a2f --- /dev/null +++ "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-Koa\344\270\255\351\227\264\344\273\266\346\265\213\350\257\225/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/后端单元测试-Koa中间件测试/","result":{"data":{"markdownRemark":{"id":"9e7ed8c5-4235-54fa-acad-f6dcfd7bd4c8","excerpt":"","html":"","frontmatter":{"date":"March 29, 2020","title":"后端单元测试-Koa中间件测试","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/后端单元测试-Koa中间件测试/","previous":{"fields":{"slug":"/Blog/后端单元测试-controller/"},"frontmatter":{"title":"后端单元测试-controller"}},"next":{"fields":{"slug":"/Blog/后端单元测试-service/"},"frontmatter":{"title":"后端单元测试-service"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-controller/page-data.json" "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-controller/page-data.json" new file mode 100644 index 0000000..21bd867 --- /dev/null +++ "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-controller/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/后端单元测试-controller/","result":{"data":{"markdownRemark":{"id":"997e63e1-57f0-53f9-b328-fb0da58c2260","excerpt":"","html":"","frontmatter":{"date":"March 23, 2020","title":"后端单元测试-controller","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/后端单元测试-controller/","previous":{"fields":{"slug":"/Blog/前端单元测试-测试组件/"},"frontmatter":{"title":"前端单元测试-测试组件"}},"next":{"fields":{"slug":"/Blog/后端单元测试-Koa中间件测试/"},"frontmatter":{"title":"后端单元测试-Koa中间件测试"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-service/page-data.json" "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-service/page-data.json" new file mode 100644 index 0000000..62ddff4 --- /dev/null +++ "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-service/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/后端单元测试-service/","result":{"data":{"markdownRemark":{"id":"e4c03580-a16a-5867-abf0-c2d2c95b3736","excerpt":"","html":"","frontmatter":{"date":"April 02, 2020","title":"后端单元测试-service","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/后端单元测试-service/","previous":{"fields":{"slug":"/Blog/后端单元测试-Koa中间件测试/"},"frontmatter":{"title":"后端单元测试-Koa中间件测试"}},"next":{"fields":{"slug":"/Blog/web安全初步/"},"frontmatter":{"title":"web安全初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\216\245\345\205\245\345\261\202\350\257\267\346\261\202mock/page-data.json" "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\216\245\345\205\245\345\261\202\350\257\267\346\261\202mock/page-data.json" new file mode 100644 index 0000000..8d7b678 --- /dev/null +++ "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\216\245\345\205\245\345\261\202\350\257\267\346\261\202mock/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/后端单元测试-接入层请求mock/","result":{"data":{"markdownRemark":{"id":"81d585ad-d91a-570a-a3f4-0ce9e10d8b97","excerpt":"","html":"","frontmatter":{"date":"April 06, 2020","title":"后端单元测试-接入层请求mock","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/后端单元测试-接入层请求mock/","previous":{"fields":{"slug":"/Blog/web安全初步/"},"frontmatter":{"title":"web安全初步"}},"next":{"fields":{"slug":"/Blog/后端单元测试-数据库model/"},"frontmatter":{"title":"后端单元测试-数据库model"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\225\260\346\215\256\345\272\223model/page-data.json" "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\225\260\346\215\256\345\272\223model/page-data.json" new file mode 100644 index 0000000..6ed711a --- /dev/null +++ "b/page-data/Blog/\345\220\216\347\253\257\345\215\225\345\205\203\346\265\213\350\257\225-\346\225\260\346\215\256\345\272\223model/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/后端单元测试-数据库model/","result":{"data":{"markdownRemark":{"id":"edca47b0-5826-5638-81c1-3074764524a2","excerpt":"","html":"","frontmatter":{"date":"April 07, 2020","title":"后端单元测试-数据库model","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/后端单元测试-数据库model/","previous":{"fields":{"slug":"/Blog/后端单元测试-接入层请求mock/"},"frontmatter":{"title":"后端单元测试-接入层请求mock"}},"next":{"fields":{"slug":"/Blog/web性能测试初步/"},"frontmatter":{"title":"web性能测试初步"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\223\215\345\272\224\345\274\217\345\233\276\347\211\207\344\274\230\345\214\226/page-data.json" "b/page-data/Blog/\345\223\215\345\272\224\345\274\217\345\233\276\347\211\207\344\274\230\345\214\226/page-data.json" new file mode 100644 index 0000000..8e6206b --- /dev/null +++ "b/page-data/Blog/\345\223\215\345\272\224\345\274\217\345\233\276\347\211\207\344\274\230\345\214\226/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/响应式图片优化/","result":{"data":{"markdownRemark":{"id":"e0fbe291-555e-51e5-b342-d22459126a9e","excerpt":"写在前面 图片消耗了网页流量的50%(中位数),移动端图片消耗了大约900Kb ​ - httparchive.org, 2020.01 图片优化的…","html":"

写在前面

\n
\n

图片消耗了网页流量的50%(中位数),移动端图片消耗了大约900Kb

\n

​ - httparchive.org, 2020.01

\n
\n

图片优化的2个目标:

\n
    \n
  • 保持图片质量的同时,减少不必要的流量(为了更快的加载)
  • \n
  • 没有页面布局抖动(为了更好的体验)
  • \n
\n

如何做:

\n
    \n
  1. \n

    图片格式

    \n
      \n
    • 绝大多数情况使用jpg
    • \n
    • 少数有透明背景要求的情况使用png
    • \n
    • gif尽量不用,使用短视频替换
    • \n
    • 尽量使用新格式webp,可以大幅缩小图片体积
    • \n
    \n
  2. \n
  3. \n

    响应式

    \n
      \n
    • img标签使用src-set,sizes适配不同尺寸
    • \n
    • 多种格式可以使用picture元素,通过source属性指定不同格式图片
    • \n
    \n
  4. \n
","frontmatter":{"date":"April 12, 2020","title":"响应式图片优化","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/响应式图片优化/","previous":{"fields":{"slug":"/Blog/web性能测试-jmeter/"},"frontmatter":{"title":"web性能测试-jmeter"}},"next":{"fields":{"slug":"/Blog/web性能优化指标解析/"},"frontmatter":{"title":"web性能优化指标解析"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\233\275\351\231\205\345\214\226\345\222\214\346\234\254\345\234\260\345\214\226\345\210\235\346\255\245/page-data.json" "b/page-data/Blog/\345\233\275\351\231\205\345\214\226\345\222\214\346\234\254\345\234\260\345\214\226\345\210\235\346\255\245/page-data.json" new file mode 100644 index 0000000..280d107 --- /dev/null +++ "b/page-data/Blog/\345\233\275\351\231\205\345\214\226\345\222\214\346\234\254\345\234\260\345\214\226\345\210\235\346\255\245/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/国际化和本地化初步/","result":{"data":{"markdownRemark":{"id":"8a32452e-abbf-555e-adce-ce304b54693f","excerpt":"写在前面 公司项目网站改版在即,需要扩充国际化和本地化支持。 查资料看了下这两个东西,理清了一些概念,简单记录一下。 国际化和本地化 根据wiki的说法,国际化与本地化(internationalization and localization…","html":"

写在前面

\n

公司项目网站改版在即,需要扩充国际化和本地化支持。

\n

查资料看了下这两个东西,理清了一些概念,简单记录一下。

\n

国际化和本地化

\n

根据wiki的说法,国际化与本地化(internationalization and localization)是指修改软件使之能适应目标市场的语言、区差异以及技术需要。

\n

因为这两个单词太长了,所以前者简写为i18n(表示i和n之间有18个字母),后者是L10n。分别用小写i和大写L是为了和之后的数字1区分,i18n和I18n,显然前者更容易辨识;L10n同理。

\n
    \n
  • \n

    国际化

    \n

    将软件与特定语言及地区脱钩的过程,即软件移植到不同语言和地区时,不需要做工程上的改动

    \n
  • \n
  • \n

    本地化

    \n

    与国际化相反,指移植软件时,增加与特定区域有关的信息和必要翻译的过程

    \n
  • \n
\n

举个例子,前端最常见的国际化场景是给文案增加不同的语言版本,比如一个按钮文案是“提交”,在英文状态下可能会改成\"Submit\"。

\n

另一个例子是处理时间,用统一逻辑处理不同时区之间的时间,这个算国际化;但是不同地区时间显示的格式不一样,同样是英语国家,英国的时间一般是dd/mm/yyyy,而美国的就是MM dd, yyyy,这个算本地化。

\n

更常见的本地化场景是货币,不同国家的货币一般来说都是不同的,符号不同、计数的方式也不同。比如欧元区的德国,除了欧元的货币符号与美元不同之外,逗号和小数点的规则完全相反,2.100,50数值于美国的2,100.50

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
地区货币日期
美国$1,234.56Apr 27, 2020
英国£1,234.5627/04/2020
德国1.234,56 €27/04/2020
中国¥1234.562020/04/27
\n

地区设置Locale

\n

有了国际化和本地化的支持,那么下一步就是要获取用户的位置了,否则无法有效根据不同用户背景提供更匹配的服务,于是引入了一个地区设置locale的概念。

\n

从用户的角度来说,操作系统一般会有一组相应的环境变量设置locale,而对于网站/服务提供者来说,其实locale更像是一种推定,根据已获得的某些用户数据,推测用户的背景,并让网站/服务根据这个假设为用户提供(可能)更匹配的服务,比如语言。后面讲到语言类别的时候会更具体的讲到。

\n

例子: 语言设置

\n

如何获取用户语言设置

\n

优先级:https://support.google.com/webmasters/answer/182192?hl=en&ref_topic=2370587

\n

domain->sub-domain->subdirectories->query parameters->http header accept-language->cookie->user agent

\n

google如何检索不同语言版本

\n

https://support.google.com/webmasters/answer/182192?hl=en&ref_topic=2370587

","frontmatter":{"date":"April 27, 2020","title":"国际化和本地化初步","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/国际化和本地化初步/","previous":{"fields":{"slug":"/Blog/shell脚本合并csv文件/"},"frontmatter":{"title":"shell脚本合并csv文件"}},"next":{"fields":{"slug":"/Blog/php调参优化小记/"},"frontmatter":{"title":"php调参优化小记"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\244\232\350\257\255\350\250\200\347\232\204\345\210\244\346\226\255\344\274\230\345\205\210\347\272\247/page-data.json" "b/page-data/Blog/\345\244\232\350\257\255\350\250\200\347\232\204\345\210\244\346\226\255\344\274\230\345\205\210\347\272\247/page-data.json" new file mode 100644 index 0000000..a6f9186 --- /dev/null +++ "b/page-data/Blog/\345\244\232\350\257\255\350\250\200\347\232\204\345\210\244\346\226\255\344\274\230\345\205\210\347\272\247/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/多语言的判断优先级/","result":{"data":{"markdownRemark":{"id":"25c6cc2f-53d2-5f10-af94-0e39d8c8f5ee","excerpt":"写在前面 最近增加Node多语言的支持,后端获取语言参数的优先级有点不清楚 特意查了些文档,在这里记录一下 优先级 Domain: 顶级域名(TLD, Top Level Domain),如.cn, .de等 Subdomain: 子域名,如cn.amazon.com…","html":"

写在前面

\n

最近增加Node多语言的支持,后端获取语言参数的优先级有点不清楚
\n特意查了些文档,在这里记录一下

\n

优先级

\n
    \n
  1. Domain: 顶级域名(TLD, Top Level Domain),如.cn, .de等
  2. \n
  3. Subdomain: 子域名,如cn.amazon.com
  4. \n
  5. Subdirectory: URL里增加path,如www.mozilla.org/en-US/
  6. \n
  7. \n

    其他: 以下不分先后,可自定义优先级

    \n
      \n
    • URL parameter: 如www.example.com?lang=en-US
    • \n
    • HTTP header: Accept-Language: 可在浏览器语言偏好里设置,请求时会将此信息带上'Accept-Language: en;q=0.8,es;q=0.6,fr;q=0.4'
    • \n
    • User Agent: 一般用在App内,语言参数名称可能不标准,而且变更可能比较频繁,比如Facebook的UA里表示语言的属性是user-lang
    • \n
    • Cookie: 语言参数名也可能不标准,变更也可能比较频繁,现在好像用的越来越少了
    • \n
    \n
  8. \n
  9. IP查找: 以上都失效的时候,后端还可以考虑使用IP查找检测对应语言,准确率较低
  10. \n
  11. 自定义标准: 还可以自定义规则覆盖以上的设置
  12. \n
\n

暂时这么多,以上

","frontmatter":{"date":"March 05, 2020","title":"多语言的判断优先级","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/多语言的判断优先级/","previous":{"fields":{"slug":"/Blog/HTTP2.0初步/"},"frontmatter":{"title":"HTTP2.0初步"}},"next":{"fields":{"slug":"/Blog/前端错误监控与上报原理/"},"frontmatter":{"title":"前端错误监控与上报原理"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\246\202\344\275\225\345\210\244\346\226\255\346\227\245\346\234\237\346\230\257\345\220\246\344\270\272\344\273\212\345\244\251/page-data.json" "b/page-data/Blog/\345\246\202\344\275\225\345\210\244\346\226\255\346\227\245\346\234\237\346\230\257\345\220\246\344\270\272\344\273\212\345\244\251/page-data.json" new file mode 100644 index 0000000..132def2 --- /dev/null +++ "b/page-data/Blog/\345\246\202\344\275\225\345\210\244\346\226\255\346\227\245\346\234\237\346\230\257\345\220\246\344\270\272\344\273\212\345\244\251/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/如何判断日期是否为今天/","result":{"data":{"markdownRemark":{"id":"fcb9d14b-f410-5d3e-bd9e-5af1f2d34019","excerpt":"","html":"
function(timestamp){\n  let aDate = new Date(timestamp),\n  today = new Date(Date.now());\n  return aDate.toDateString() === today.toDateString();\n}
","frontmatter":{"date":"May 04, 2018","title":"如何判断日期是否为今天","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/如何判断日期是否为今天/","previous":{"fields":{"slug":"/Blog/null和undefined的比较/"},"frontmatter":{"title":"null和undefined的比较"}},"next":{"fields":{"slug":"/Blog/一次搞笑而深刻的bug调试/"},"frontmatter":{"title":"一次搞笑而深刻的bug调试"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\256\236\347\216\260\350\207\252\345\256\232\344\271\211tabbar component/page-data.json" "b/page-data/Blog/\345\256\236\347\216\260\350\207\252\345\256\232\344\271\211tabbar component/page-data.json" new file mode 100644 index 0000000..31f0ca3 --- /dev/null +++ "b/page-data/Blog/\345\256\236\347\216\260\350\207\252\345\256\232\344\271\211tabbar component/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/实现自定义tabbar component/","result":{"data":{"markdownRemark":{"id":"16a13c24-9ba6-5b59-a5ed-006fa77c6301","excerpt":"需要覆盖 tabbar component 如果是 bottom 模式,就需要覆盖 tabbarBottom 如果是 top 模式,就需要覆盖该 tabbarTop 参考这里","html":"

需要覆盖 tabbar component

\n
    \n
  1. 如果是 bottom 模式,就需要覆盖 tabbarBottom
  2. \n
  3. 如果是 top 模式,就需要覆盖该 tabbarTop
  4. \n
\n

参考这里

","frontmatter":{"date":"March 13, 2018","title":"实现自定义tabbar component","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/实现自定义tabbar component/","previous":{"fields":{"slug":"/Blog/React-Navigation中tabNavigator去掉指示线/"},"frontmatter":{"title":"React-Navigation中tabNavigator去掉指示线"}},"next":{"fields":{"slug":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/"},"frontmatter":{"title":"RN0.53+react-native-splash-screen3.0.1,Android启动闪退"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\345\274\200\345\247\213\345\210\267leetcode/page-data.json" "b/page-data/Blog/\345\274\200\345\247\213\345\210\267leetcode/page-data.json" new file mode 100644 index 0000000..a23c845 --- /dev/null +++ "b/page-data/Blog/\345\274\200\345\247\213\345\210\267leetcode/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/开始刷leetcode/","result":{"data":{"markdownRemark":{"id":"4050fece-1838-5092-bc55-e7ec6df7cb69","excerpt":"可能是今年 flag 里包含项目最多的一个,今天正式开始 leetcode 刷题,目标是 7 月 31 日之前至少刷完一遍。 leetcode 官方放出了一个 top interview questions list,一共 151 题: easy 共 49 题 medium…","html":"

可能是今年 flag 里包含项目最多的一个,今天正式开始 leetcode 刷题,目标是 7 月 31 日之前至少刷完一遍。

\n

leetcode 官方放出了一个 top interview questions list,一共 151 题:

\n\n

嗯,就这些。

","frontmatter":{"date":"February 11, 2019","title":"开始刷leetcode","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/开始刷leetcode/","previous":{"fields":{"slug":"/Blog/2018总结与2019希望/"},"frontmatter":{"title":"2018总结与2019希望"}},"next":{"fields":{"slug":"/Blog/LeetCode-461-Hamming Distance/"},"frontmatter":{"title":"[LeetCode 461] Hamming Distance"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\201\266\350\266\243\345\221\263\346\236\204\351\200\240\345\207\275\346\225\260/page-data.json" "b/page-data/Blog/\346\201\266\350\266\243\345\221\263\346\236\204\351\200\240\345\207\275\346\225\260/page-data.json" new file mode 100644 index 0000000..e147297 --- /dev/null +++ "b/page-data/Blog/\346\201\266\350\266\243\345\221\263\346\236\204\351\200\240\345\207\275\346\225\260/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/恶趣味构造函数/","result":{"data":{"markdownRemark":{"id":"3857c34c-ce84-55fb-b2d4-db2cf3baf44a","excerpt":"date: 2018-10-29 引子 带返回值的构造函数 一点引申: 单例模式 引子 理论上说,只要对函数使用new语法,任何function都可以作为constructor创建新实例,但是如果function…","html":"\n
\n

引子

\n

理论上说,只要对函数使用new语法,任何function都可以作为constructor创建新实例,但是如果function不按常理出牌呢?还可以实现创建新实例的目标吗?

\n
\n

注:本文内容为JavaScript Ninja的读书笔记。

\n
\n

带返回值的构造函数

\n
    \n
  1. 返回值为基本类型
  2. \n
\n
function retPrimType() {\n  this.value = 'I am a function returning a primitive type';\n  this.getMyThis = function() {\n    return this;\n  };\n  return 'I return a new Object as this';\n}\n\nconst a = new retPrimType();\nconsole.log(retPrimType()); //'I return a new Object as this'\nconsole.log(a.getMyThis() === a); //true
\n
    \n
  1. 返回值为对象
  2. \n
\n
const ref = { key: 'object' };\nfunction retObjectType() {\n  this.value = 'I am a funtion returning an Object';\n  this.getMyThis = function() {\n    return this;\n  };\n  return ref;\n}\n\nconst b = new retObjectType();\nconsole.log(retObjectType()); //{key:'object'}\nconsole.log(b.getMyThis === b); // error: b.getMyThis is not a function\nconsole.log(b === ref); //true\n\nconst c = new retObjectType();\nconsole.log(b === c); //true
\n
    \n
  1. \n

    小结

    \n
      \n
    • function返回基本类型,new之后其返回值被忽略,依然能够创建新实例,并且this的指向正确
    • \n
    • function返回对象,new 之后该对象将被返回,无法创建新实例
    • \n
    \n
  2. \n
\n

一点引申: 单例模式

\n

开一点脑洞,如果要求某个对象使用new后只能返回同一个实例,即实现单例模式,如何利用上面的结论来实现?

\n
const singleton = (function() {\n  const retObj = { key: 'I am singleton!' };\n  return function() {\n    return retObj;\n  };\n})();\nconst a = new singleton();\nconst b = new singleton();\nconsole.log(a === b); //true\na.key = 'everyone changes with me';\nconsole.log(a); //{key: 'everyone changes with me'}\nconsole.log(b); //{key: 'everyone changes with me'}
\n

用 IIFE+闭包构造一个singleton对象,它的值就是内层匿名函数,可以访问其外层自由变量retObj。按照上面总结的规则,每当对singleton执行new操作时,它总是会返回对象retObj,这样就实现了恶趣味单例模式。

","frontmatter":{"date":"October 29, 2018","title":"恶趣味构造函数","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/恶趣味构造函数/","previous":{"fields":{"slug":"/Blog/typeof与instanceof/"},"frontmatter":{"title":"typeof与instanceof"}},"next":{"fields":{"slug":"/Blog/parameter与argument/"},"frontmatter":{"title":"parameter与argument"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.every/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.every/page-data.json" new file mode 100644 index 0000000..4edf531 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.every/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.every/","result":{"data":{"markdownRemark":{"id":"73eaddd5-bc49-52b3-bb19-6eebc47d6607","excerpt":"前端知识复习 code snippet array.prototype.every 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","html":"

前端知识复习 code snippet

\n

array.prototype.every 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. \n
  7. Let k be 0.
  8. \n
  9. \n

    Repeat, while k < len,

    \n
      \n
    • Let Pk be ! ToString(k).
    • \n
    • Let kPresent be ? HasProperty(O, Pk).
    • \n
    • \n

      If kPresent is true, then

      \n
        \n
      • Let kValue be ? Get(O, Pk).
      • \n
      • Let testResult be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, O »)).
      • \n
      • If testResult is true, return false.
      • \n
      \n
    • \n
    \n
  10. \n
  11. Set k to k + 1.
  12. \n
  13. Return true.
  14. \n
\n
\n

代码

\n
Array.prototype.myEvery = function (callbackfn, thisArg) {\n    if (this == undefined) {\n        throw TypeError('Cannot read property filter of ' + this);\n    }\n    if (typeof callbackfn !== 'function') {\n        throw TypeError(callbackfn + ' is not a function');\n    }\n\n    var O = Object(this);\n    var len = O.length >>> 0;\n    for (var k = 0; k < len; k++) {\n        if (k in O) {\n            var kValue = O[k];\n            if (!callbackfn.call(thisArg, kValue, k, O)) return false;\n        }\n    }\n    return true;\n};
","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.every","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.every/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.pop/"},"frontmatter":{"title":"手写Array.prototype.pop"}},"next":{"fields":{"slug":"/Blog/scroll事件踩坑记录/"},"frontmatter":{"title":"scroll事件踩坑记录"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.filter/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.filter/page-data.json" new file mode 100644 index 0000000..aa0d8db --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.filter/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.filter/","result":{"data":{"markdownRemark":{"id":"3a2a9a67-7077-5fc5-90a0-c39132697111","excerpt":"前端知识复习 code snippet array.prototype.filter 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","html":"

前端知识复习 code snippet

\n

array.prototype.filter 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. \n
  7. Let A be ? ArraySpeciesCreate(O, 0).
  8. \n
  9. Let k be 0.
  10. \n
  11. Let to be 0.
  12. \n
  13. \n

    Repeat, while k < len,

    \n
      \n
    • Let Pk be ! ToString(k).
    • \n
    • Let kPresent be ? HasProperty(O, Pk).
    • \n
    • \n

      If kPresent is true, then

      \n
        \n
      • Let kValue be ? Get(O, Pk).
      • \n
      • Let selected be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, O »)).
      • \n
      • \n

        If selected is true, then

        \n
          \n
        • Perform ? CreateDataPropertyOrThrow(A, ! ToString(to), kValue).
        • \n
        • Set to to to + 1.
        • \n
        \n
      • \n
      \n
    • \n
    • Set k to k + 1.
    • \n
    \n
  14. \n
  15. Return A.
  16. \n
\n
\n

代码

\n
Array.prototype.myFilter = function(callbackfn,thisArg){\n    // this cannot be null or undefined\n    if(this == undefined){\n        throw TypeError('Cannot read property filter of '+ this);\n    }\n    // callbackfn must be a function\n    if(typeof callbackfn !== 'function'){\n        throw TypeError(callbackfn + ' is not a function')\n    }\n\n    var O = Object(this);\n    var len = O.length >>> 0;\n\n    var A = [];\n    // element index in O\n    var k=0;\n    // element index in A\n    var to=0;\n    // iterate O and store element that meets criteria in A\n    for(;k<len;k++){\n        if(k in O){\n            var kValue = O[k]\n            var selected = callbackfn.call(thisArg, kValue, k, O);\n            if(selected){\n                A[to++] = kValue;\n            }\n        }\n    }\n    return A;\n}
","frontmatter":{"date":"May 22, 2020","title":"手写Array.prototype.filter","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.filter/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.reduce/"},"frontmatter":{"title":"手写Array.prototype.reduce"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.forEach/"},"frontmatter":{"title":"手写Array.prototype.forEach"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.forEach/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.forEach/page-data.json" new file mode 100644 index 0000000..930b679 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.forEach/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.forEach/","result":{"data":{"markdownRemark":{"id":"8f739d39-7b65-59b7-8837-6fdb4b3387f2","excerpt":"前端知识复习 code snippet array.prototype.foreach 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","html":"

前端知识复习 code snippet

\n

array.prototype.foreach 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. \n
  7. Let k be 0.
  8. \n
  9. \n

    Repeat, while k < len,

    \n
      \n
    • Let Pk be ! ToString(k).
    • \n
    • Let kPresent be ? HasProperty(O, Pk).
    • \n
    • \n

      If kPresent is true, then

      \n
        \n
      • Let kValue be ? Get(O, Pk).
      • \n
      • Perform ? Call(callbackfn, thisArg, « kValue, k, O »).
      • \n
      \n
    • \n
    \n
  10. \n
  11. Set k to k + 1.
  12. \n
  13. Return undefined.
  14. \n
\n
\n

代码

\n
Array.prototype.myForEach = function (callbackfn, thisArg) {\n    // this must not be null or undefined\n    if (this == null) {\n        throw new TypeError(\n            'Array.prototype.forEach called on null or undefined'\n        );\n    }\n    // callbackfn must be a function\n    if (typeof callbackfn !== 'function') {\n        throw new TypeError(callbackfn + ' is not a function');\n    }\n\n    var O = Object(this);\n    var len = O.length >>> 0;\n\n    var k = 0;\n    // iterate array\n    if (thisArg === undefined) {\n        for (; k < len; k++) {\n            if (k in O) {\n                var kValue = O[k];\n                callbackfn(kValue, k, O);\n            }\n        }\n    } else {\n        for (; k < len; k++) {\n            if (k in O) {\n                var kValue = O[k];\n                callbackfn.call(thisArg, kValue, k, O);\n            }\n        }\n    }\n\n    return undefined;\n};
","frontmatter":{"date":"May 23, 2020","title":"手写Array.prototype.forEach","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.forEach/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.filter/"},"frontmatter":{"title":"手写Array.prototype.filter"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.some/"},"frontmatter":{"title":"手写Array.prototype.some"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.map/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.map/page-data.json" new file mode 100644 index 0000000..bbdd9a2 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.map/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.map/","result":{"data":{"markdownRemark":{"id":"b0f6f384-9672-512b-ac7e-0a4cf63787a1","excerpt":"前端知识复习 code snippet 废话少说,先看 array.prototype.map 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable…","html":"

前端知识复习 code snippet

\n

废话少说,先看 array.prototype.map 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. \n
  7. Let A be ? ArraySpeciesCreate(O, len).
  8. \n
  9. Let k be 0.
  10. \n
  11. \n

    Repeat, while k < len,

    \n
      \n
    • Let Pk be ! ToString(k).
    • \n
    • Let kPresent be ? HasProperty(O, Pk).
    • \n
    • \n

      If kPresent is true, then

      \n
        \n
      • Let kValue be ? Get(O, Pk).
      • \n
      • Let mappedValue be ? Call(callbackfn, thisArg, « kValue, k, O »).
      • \n
      • Perform ? CreateDataPropertyOrThrow(A, Pk, mappedValue).
      • \n
      • Set k to k +1.
      • \n
      \n
    • \n
    \n
  12. \n
  13. Return A.
  14. \n
\n
\n

代码

\n
Array.prototype.myMap = function(callbackfn, thisArg) {\n  // this cannot be null or undefined\n  if (this == null) {\n    throw new TypeError('this is null or undefined');\n  }\n  var O = Object(this);\n// convert O.length to integer 0\n// e.g. undefined >>> 0 => 0\n  var len = O.length >>> 0;\n  // callbackfn must be a function\n  if (typeof callbackfn != 'function') {\n    throw new TypeError(callbackfn + ' is not a function');\n  }\n  var T = thisArg != undefined ? thisArg : undefined;\n  var A = new Array(len);\n\n  for (var k = 0; k < len; k++) {\n    // iterate all property of O, including props in prototype chain\n    if (k in O) {\n      var kValue = O[k];\n      var mappedValue = callbackfn.call(T, kValue, k, O);\n      A[k] = mappedValue;\n    }\n  }\n  return A;\n};
","frontmatter":{"date":"May 20, 2020","title":"手写Array.prototype.map","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.map/","previous":{"fields":{"slug":"/Blog/BGP Hijacking/"},"frontmatter":{"title":"BGP Hijacking"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.reduce/"},"frontmatter":{"title":"手写Array.prototype.reduce"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.pop/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.pop/page-data.json" new file mode 100644 index 0000000..73b005d --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.pop/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.pop/","result":{"data":{"markdownRemark":{"id":"4f66deb7-bf30-5339-a9a5-cbb87ff09c95","excerpt":"前端知识复习 code snippet array.prototype.pop 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If len is zero, then Perform…","html":"

前端知识复习 code snippet

\n

array.prototype.pop 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. \n

    If len is zero, then

    \n
      \n
    • Perform ? Set(O, \"length\", 0, true).
    • \n
    • Return undefined.
    • \n
    \n
  6. \n
  7. \n

    Else,

    \n
      \n
    • Assert: len > 0.
    • \n
    • Let newLen be len - 1.
    • \n
    • Let index be ! ToString(newLen).
    • \n
    • Let element be ? Get(O, index).
    • \n
    • Perform ? DeletePropertyOrThrow(O, index).
    • \n
    • Perform ? Set(O, \"length\", newLen, true).
    • \n
    • Return element.
    • \n
    \n
  8. \n
\n
\n

代码

\n
Array.prototype.myPop = function () {\n    var O = Object(this);\n    var len = O.length >>> 0;\n\n    if (len == 0) {\n        O.length = 0;\n        return undefined;\n    } else {\n        var element = O[--len];\n        delete O[len];\n        O.length = newLen;\n        return element;\n    }\n};
","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.pop","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.pop/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.push/"},"frontmatter":{"title":"手写Array.prototype.push"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.every/"},"frontmatter":{"title":"手写Array.prototype.every"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.push/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.push/page-data.json" new file mode 100644 index 0000000..bed95c5 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.push/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.push/","result":{"data":{"markdownRemark":{"id":"603756e2-ff0b-5ca3-aef9-fff4557b8d22","excerpt":"前端知识复习 code snippet array.prototype.push 标准 t O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). Let items be a List whose…","html":"

前端知识复习 code snippet

\n

array.prototype.push 标准

\n
\n
    \n
  1. t O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. Let items be a List whose elements are, in left to right order, the arguments that were passed to this function invocation.
  6. \n
  7. Let argCount be the number of elements in items.
  8. \n
  9. If len + argCount > 253 - 1, throw a TypeError exception.
  10. \n
  11. \n

    Repeat, while items is not empty,

    \n
      \n
    • Remove the first element from items and let E be the value of the element.
    • \n
    • Perform ? Set(O, ! ToString(len), E, true).
    • \n
    • Set len to len + 1.
    • \n
    \n
  12. \n
  13. Perform ? Set(O, \"length\", len, true).
  14. \n
  15. Return len.
  16. \n
\n
\n

代码

\n
Array.prototype.myPush = function(){\n    var O = Object(this);\n    var len = O.length >>> 0;\n    var argCount = arguments.length;\n    // argCount or len may exceed MAX_SAFE_INTEGER, therefore argCount+len may not be safe\n    // do not use argCount + len > Number.MAX_SAFE_INTEGER\n    if(argCount > Number.MAX_SAFE_INTEGER - len){\n        throw TypeError('Invalid array length')\n    }\n\n    for(var k=0;k<argCount;k++){\n        O[len+k] = arguments[k];\n    };\n    len = len + argCount;\n    O.length = len;\n    return len;\n}
","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.push","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.push/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.some/"},"frontmatter":{"title":"手写Array.prototype.some"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.pop/"},"frontmatter":{"title":"手写Array.prototype.pop"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.reduce/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.reduce/page-data.json" new file mode 100644 index 0000000..50489d8 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.reduce/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.reduce/","result":{"data":{"markdownRemark":{"id":"3e05ec7f-10db-5f38-a5e0-6b538033dd72","excerpt":"前端知识复习 code snippet 先看 array.prototype.reduce 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable…","html":"

前端知识复习 code snippet

\n

先看 array.prototype.reduce 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. \n
  7. If len is 0 and initialValue is not present, throw a TypeError exception.
  8. \n
  9. Let k be 0.
  10. \n
  11. Let accumulator be undefined.
  12. \n
  13. \n

    If initialValue is present, then

    \n
      \n
    • Set accumulator to initialValue.
    • \n
    \n
  14. \n
  15. \n

    Else,

    \n
      \n
    • Let kPresent be false.
    • \n
    • \n

      Repeat, while kPresent is false and k < len,

      \n
        \n
      • Let Pk be ! ToString(k).
      • \n
      • Set kPresent to ? HasProperty(O, Pk).
      • \n
      • If kPresent is true, then
      • \n
      • Set accumulator to ? Get(O, Pk).
      • \n
      \n
    • \n
    • Set k to k + 1.
    • \n
    • If kPresent is false, throw a TypeError exception.
    • \n
    \n
  16. \n
  17. \n

    Repeat, while k < len,

    \n
      \n
    • Let Pk be ! ToString(k).
    • \n
    • Let kPresent be ? HasProperty(O, Pk).
    • \n
    • \n

      If kPresent is true, then

      \n
        \n
      • Let kValue be ? Get(O, Pk).
      • \n
      • Set accumulator to ? Call(callbackfn, undefined, « accumulator, kValue, k, O »).
      • \n
      \n
    • \n
    • Set k to k + 1.
    • \n
    \n
  18. \n
  19. Return accumulator.
  20. \n
\n
\n

代码

\n
Array.prototype.myReduce = function(callbackfn, initialValue) {\n  // this must not be null or undefined\n  if (this == null) {\n    throw new TypeError('Array.prototype.reduce called on null or undefined');\n  }\n  // callbackfn must be a function\n  if (typeof callbackfn !== 'function') {\n    throw new TypeError(callbackfn + ' is not a function');\n  }\n\n  var O = Object(this);\n  var len = O.length >>> 0;\n\n  var k = 0,\n    accumulator = initialValue;\n  // get initialValue\n  find_initial: if (accumulator == undefined) {\n    for (; k < len; k++) {\n      if (k in O) {\n        accumulator = O[k++];\n        break find_initial;\n      }\n    }\n    // end of iteration with no initialValue found, throw empty array error\n    throw new TypeError('myReduce of empty array with no initial value');\n  }\n\n  // iterate array and merge results\n  for (; k < len; k++) {\n    if (k in O) {\n      var kValue = O[k];\n      accumulator = callbackfn(accumulator, kValue, k, O);\n    }\n  }\n  return accumulator;\n};
","frontmatter":{"date":"May 21, 2020","title":"手写Array.prototype.reduce","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.reduce/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.map/"},"frontmatter":{"title":"手写Array.prototype.map"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.filter/"},"frontmatter":{"title":"手写Array.prototype.filter"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231Array.prototype.some/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.some/page-data.json" new file mode 100644 index 0000000..ed9ca35 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231Array.prototype.some/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写Array.prototype.some/","result":{"data":{"markdownRemark":{"id":"5010b486-92c1-5f77-be25-2154d3d877ad","excerpt":"前端知识复习 code snippet array.prototype.some 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn) is…","html":"

前端知识复习 code snippet

\n

array.prototype.some 标准

\n
\n
    \n
  1. Let O be ? ToObject(this value).
  2. \n
  3. Let len be ? LengthOfArrayLike(O).
  4. \n
  5. If IsCallable(callbackfn) is false, throw a TypeError exception.
  6. \n
  7. Let k be 0.
  8. \n
  9. \n

    Repeat, while k < len,

    \n
      \n
    • Let Pk be ! ToString(k).
    • \n
    • Let kPresent be ? HasProperty(O, Pk).
    • \n
    • \n

      If kPresent is true, then

      \n
        \n
      • Let kValue be ? Get(O, Pk).
      • \n
      • Let testResult be ! ToBoolean(? Call(callbackfn, thisArg, « kValue, k, O »)).
      • \n
      • If testResult is true, return true.
      • \n
      \n
    • \n
    \n
  10. \n
  11. Set k to k + 1.
  12. \n
  13. Return false.
  14. \n
\n
\n

代码

\n
Array.prototype.mySome = function(callbackfn, thisArg){\n    if(this == undefined){\n        throw TypeError('Cannot read property filter of '+ this);\n    }\n    if(typeof callbackfn !== 'function'){\n        throw TypeError(callbackfn + ' is not a function')\n    }\n\n    var O = Object(this);\n    var len = O.length >>> 0;\n    for(var k=0;k<len;k++){\n        if(k in O){\n            var kValue = O[k];\n            if(callbackfn.call(thisArg, kValue,k,O)) return true;\n        }\n    }\n    return false;\n}
","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.some","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写Array.prototype.some/","previous":{"fields":{"slug":"/Blog/手写Array.prototype.forEach/"},"frontmatter":{"title":"手写Array.prototype.forEach"}},"next":{"fields":{"slug":"/Blog/手写Array.prototype.push/"},"frontmatter":{"title":"手写Array.prototype.push"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231bind/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231bind/page-data.json" new file mode 100644 index 0000000..bcfea3d --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231bind/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写bind/","result":{"data":{"markdownRemark":{"id":"2a0b1fca-b55a-56ee-9ad0-63d480e9aa31","excerpt":"前端知识复习 code snippet Function.prototype.bind 标准 When the bind method is called with argument thisArg and zero or more args, it performs the…","html":"

前端知识复习 code snippet

\n

Function.prototype.bind 标准

\n
\n

When the bind method is called with argument thisArg and zero or more args, it performs the following steps:

\n
    \n
  1. Let Target be the this value.
  2. \n
  3. If IsCallable(Target) is false, throw a TypeError exception.
  4. \n
  5. Let F be ? BoundFunctionCreate(Target, thisArg, args).
  6. \n
  7. Let L be 0.
  8. \n
  9. Let targetHasLength be ? HasOwnProperty(Target, \"length\").
  10. \n
  11. \n

    If targetHasLength is true, then\na. Let targetLen be ? Get(Target, \"length\").\nb. If Type(targetLen) is Number, then

    \n
      \n
    • If targetLen is +∞𝔽, set L to +∞.
    • \n
    • Else if targetLen is -∞𝔽, set L to 0.
    • \n
    • \n

      Else,

      \n
        \n
      • Let targetLenAsInt be ! ToIntegerOrInfinity(targetLen).
      • \n
      • Assert: targetLenAsInt is finite.
      • \n
      • Let argCount be the number of elements in args.
      • \n
      • Set L to max(targetLenAsInt - argCount, 0).
      • \n
      \n
    • \n
    \n
  12. \n
  13. Perform ! SetFunctionLength(F, L).
  14. \n
  15. Let targetName be ? Get(Target, \"name\").
  16. \n
  17. If Type(targetName) is not String, set targetName to the empty String.
  18. \n
  19. Perform SetFunctionName(F, targetName, \"bound\").
  20. \n
  21. Return F.
  22. \n
\n
\n

代码

\n
function myBind(thisArg,...args){\n    var target = this;\n    if(!isCallable(target)){\n        throw new Type Error(target+'.bind is not a function')\n    }\n\n    var bound = function () {};\n    var fBound = function () {\n        var bindArgs = Array.prototype.slice.call(arguments);\n\n        if (this instanceof bound) {\n            // constructor\n            var result = target.apply(this, args.concat(bindArgs));\n            if(Object(result)===result){\n                // constructor call returns a object\n                return result;\n            }\n            // returns an instance\n            return this;\n        } else {\n            // ordinary function call\n            return target.apply(thisArg, args.concat(bindArgs));\n        }\n    };\n    // keep prototype chain\n    bound.prototype = target.prototype;\n    fBound.prototype = new bound();\n    return fBound;\n    \n}\n\nfunction isCallable(obj){\n    return typeof obj === 'function';\n}
","frontmatter":{"date":"June 17, 2020","title":"手写bind","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写bind/","previous":{"fields":{"slug":"/Blog/Design Systems with Storybook/"},"frontmatter":{"title":"Design Systems with Storybook"}},"next":{"fields":{"slug":"/Blog/Server-Side GraphQL/"},"frontmatter":{"title":"Server-Side GraphQL"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231instanceof/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231instanceof/page-data.json" new file mode 100644 index 0000000..240c32f --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231instanceof/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写instanceof/","result":{"data":{"markdownRemark":{"id":"9b39a23f-9cb2-5e10-8493-44f92d28297c","excerpt":"前端知识复习 code snippet instanceof 标准 If Type(target) is not Object, throw a TypeError exception. Let instOfHandler be ? GetMethod(target…","html":"

前端知识复习 code snippet

\n

instanceof 标准

\n
\n
    \n
  1. If Type(target) is not Object, throw a TypeError exception.
  2. \n
  3. Let instOfHandler be ? GetMethod(target, @@hasInstance).
  4. \n
  5. \n

    If instOfHandler is not undefined, then

    \n
      \n
    • Return ! ToBoolean(? Call(instOfHandler, target, « V »)).
    • \n
    \n
  6. \n
  7. If IsCallable(target) is false, throw a TypeError exception.
  8. \n
  9. Return ? OrdinaryHasInstance(target, V).
  10. \n
\n
\n

代码

\n
function myInstanceof(left,right){\n    if(!isObject(right)){\n        throw new Error('right-hand side of instanceof is not an object')\n    }\n    var instOfHandler = right[Symbol.hasInstance];\n    if(instOfHandler){\n        return Boolean(instOfHandler.call(right, left));\n    };\n    if(!isFunction(right)){\n        throw new Error('right-hand side of instanceof is not callable');\n    }\n    if(!isObject(left)) return false;\n\n    var proto = Object.getPrototypeOf(left);\n    if(!isObject(proto)){\n        throw new Error('prototype must be an object')\n    }\n    while(proto){\n        if(proto === right.prototype){\n            return true;\n        }\n        proto = Object.getPrototypeOf(proto);\n    }\n    return false;\n}\n\nfunction isFunction(obj){\n    return typeof obj === 'function';\n}\n\nfunction isObject(obj){\n    return obj !== null && typeof obj === 'object' || isFunction(obj);\n}
","frontmatter":{"date":"June 15, 2020","title":"手写instanceof","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写instanceof/","previous":{"fields":{"slug":"/Blog/Vue实例方法的this指向/"},"frontmatter":{"title":"Vue实例方法的this指向"}},"next":{"fields":{"slug":"/Blog/Client-Side GraphQL/"},"frontmatter":{"title":"Client-Side GraphQL"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\211\213\345\206\231new/page-data.json" "b/page-data/Blog/\346\211\213\345\206\231new/page-data.json" new file mode 100644 index 0000000..b338932 --- /dev/null +++ "b/page-data/Blog/\346\211\213\345\206\231new/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/手写new/","result":{"data":{"markdownRemark":{"id":"f28f6d8e-a799-5a30-89f3-82317cbfc986","excerpt":"前端知识复习 code snippet 根据MDN,new主要做了4件事情 The new keyword does the following things: Creates a blank, plain JavaScript object; Links (sets the…","html":"

前端知识复习 code snippet

\n

根据MDN,new主要做了4件事情

\n
\n

The new keyword does the following things:

\n
    \n
  1. Creates a blank, plain JavaScript object;
  2. \n
  3. Links (sets the constructor of) this object to another object;
  4. \n
  5. Passes the newly created object from Step 1 as the this context;
  6. \n
  7. Returns this if the function doesn't return an object.
  8. \n
\n
\n

因为new是操作符,没有办法直接实现,只有写一个function myNew(constructor[, arguments])的方法
\n第一个参数是要构造函数,剩下的是待传入的parameter(也可以为空)

\n

代码

\n
function myNew(){\n    var constructor = Array.prototype.shift.call(arguments);\n    // constructor不是函数,抛出错误\n    if(typeof constructor != 'function'){\n        throw TypeError(constructor+'is not a constructor');\n    }\n    // 取得要返回的this\n    var instance = Object.create(constructor.prototype);\n    // 取得constructor自身执行的返回值\n    var ret = constructor.apply(instance, arguments);\n\n    return typeof ret == 'object' && ret != null ? ret : instance;\n\n}
\n

一点问题

\n

上面代码还是有个比较明显的问题:\nObject.create是一个基于new的语法糖方法,所以myNew本质上还是调用了new,有点循环论证的意思

","frontmatter":{"date":"May 28, 2020","title":"手写new","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/手写new/","previous":{"fields":{"slug":"/Blog/Svelte初探/"},"frontmatter":{"title":"Svelte初探"}},"next":{"fields":{"slug":"/Blog/Vue实例方法的this指向/"},"frontmatter":{"title":"Vue实例方法的this指向"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\346\220\255\345\273\272RN\345\274\200\345\217\221\347\216\257\345\242\203/page-data.json" "b/page-data/Blog/\346\220\255\345\273\272RN\345\274\200\345\217\221\347\216\257\345\242\203/page-data.json" new file mode 100644 index 0000000..33ae0b8 --- /dev/null +++ "b/page-data/Blog/\346\220\255\345\273\272RN\345\274\200\345\217\221\347\216\257\345\242\203/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/搭建RN开发环境/","result":{"data":{"markdownRemark":{"id":"3facfde5-dfed-54ef-8348-7f5817fbc5b4","excerpt":"最近开始用 RN 做项目,第一步当然是搭建开发环境,不过 RN 的环境搭建真是一件要命的事情,不熟悉的话会折腾很久的。 windows 下环境搭建 Mac 下环境搭建 从项目代码开始构建","html":"

最近开始用 RN 做项目,第一步当然是搭建开发环境,不过 RN 的环境搭建真是一件要命的事情,不熟悉的话会折腾很久的。

\n

windows 下环境搭建

\n

Mac 下环境搭建

\n

从项目代码开始构建

","frontmatter":{"date":"August 31, 2017","title":"搭建RN开发环境","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/搭建RN开发环境/","previous":{"fields":{"slug":"/Blog/The Virtual DOM阅读笔记/"},"frontmatter":{"title":"The Virtual DOM阅读笔记"}},"next":{"fields":{"slug":"/Blog/header title在Android下不居中问题的解决技巧/"},"frontmatter":{"title":"header title在Android下不居中问题的解决技巧"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\347\224\250Gatsby\351\207\215\345\206\231\344\272\206\345\215\232\345\256\242/page-data.json" "b/page-data/Blog/\347\224\250Gatsby\351\207\215\345\206\231\344\272\206\345\215\232\345\256\242/page-data.json" new file mode 100644 index 0000000..0947753 --- /dev/null +++ "b/page-data/Blog/\347\224\250Gatsby\351\207\215\345\206\231\344\272\206\345\215\232\345\256\242/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/用Gatsby重写了博客/","result":{"data":{"markdownRemark":{"id":"9b252f6d-1912-5ff3-a78e-f3b262435809","excerpt":"花了 3,4 天,用 Gatsby 断断续续的重写了之前的博客,现在是 SPA 了,哈哈哈。Gatsby 包装了各种插件,用起来挺方便,最关键是不用自己配置 webpack 了,省事不少。当然了,新东西 bug…","html":"

花了 3,4 天,用 Gatsby 断断续续的重写了之前的博客,现在是 SPA 了,哈哈哈。Gatsby 包装了各种插件,用起来挺方便,最关键是不用自己配置 webpack 了,省事不少。当然了,新东西 bug 和偏门也挺多的,改造这个博客就踩了不少坑。

\n

发布到了个人 github page 上,用 lighthouse 测试了下性能,评分很高。PWA 和 Accessibility 的部分没来得及做完,现在只有基本内容,以后慢慢折腾。

\n

嗯,暂时就这些。

","frontmatter":{"date":"December 16, 2018","title":"用Gatsby重写了博客","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/用Gatsby重写了博客/","previous":{"fields":{"slug":"/Blog/译-写给恐龙的现代Javascript指南/"},"frontmatter":{"title":"[译]写给恐龙的现代Javascript指南"}},"next":{"fields":{"slug":"/Blog/2018总结与2019希望/"},"frontmatter":{"title":"2018总结与2019希望"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\347\233\270\347\255\211\346\223\215\344\275\234\347\254\246/page-data.json" "b/page-data/Blog/\347\233\270\347\255\211\346\223\215\344\275\234\347\254\246/page-data.json" new file mode 100644 index 0000000..d48e3fb --- /dev/null +++ "b/page-data/Blog/\347\233\270\347\255\211\346\223\215\344\275\234\347\254\246/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/相等操作符/","result":{"data":{"markdownRemark":{"id":"370dd3a5-9614-5664-be9d-c20ad770a15a","excerpt":"引子 操作符运算规则 全等操作符判定规则 - Strict Equality Comparison(SEC) 相等操作符判定规则 - Abstract Equality Comparison(AEC) 对象转换基本类型规则 - Object To Primitive(OTP…","html":"\n
\n

引子

\n

在网上看到了几个关于相等操作符的面试题,除了 1,其他都一头雾水。\n再次证明基础不牢固,有必要深入学习一下。

\n
1. []==[]     //false\n2. []==![]    //true\n3. {}==!{}    //false\n4. {}==![]    //Uncaught SyntaxError: Unexpected token ==\n5. ![]=={}    //false\n6. []==!{}    //true\n7. undefined==null //true
\n

操作符运算规则

\n
\n

相等操作符: ==\n全等操作符: ===

\n
\n

根据 JS 高程里的定义,操作符如上所示,但高程里全等操作符的计算规则有点语焉不详,查询 ECMA 后列举如下:

\n
全等操作符判定规则 - Strict Equality Comparison(SEC)
\n
    \n
  1. 如果x, y类型不同,返回false
  2. \n
  3. 如果x, yundefined,返回true
  4. \n
  5. 如果x, ynull,返回true
  6. \n
  7. \n

    如果x, ynumber类型,那么:

    \n
      \n
    1. 如果x, y其中之一,或二者均为NaN,返回false
    2. \n
    3. 如果xy的值相同,返回true
    4. \n
    5. 如果x+0y-0,返回true
    6. \n
    7. 如果x-0y+0,返回true
    8. \n
    9. 其他情况返回false
    10. \n
    \n
  8. \n
  9. 如果x, ystring类型,那么当二者长度相同且字符顺序也一致时,返回true;否则返回false
  10. \n
  11. 如果x, yBoolean类型,那么当x, y均为true或均为false时,返回 true;否则返回false
  12. \n
  13. x, y为对象,二者指向同一对象时返回true;否则返回false
  14. \n
\n

例 1

\n
1 === []; //false\n//1为number,[]为对象,类型不同,根据SEC-1返回false\n\nundefined === undefined; //true\n//类型相同,根据SEC-2返回true\n\nnull === null; //true\n//类型相同,根据SEC-3返回true\n\nnull === undefined; // false\n//null为object,undefinedw为undefined,类型不同,根据SEC-1返回false\n\nNaN === 1; //false\n//类型相同,根据SEC-4.1返回false\n\nNaN === NaN; //false\n//类型相同,根据SEC-4.1返回false\n//NaN是唯一与自身不相等的数\n\n1 === true; //false\n//1为number,true为Boolean,类型不同,返回false\n\n'' === false; //false\n//''为string,false为Boolean,类型不同,返回false
\n
相等操作符判定规则 - Abstract Equality Comparison(AEC)
\n
    \n
  1. 如果 x, y 类型相同,按全等操作符判定规则进行比较
  2. \n
  3. 如果 x, y 一方为undefined,另一方为null,返回true
  4. \n
  5. 如果 x, y 一方为number,另一方为string,将string转换为number后再做比较
  6. \n
  7. 如果 x, y 一方为Boolean,将其转换为number后再做比较
  8. \n
  9. 如果 x, y 一方为对象,另一方为string, number, symbol,将对象转换为基本类型后再做比较
  10. \n
  11. 其他情况返回false
  12. \n
\n

AEC-5中涉及对象与基本类型的转换,ECMA中由内置方法ToPrimitive(x)实现,基本规则如下:

\n
对象转换基本类型规则 - Object To Primitive(OTP)
\n
    \n
  1. 如果x为日期Date类型,调用x.toString()返回日期字符串
  2. \n
  3. x为其他类型对象,首先调用x.valueOf(),如结果为基本类型,返回该值
  4. \n
  5. 如果2不满足,继续调用x.toString(),如结果为基本类型,返回该值
  6. \n
  7. \n

    3不满足,抛出TypeError异常

    \n
    \n

    注:

    \n
      \n
    1. 对象的valueOf()方法通常返回自身,因此绝大多数情况,转换为基本类型调用的是toString()方法
    2. \n
    3. 对象的默认toString()方法为Object.prototype.toString(),其输出值为字符串'[object objType]',其中objType为对象的类型,所以空对象{}.toString()的输出为'[object Object]'(注意一个是小写o,一个是大写O)
    4. \n
    5. 数组对象Array重写了toString()方法,其输出为Array.join('');如果不重写,其输出应为'[object Array]'
    6. \n
    \n
    \n
  8. \n
\n

例 2

\n
undefined == null; //true\n//根据AEC-2,返回true\n\n1 == true; //true\n//根据AEC-4,将Boolean转换为number,Number(true)为1,变为1 == 1\n//根据AEC-1及SEC-4.2,返回true\n\n'' == false; //true\n//根据AEC-4,将Boolean一方转换为number,Number(false)为0,变为'' == 0\n//根据AEC-3,将''转换为number,Number('')为0, 变为0 == 0\n//根据AEC-1及SEC-4.2,返回true\n\n'' == []; //true\n//根据AEC-3, OTP-注-2, OTP-注-3,空数组对象[]调用toString()方法\n//[].toString()输出为'',变为'' == ''\n//根据AEC-1及SEC-5,返回true\n\n'' == {}; //false\n//根据AEC-3, OTP-注-2,空对象{}调用toString()方法,\n//{}.toString()输出为'[object Object]',变为'' == '[object Object]'\n//根据AEC-1及SEC-5,返回false
\n

解题及分析

\n

规则介绍完了,下面根据规则解题

\n

题 1

\n
[] == []; //false
\n

分析:

\n
    \n
  • 二者均为数组对象,类型相同
  • \n
  • 二个空数组分别指向2个数组,根据SEC-7,返回false
  • \n
\n

题 2

\n
[] == ![]; //true
\n

分析:

\n
    \n
  • !逻辑非运算符先计算,![]值为false,表达式变为[] == false
  • \n
  • 类型不同,一方为Boolean类型,应用AEC-4,表达式变为[] == 0
  • \n
  • 一方为对象,应用AEC-5OTP-3OTP-注-3,表达式变为'' == 0
  • \n
  • 继续应用AEC-3,表达式变为0 == 0,返回true
  • \n
\n

题 3

\n
{}==!{}    //false
\n

分析:

\n
    \n
  • !逻辑非运算符先计算,表达式变为{} == false
  • \n
  • 类型不同,且一方为Boolean类型,根据AEC-4,表达式变为{} == 0
  • \n
  • 一方为对象,应用AEC-5OTP-3OTP-注-2,表达式变为'[object Object]' == 0
  • \n
  • 一方为number,应用AEC-3,表达式变为NaN == 0
  • \n
  • 二者同为number类型,应用SEC-4.1,返回false
  • \n
\n

题 4

\n
{}==![]    //Uncaught SyntaxError: Unexpected token ==
\n

分析:

\n
    \n
  • 浏览器会将{}部分解析为代码块,表达式等效为==![],因此报错
  • \n
  • 如果将表达式修改为({}) == ![],浏览器将能正确解析,分析过程及结果同题3
  • \n
\n

题 5

\n
![] == {}; //false
\n

分析:

\n
    \n
  • !逻辑非运算符先计算,表达式变为false == {}
  • \n
  • 剩余分析步骤同题3,表达式返回false
  • \n
\n

题 6

\n
[] == !{}; //true
\n

分析:

\n
    \n
  • !逻辑非运算符先计算,表达式变为[] == false
  • \n
  • 剩余分析步骤同题2,返回true
  • \n
\n

题 7

\n
undefined == null; //true
\n

分析:

\n
    \n
  • 类型不同,应用AEC-2,返回true
  • \n
","frontmatter":{"date":"September 15, 2018","title":"相等操作符","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/相等操作符/","previous":{"fields":{"slug":"/Blog/使用json-server搭建API模拟服务器/"},"frontmatter":{"title":"使用json-server搭建API模拟服务器"}},"next":{"fields":{"slug":"/Blog/加法操作符/"},"frontmatter":{"title":"加法操作符"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\347\247\273\345\212\250\347\253\257\347\275\221\351\241\265\350\260\203\350\257\225\346\212\200\345\267\247/page-data.json" "b/page-data/Blog/\347\247\273\345\212\250\347\253\257\347\275\221\351\241\265\350\260\203\350\257\225\346\212\200\345\267\247/page-data.json" new file mode 100644 index 0000000..1105b84 --- /dev/null +++ "b/page-data/Blog/\347\247\273\345\212\250\347\253\257\347\275\221\351\241\265\350\260\203\350\257\225\346\212\200\345\267\247/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/移动端网页调试技巧/","result":{"data":{"markdownRemark":{"id":"b4ea2cba-b13c-5b3a-94fd-2511d2b008c5","excerpt":"写在前面 这是4个月前的一篇工作记录,是上一篇Charles使用的扩展版。 因为平时用Mac,所以只列出了Mac调试不同移动端的情况,windows没有涉及。 在Mac下调试App常用3种手段: USB调试 使用腾讯开源的vConsole 使用Charles调试 USB…","html":"

写在前面

\n

这是4个月前的一篇工作记录,是上一篇Charles使用的扩展版。

\n

因为平时用Mac,所以只列出了Mac调试不同移动端的情况,windows没有涉及。

\n

在Mac下调试App常用3种手段:

\n
    \n
  1. USB调试
  2. \n
  3. 使用腾讯开源的vConsole
  4. \n
  5. 使用Charles调试
  6. \n
\n

USB调试

\n

iOS USB调试

\n

功能强大,可以修改网页元素,但有限制挺多的:

\n
    \n
  1. 只能在Mac系统调试移动端,windows的开发环境就不行了
  2. \n
  3. 要么调试浏览器打开的网页,要么是Xcode编译运行中的App内页,非编译版的App内页无法调试
  4. \n
\n

如果以上条件满足的话,那么可以按以下步骤开启调试:

\n
    \n
  1. USB连接手机,手机弹出的对话框选择信任当前电脑
  2. \n
  3. 在Mac上打开Safari,找到 Develop(或“开发”)->your iphone(即用户给手机取的名字),就能看到当前可调试的网页,任选一个打开就能在Safari中调试当前网页
  4. \n
\n

可以直接修改/插入DOM元素,也可以改样式,和直接调试网页一摸一样,所见即得,简直可以说是为所欲为

\n

Android USB调试

\n

Android调试也有一些限制条件:

\n
    \n
  1. Android版本在4.4以上,手机要打开USB调试模式,电脑端必须使用chrome浏览器
  2. \n
  3. 要么调试手机端浏览器打开的网页,要么调试开启了webview调试模式的App内页(WebView.setWebContentsDebuggingEnabled设为true,也就是测试版的App)
  4. \n
\n

可以按以下步骤开启调试:

\n
    \n
  1. 手机切换为开发者模式(不同手机开启方式差异太大,不细说了)
  2. \n
  3. 按照此链接内容完成后续配置:google官方文档: remote debugging
  4. \n
\n

之后就可以打开浏览器愉快的调试了,happy debugging~

\n

小结

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
平台要求适用情景是否需要修改代码
iOS只能在MacOS桌面端调试Safari网页
Xcode编译运行的App内页,不可用于真机App内页
AndroidAndroid 4.4以上
手机打开USB调试模式
使用Chrome浏览器调试
Chrome网页
测试版App内页(WebView.setWebContentsDebuggingEnabled设为true)
\n

\n

vConsole调试

\n

vConsole是腾讯开源调试工具,使用需要修改代码,有一定的侵入性。但是这个代价换来了所有平台的调试能力,在上面2种USB调试条件不满足的情况下,还是很值得使用的。

\n

事实上,因为大多数情况并不需要USB调试那种修改DOM的能力,目前我在需要调试App内页的时候,用的最多的就是vConsole。查看内嵌页的console输出和api接口返回都很省事,而且通过后端渲染也能控制只在测试环境使用vConsole,对线上环境没有任何影响。

\n

多数情况下,我觉得它是首要的调试手段。

\n

小结

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
平台要求适用情景是否需要修改代码
iOS各种浏览器网页
App内页
Android各种浏览器网页
App内页
\n

\n

Charles调试

\n

前一篇谈到了:使用Charles抓包移动端网络请求

\n

接口请求、文件下载请求都可以通过抓包查看,但Charles能做的还不止于此。

\n

打开Charles->Tools,如下图,红框中的3个工具算是Charles的高级功能了

\n

\n \n );\n

这就是一个网站了!现在假设你想导入别人写的库,比如说moment.js(它把时间格式化为可读形式)。 假设你可以像下面这样使用moment

\n
moment()\n  .startOf('day')\n  .fromNow(); // 20 hours ago
\n

但你首先得在网站里引入 moment.js。在 moment.js 首页上能看到以下说明:

\n

\n

右侧Install这一栏里有很多内容。暂时先忽略,我们可以下载moment.min.js文件到网站文件夹里,并在index.html里引用它。

\n
<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>Example</title>\n    <link rel=\"stylesheet\" href=\"index.css\" />\n    <script src=\"moment.min.js\"></script>\n    <script src=\"index.js\"></script>\n  </head>\n  <body>\n    <h1>Hello from HTML!</h1>\n  </body>\n</html>
\n

注意moment.min.jsindex.js先加载,这样你就可以在index.js里使用moment函数:

\n
// index.js\nconsole.log('Hello from JavaScript!');\nconsole.log(\n  moment()\n    .startOf('day')\n    .fromNow()\n);
\n

这就是使用 JS 库开发网站的方式!好处是非常容易理解。不足在于每次库更新都要下载它的新版本,这很繁琐。

\n

使用 JavaScript 包管理器(npm)

\n

2010 年开始,一批互相竞争的 JavaScript 包管理器出现,通过从中心仓库下载和更新库实现了这个过程的自动化。Bower可以说是 2013 年最受欢迎的包管理器,但最终在 2015 年左右被npm取代。(2016 年下半年,yarn作为 npm 的替代品吸引了大量关注,但本质上它仍然使用 npm 包管理技术)
\n说明一下,npm 起初只是node.js的专用包管理器。node 运行在服务端,不是前端。前端的包管理器选择运行在服务器端的库,有点不正常啊。

\n
\n

注:使用包管理器需要掌握命令行,过去的前端开发中并没有这个要求。如果你从来没用过,可以从这个入门指南开始。总而言之,掌握命令行是现代 JavaScript 中一项重要内容(命令行也让其它领域的开发成为可能)。

\n
\n

看一下如何使用 npm 自动安装 moment.js。如果你已经安装了 node.js,你就有了 npm。你就可以通过命令行访问index.html的文件夹并输入:

\n
$ npm init
\n

之后会弹出一系列问题(直接选默认就行,一直点回车),并生成package.json文件。这是 npm 用来保存项目信息的配置文件。默认选项的package.json的内容如下:

\n
{\n  \"name\": \"your-project-name\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}
\n

我们现在可以按照 moment.js 主页的说明安装了,命令行输入下面这条命令:

\n
$ npm install moment --save
\n

这条命令做了 2 件事情:一,它下载 moment.js 的所有代码,并保存在node_modules文件夹里。二,它自动修改package.json文件,把 moment.js 作为项目依赖。

\n
{\n  \"name\": \"modern-javascript-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {    \"moment\": \"^2.22.2\"  }}
\n

这在后面与他人共享项目时很有用——不再共享node_modules文件夹(这个文件夹可能很大),只需要共享package.json文件,其他人就能通过npm install自动安装需要的包。

\n

我们再也不用手动下载 moment.js 了,可以使用 npm 自动下载和更新。打开node_modules文件夹,可以看到moment.min.js文件出现在node_modules/moment/min文件夹。这样就可以在index.html中链接下载好的moment.min.js版本:

\n
<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>JavaScript Example</title>\n    <script src=\"node_modules/moment/min/moment.min.js\"></script>    <script src=\"index.js\"></script>\n  </head>\n  <body>\n    <h1>Hello from HTML!</h1>\n  </body>\n</html>
\n

优点是我们现在可以通过命令行使用 npm 下载和更新包。不足是现在得从node_modules里找到每个包的路径并手动添加到 HTML 中。太麻烦了,下面会谈到怎么让这个过程也实现自动化。

\n

\n

使用 JavaScript 模块打包工具(webpack)

\n

大多数编程语言支持将一个文件的代码导入到另一个文件。JavaScript 开始并没有这个功能,因为 JavaScript 开始只在浏览器运行,没有访问客户端电脑文件系统的权限(因为安全原因)。所以一直以来,组织多文件的 JavaScript 代码需要将各文件变量作为全局导入。

\n

我们在上面 moment.js 例子里也是这么做的——HTML 加载整个moment.min.js文件,定义了一个全局变量moment,这样后加载的文件都可以访问它(不管他们是否需要访问这个变量)

\n

2009 年,名为 CommonJS 的项目启动了。它旨在规范浏览器端以外的 JavaScript 生态。CommonJS 的大部分内容是关于模块的标准,它让 JavaScript 像其他编程语言一样,最终实现了跨文件导入和导出代码的功能,结束了依赖全局变量的时代。CommonJS 标准最广为人知的实现是 node.js 。

\n

\n

之前提过,node.js 是在服务端运行的 JavaScript。之前的例子用 node.js 模块表示的话,是这样的。HTML 不再通过 script 标签加载moment.min.js,而是直接在 JavaScript 文件中导入:

\n
// index.js\nvar moment = require('moment');\n\nconsole.log('Hello from JavaScript!');\nconsole.log(\n  moment()\n    .startOf('day')\n    .fromNow()\n);
\n

这是 node.js 里加载模块的方式。它在 node.js 中一切正常,因为 node 是服务端语言,能够访问计算机文件系统。node.js 也知道每个 npm 模块的路径,因此只需要使用require('moment')语句,而不再需要require('./node_modules/moment/min/moment.min.js)(译注:即指明模块具体路径)——非常好。

\n

但这也只在 node.js 里行的通了,如果你在浏览器里使用这种方式,得到的只是“require未定义”的错误。浏览器没有访问文件系统的权限,因此通过这种方式加载模块非常困难——文件加载只能动态完成,要么是同步的(这会降低执行速度),要么是异步的(会出现时间不一致的问题)。

\n

于是模块打包工具应运而生。JavaScript 模块打包工具通过构建过程(过程中有文件访问权限)绕开了这个问题,它输出一个兼容浏览器的最终文件(即不需要访问文件系统)。这样就需要打包工具找到所有浏览器不兼容的require语句,将其替换成依赖文件的真实内容。最终输出是单个打包好的 JavaScript 文件(并且没有 require 语句)!

\n

曾经最流行的打包工具是Browserify,它在 2011 年发布,首先在前端支持 node.js 格式的 require 语句(这最终成就了 npm,让它成了前端包管理器)。2015 年左右,webpack后来居上,成为最广泛使用的打包工具(前端框架 React 的普及推动了这一过程,因为 React 充分利用了 webpack 的各种特性)。

\n

看看 webpack 怎么让前面require('moment')这个例子实现兼容浏览器的。首先需要在项目中安装 webpack。webpack 自身就是一个 npm 包,可以通过命令行安装:

\n
$ npm install webpack webpack-cli --save-dev
\n

注意安装的是 2 个包——webpack 和 webpack-cli(后者支持通过命令行使用 webpack)。再看 --save-dev参数——这个参数表示将安装包作为开发依赖保存,意思是安装包在开发环境中使用,但不会部署在生产服务器上。可以在package.json文件中看到,文件会自动更新:

\n
{\n  \"name\": \"modern-javascript-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"moment\": \"^2.19.1\"\n  },\n  \"devDependencies\": {    \"webpack\": \"^4.17.1\",    \"webpack-cli\": \"^3.1.0\"  }}
\n

现在node_modules文件夹里安装好了 webpack 和 webpack-cli 包。你可以在命令行里使用 webpack-cli:

\n
$ ./node_modules/.bin/webpack index.js --mode=development
\n

这条命令将会运行安装好的 webpack,从index.js文件开始,搜索全部require语句,将它替换为合适的代码,最终创建单个输出文件(默认路径是dist/main.js)。--mode=development参数让 JavaScript 代码保持可读性,而--mode=production参数则会输出(不可读的)最小化的文件。

\n

得到 webpack 的dist/main.js输出文件后,我们就可以在浏览器中用它取代index.js,因为后者还包含非法的 require 语句。这个过程也能在index.html文件中体现:

\n
<!-- index.html -->\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>JavaScript Example</title>\n    <script src=\"dist/main.js\"></script>  </head>\n  <body>\n    <h1>Hello from HTML!</h1>\n  </body>\n</html>
\n

刷新浏览器就能发现现在和之前一样了!

\n

注意每次更改index.js,我们都需要运行 webpack 命令。这样很繁琐,并且在使用 webpack 高级功能时会变得更糟(比如从转换后的代码中生成source map辅助调试初始代码)。webpack 可以从项目根目录的配置文件中读取配置,配置文件名为webpack.config.js,在本文的例子是这样的:

\n
// webpack.config.js\nmodule.exports = {\n  mode: 'development',\n  entry: './index.js',\n  output: {\n    filename: 'main.js',\n    publicPath: 'dist',\n  },\n};
\n

现在每次修改index.js时,可以哦那个过下面这条命令运行 webpack:

\n
$ ./node_modules/.bin/webpack
\n

我们不再需要指定index.js--mode=development设置了,因为 webpack 会从webpack.config.js加载这些配置。现在好些了,但仍显得繁琐,每次修改代码还是需要输入这串命令——下面会让这个过程更简单一些。

\n

总之,上面这些步骤看起来并不多,但这种流程有巨大的优势。我们不再需要以全局变量的形式加载外部文件了。不必在 HTML 文件里增加<script>标签了,所有 JavaScript 的新库都能通过 JavaScript 的require语句加载。单一的 JS 打包文件也意味着更好的性能。加入构建过程之后,还可以在工作流中加入其他的强大功能。

\n

\n

转换代码以支持新语言特性(babel)

\n

代码转换是指将一种语言的代码转换为另一种相似语言的代码。这是前端开发的一个重要部分——因为浏览器对新特性的支持进展缓慢,所以新语言的实验性功能得转译为兼容浏览器的语言。

\n

对 CSS 来说,现在有SassLessStylus,等等。对 JavaScript 来说,曾经有红极一时的CoffeScript(大约发布于 2010 年),而现在人们用得最多的则是babelTypeScript。CoffeeScript 这门语言,通过显著改变 JavaScript 来实现优化后者的目的——可选括号,有意义的留白,等等。babel 并不是一个新语言,而是一个转换器,它将所有浏览器尚未支持的新一代 JavaScript 特性(ES2015及之后的版本)转换为更兼容的 ES5 JavaScript 版本。TypeScript 本质上与新一代 JavaScript 相同,但还支持可选的静态类型。很多人选择使用 babel,因为它与原生 JavaScript 最相似。

\n

看看如何在 webpack 构建过程中使用 babel。首先需要在项目中通过命令行安装 babel(它是个 npm 包):

\n
$ npm install @babel/core @babel/preset-env babel-loader --save-dev
\n

注意,作为开发依赖,我们安装了 3 个独立的包——@babel/core是 babel 的主题,@babel/preset-env是预设,决定转换 JavaScript 的哪些新特性,而babel-loader是让 babel 能与 webpack 协同的包。可以编辑webpack.config.js来设置 webpack 使用babel-loader,方法如下:

\n
// webpack.config.js\nmodule.exports = {\n  mode: 'development',\n  entry: './index.js',\n  output: {\n    filename: 'main.js',\n    publicPath: 'dist',\n  },\n  module: {    rules: [      {        test: /\\.js$/,        exclude: /node_modules/,        use: {          loader: 'babel-loader',          options: {            presets: ['@babel/preset-env'],          },        },      },    ],  },};
\n

语法很不清晰(幸好我们不必经常修改)。基本上就是告诉 webpack 查找每个.js 文件(node_modules文件夹里的除外)并使用babel-loader通过@babel/preset-env的预设进行转换。这里有更多关于 webpack 配置的内容。

\n

配置好了所有东西,现在可以用 ES2015 的语法写 JavaScript 了!下面是在index.html中使用 ES2015 模板字符串(template string)语法的例子:

\n
// index.js\nvar moment = require('moment');\nconsole.log('Hello from JavaScript!');\nconsole.log(\n  moment()\n    .startOf('day')\n    .fromNow()\n);\nvar name = 'Bob',  time = 'today';console.log(`Hello ${name}, how are you ${time}?`);
\n

还可以使用ES2015 import语句代替require加载模块,这在目前的代码库中很常见。

\n
// index.js\nimport moment from 'moment';\nconsole.log('Hello from JavaScript!');\nconsole.log(\n  moment()\n    .startOf('day')\n    .fromNow()\n);\nvar name = 'Bob',\n  time = 'today';\nconsole.log(`Hello ${name}, how are you ${time}?`);
\n

上例中,import语法和require没什么区别,但import在复杂情况下更灵活。修改index.js之后,我们需要通过命令行再运行一次 webpack。

\n
$ ./node_modules/.bin/webpack
\n

现在浏览器里刷新index.html。在我写这篇文章的时候,大多数现代浏览器已支持 ES2015 的全部特性,所以证实 babel 是否起作用有点难。你可以尝试用老浏览器比如 IE9,或者在bundle.js里搜索转换后的代码:

\n
// bundle.js\n// ...\nconsole.log('Hello ' + name + ', how are you ' + time + '?');\n// ...
\n

这段代码可以看到,为了兼容浏览器, babel 把 ES2015 的模板字符串转换为了普通 JavaScript 字符串拼接。可能这个例子没什么大不了的,但代码转换这个功能真的非常强大。比如async/await这种让人激动的 JavaScript 新功能,能够让你写出更好的代码。尽管代码转换有时显得既繁琐又痛苦,但在过去几年中它确实大大改善了 JavaScript 这门语言,因为它让开发者能够在当下测试未来的语言特性。

\n

还有一些没提到的内容,马上就完了。如果关注性能,我们应该压缩(minifying)打包后的文件。考虑到已经引入了构建过程,实现这个目标应该不难。我们每次修改代码后,也必须重新运行 webpack 命令行。下一步,我们将关注有哪些工具能够帮助我们。

\n

使用任务管理工具(npm scripts)

\n

我们已经使用构建过程来处理 JavaScript 模块了,自然也该使用任务管理工具。它能够自动化构建过程中的各个步骤。对前端开发来说,任务包括压缩代码,优化图片,执行测试等等。

\n

2013 年,grunt 是最普及的任务管理工具,随后出现了 gulp 。二者都依赖内置了其他命令行工具的插件。现在最受欢迎的工具似乎是 npm 包管理器内置的脚本,它不需要插件,直接调用其他命令行工具。

\n

写几个 npm 脚本,方便我们使用 webpack。只需要简单修改package.json文件:

\n
{\n  \"name\": \"modern-javascript-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"build\": \"webpack --progress --mode=production\",    \"watch\": \"webpack --progress --watch\"  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"moment\": \"^2.22.2\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"babel-loader\": \"^8.0.2\",\n    \"webpack\": \"^4.17.1\",\n    \"webpack-cli\": \"^3.1.0\"\n  }\n}
\n

我们增加了 2 个新脚本,buildwatch。执行 build 脚本,可以在命令行输入:

\n
$ npm run build
\n

这条命令会运行 webpack(使用wepack.config.js的配置),其中--progress参数会显示进度百分比,而--mode=production参数会为生产环境压缩代码。要执行watch脚本:

\n
$ npm run watch
\n

这条命令使用--watch参数,每次有 JavaScript 文件修改时,就自动重新运行 webpack。开发的福音。

\n

注意在package.json中的脚本执行时,不必指定完整路径,因为 node.js 知道每个 npm 模块的路径。太方便了!我们还可以安装 webpack-dev-server 让事情变得更方便,它是一个独立工具,能够创建一个实时加载的 web 服务器。把它作为开发依赖安装,输入以下命令:

\n
$ npm install webpack-dev-server --save-dev
\n

随后在package.json中添加一条 npm 脚本:

\n
{\n  \"name\": \"modern-javascript-example\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"build\": \"webpack --progress -p\",\n    \"watch\": \"webpack --progress --watch\",\n    \"server\": \"webpack-dev-server --open\"  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"moment\": \"^2.19.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"babel-loader\": \"^8.0.2\",\n    \"webpack\": \"^3.7.1\",\n    \"webpack-dev-server\": \"^3.1.6\"\n  }\n}
\n

现在可以通过命令来启动开发服务器了:

\n
$ npm run server
\n

这条命令默认通过localhost:8080,自动在浏览器打开index.html网站。每次在index.js文件中修改代码,wepack-dev-server 都会重新构建打包文件,并自动刷新浏览器。它能大大节约我们的时间,因为这让我们只关注代码,而不必在浏览器效果与代码之间不断切换。

\n

上面的内容只是一点皮毛,关于 webpack 和 webpack-dev-server 还有很多设置(更多内容看这里)。你当然也可以使用 npm 脚本完成其他任务,比如把 Sass 转换为 CSS,压缩图片,执行测试——所有可以通过命令行完成的任务。npm 脚本自身还有一些高级设置和技巧——Kate Hudson这个演讲很不错:

\n

\n

结语

\n

总而言之,这就是现代 JavaScript。我们从只用 HTML 和 JS,到了使用包管理器自动下载第三方包,到使用模块打包工具创建单一脚本文件,再到使用转换器使用未来 JavaScript 特性,最后到使用任务管理工具自动化构建过程的各个步骤。内容很多,对新手尤甚。web 开发曾经是一个对新手友好的领域,主要是因为它易于上手;但现在却让人望而却步,尤其是各种快速变化的工具。

\n

但它并没有看起来那么可怕。生态正在稳定,特别是在前端拥抱 node 生态之后。npm 包管理器、node 模块中的 require 和 import 语句、还有任务管理工具 npm 脚本,他们都容易上手并且很少出差错。现在的工作流相比一两年之前已经大大简化了。

\n

现在的框架对新手和老手开发者一视同仁,通常自带初始配置工具。Ember 有ember-cli,它对 Angular 的angular-cli产生了极大影响,还有 React 的create-react-app,Vue 的vue-cli等等。这些工具会配置好一个项目的所有依赖——你可以直接开始写代码。但是,这些工具并非奇迹,它们也只是按照一定规则和可用性配置好了全部东西——你可能经常遇到需要额外配置 webpack,babel 的情况。所以理解每个工具的作用仍然至关重要,这正是本文所介绍的内容。

\n

现代 JavaScript 时常令人沮丧,因为它还在不停变化和升级。尽管看起来像是在不停的“造轮子”,但 JavaScript 的快速升级确实推动了一系列创新,比如 hot-reloading、real-time linting 和 time-travel debugging 等。开发是一项令人兴奋的工作,希望本文的内容能够帮助你在开发道路上走得更远。\n

","frontmatter":{"date":"December 08, 2018","title":"[译]写给恐龙的现代Javascript指南","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/译-写给恐龙的现代Javascript指南/","previous":{"fields":{"slug":"/Blog/parameter与argument/"},"frontmatter":{"title":"parameter与argument"}},"next":{"fields":{"slug":"/Blog/用Gatsby重写了博客/"},"frontmatter":{"title":"用Gatsby重写了博客"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\350\275\254-\345\246\202\344\275\225\346\234\211\346\225\210\345\234\260\345\206\231\347\256\227\346\263\225\351\242\230/page-data.json" "b/page-data/Blog/\350\275\254-\345\246\202\344\275\225\346\234\211\346\225\210\345\234\260\345\206\231\347\256\227\346\263\225\351\242\230/page-data.json" new file mode 100644 index 0000000..393185b --- /dev/null +++ "b/page-data/Blog/\350\275\254-\345\246\202\344\275\225\346\234\211\346\225\210\345\234\260\345\206\231\347\256\227\346\263\225\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/转-如何有效地写算法题/","result":{"data":{"markdownRemark":{"id":"0b8dd816-4830-5200-885f-0f2aa77f8ef3","excerpt":"…","html":"

这是一篇转载的文章,来自支付宝技术专家侯振宇
\n原文链接

\n\n
\n

这篇文章最早发在我团队的文档中。我的团队鼓励每个同学都在业余时间多做算法题,特别是新人。个人认为在编程能力的提升上比做 side project 更有用,对职业发展也是如此。当然出于兴趣做的 side project 另当别论。转到这里,希望对各位读者有用。

\n

如何有效地写算法题

\n

目的

\n

持续做算法题的目的仍然是自身能力提升。可以继续细化成三点:

\n
    \n
  • 保持思维敏捷。非常重要,状态好才能保持对编程的热情。
  • \n
  • 对基础的数据结构、查找和排序保持熟练。能解决日常开发中的性能相关问题。
  • \n
  • 积累对问题域的探索。只有对问题域有足够的探索,才可能举一反三,迸发灵感。
  • \n
\n

方法

\n

为了更有效地实现上面的目标。推荐用下面的方式来做题:

\n

严格使用番茄时钟进行规划

\n

在刷题的过程中非常最容易产生挫败感,无法坚持。原因是,长时间的思考导致疲倦,多次积累的疲倦使得自己产生了 抵触记忆。以至于会下意识觉得做题就是 刻苦。\n推荐大家在开始之前看看《意志力》。里面指出 喜好 是会被记忆操控的,如果每次做一件事最后留下的映像都是轻松愉快的,那么人就会越来越喜欢做此事,反之厌恶。所以为了能保持做题的兴趣,务必每次要主动给自己留下好的记忆。\n番茄时钟能够很好地保障不会出现 长时间 的思考,同时也能保障不容易 疲倦。如果你已经能很熟练的使用番茄时钟,请跳过。如果你对番茄时钟的印象仍然只是 20 分钟休息一次。那么请继续阅读。\n番茄时钟有两个重点,一是通过长期的训练,让大脑习惯在一段时间内保持高效。二是通过要求每次在开始前有规划和每次结束后有总结,保障产出。当把这两点应用到做算法的过程中时,应该采取以下的方式:

\n

用一个番茄时钟对题目进行彻底的分析

\n

目前 leetcode 上的题大致可分为两种类型:

\n
    \n
  • 对某种复杂规则的彻底解析,很有可能要构造状态机,充分考虑边界情况。
  • \n
  • 对某种数据结构及算法的应用。
  • \n
  • 对数学概念、遍历、动态规划等的综合应用。
  • \n
\n

在这个分析过程中首先要大致判断出属于哪一类。在掌握了基本的数据结构和算法后,应该能很好的判断是不是属于前两类。如果判断不出说明需要回头先重新复习基本数据结构。推荐《算法》一书。不要强行刷题。算法书的每种数据结构及算法的大概思路、解决的问题以及相应的时间和空间复杂度了解之后可以再回来。

\n

第一种情况

\n

例子:https://leetcode.com/problems/valid-number/description/

\n

这个番茄时钟内的目标是:

\n
    \n
  • 理清题目背后解法要用的技术
  • \n
  • 充分收集可能涉及到的边界
  • \n
\n

完成后应该有的总结是:

\n
    \n
  • 是否理清了要用的技术
  • \n
  • 是否有不确定的地方
  • \n
  • 收集到的边界是否能覆盖所有情况
  • \n
\n

如果发现在要用的技术中有不熟悉的地方,应该立即中断,开启另一个番茄时钟进行学习。切忌盲目尝试。当发现有不确定的地方时,重新开启一个番茄时钟,按照当前思路把不确定地方当成一个单独的算法问题进行解决。

\n

第二种情况

\n

例子:https://leetcode.com/problems/reverse-pairs/

\n

这一类题目通常采取遍历的方法一定都能找到解法。重点是找到最优解,因此需要提前有足够的数据结构的知识。数据结构可大致分为链(数组、栈、队列)、树、图。在这三类数据中要分别掌握排序和查找算法。特别是相应的时间复杂度。\n这类题目很好判断,通常题目中会描述了几个数据或者状态的关联的关系,然后需要你找出符合条件的某些数据。那么将题目中的关联关系转换成相应的数据结构,再使用对应算法就够了。要对数据结构的足够熟悉,才能知道如何转化。\n这种情况下番茄时钟的目标是:

\n
    \n
  • 将问题转化为对相应数据结构的问题。
  • \n
\n

总结是:

\n
    \n
  • 需不需要分情况讨论,需要一种数据结构还是多种
  • \n
  • 相应数据结构是否能完全覆盖题目问题中的所有情况
  • \n
\n

第三种情况

\n

例子:https://leetcode.com/problems/minimum-window-substring/

\n

这一类情况最好用排除法,发现不是第一种或者第二种,那么再往这种情况下考虑。这类题的特点是通常是发散性质,刚看到题目容易有思路,但不太容易找到最优解。这种情况下,也要先判断题目子类型。

\n
    \n
  • 如果发现题目能从遍历的角度解决问题,那么可以往遍历的优化上去想。例如是否在遍历的时候能够排除掉一些情况。或者通过排序等手段之后,能实现遍历时排除某些情况。
  • \n
  • 如果发现题目中存在多种约束关系,然后求某个值,那么可以往数学方程组上去想。
  • \n
  • 如果发现问题可以被递归解决,并且能够将递归方式转化成顺序方式,可以往动态规划上去想。
  • \n
\n

在这种情况下,番茄时钟的目标:

\n
    \n
  • 判断出题目类型。
  • \n
\n

总结:

\n
    \n
  • 是否有其他类型更适合。
  • \n
  • 是否需要多种手段结合。
  • \n
\n

执行时的番茄时钟

\n

当分析完之后,建议不要开始写代码,一定要休息片刻。执行阶段是对我们平时写代码状态的一种锻炼,应该非常珍惜。如果一个番茄时钟执行不完,应该拆分成多个。在这段时间中,设定的番茄时钟目标应该是:

\n
    \n
  • 高效地验证分析阶段的思路\n要实现执行高效,最重要的是养成良好的编码习惯,不要犯小错误。要始终朝着只要想清楚了,一次写好,不要调试的状态要求自己。这里常见的小错误有:
  • \n
  • 拼写错误。变量命名要足够清楚,不要用单个字母或者语意不明的单词。
  • \n
  • 数组边界未考虑。
  • \n
  • 空值未考虑。
  • \n
  • 用 Math.ceil 之类函数时未考虑清楚上下界。
  • \n
\n

调试超过写代码时间 30% 时说明状态非常有问题。在这个阶段的总结是:

\n
    \n
  • 是否完成了对分析的验证
  • \n
  • 编码过程是否足够高效
  • \n
\n

如果中间发现了分析阶段的错误或者疏漏。应该立即结束编码,休息。并且重新开启分析阶段的时钟。切忌边写边改方案。如果发现编码过程状态不够好,应该加长休息时间,或者干脆结束掉。不要给自己留下低效的映像。将任务留到第二天其实也可以检验自己第一天的思路是否足够系统化,如果是,那么第二天应该能很快的重新找回思路。

\n

任一番茄时钟结束时

\n

一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。\n在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。经过总结,这样题目才会变成你在此问题域中的积累。\n做好总结,让每道题都有最大的收获。一个月之后自己的状态应该会有很大变化。

\n

如何分享

\n

在这个仓库中进行解题分享时,建议大家就把自己番茄时钟的执行记录进行分享。最后标准的解法以及思路其实在 discussion 中都有。对他人有用的分享不是结果,而是:

\n
    \n
  • 你在番茄时钟中是如何规划的,也就是番茄时钟的目标。
  • \n
  • 你是如何分析,也就是思路。
  • \n
  • 你的结论是什么,或者是你在执行时除了什么问题。
  • \n
  • 你所总结出的题目的关键部分。也就是对问题域进行探索的经验。
  • \n
\n

祝各位成长快乐。

","frontmatter":{"date":"February 14, 2019","title":"[转] 如何有效地写算法题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/转-如何有效地写算法题/","previous":{"fields":{"slug":"/Blog/LeetCode-278-First Bad Version/"},"frontmatter":{"title":"[LeetCode 278] First Bad Version"}},"next":{"fields":{"slug":"/Blog/LeetCode-1-Two Sum/"},"frontmatter":{"title":"[LeetCode 1] Two Sum"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\351\203\250\347\275\262node\347\256\241\347\220\206\345\220\216\345\217\260\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\351\227\256\351\242\230/page-data.json" "b/page-data/Blog/\351\203\250\347\275\262node\347\256\241\347\220\206\345\220\216\345\217\260\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\351\227\256\351\242\230/page-data.json" new file mode 100644 index 0000000..afa45d1 --- /dev/null +++ "b/page-data/Blog/\351\203\250\347\275\262node\347\256\241\347\220\206\345\220\216\345\217\260\351\201\207\345\210\260\347\232\204\344\270\200\344\270\252\351\227\256\351\242\230/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/部署node管理后台遇到的一个问题/","result":{"data":{"markdownRemark":{"id":"6aef6008-329b-5323-abb5-95225f7b1387","excerpt":"写在前面 核心服务扩容,之前预定分配给node管理后台用的服务器不能用了。 不得不重新申请了一台服务器部署,结果部署成功后业务一直运行不起来,花了3天才排查到原因,真是尴尬。 这里记录一下,留作备忘。 背景信息 开始安装又卸载node…","html":"

写在前面

\n

核心服务扩容,之前预定分配给node管理后台用的服务器不能用了。

\n

不得不重新申请了一台服务器部署,结果部署成功后业务一直运行不起来,花了3天才排查到原因,真是尴尬。

\n

这里记录一下,留作备忘。

\n

背景信息

\n

开始安装又卸载node的操作直接导致了后续业务运行失败,当然这是后话了

\n

部署流程: 申请服务器 -> 配置CI和发布系统 -> 服务器安装node10 -> 兼容性考虑卸载node10 -> 安装node7 -> 发布业务

\n

问题一: CI打包文件过期,发布失败

\n

进入发布系统配置gitlab的发布分支,本以为这样就ok了,结果居然发布失败 - -!

\n

查发布日志发现Request failed with status code 404

\n

排查过程

\n
    \n
  1. 查看gitlab-ci,执行正常
  2. \n
  3. 重新打包,再次发布,继续报404
  4. \n
  5. 下载gitlab-ci的文件,查看内容ok
  6. \n
  7. 场外求助大佬,结果大佬查了一下jobs,告诉我因为过期,artifacts被移除了,所以发布失败...
  8. \n
\n
\n

// 菜鸡和大佬的对话

\n

大佬: 这个job id对应的artifacts被移除了,应该过期了
\n菜鸡: 为什么再次打包生成了artifacts,发布还是失败呢?明明可以从gitlab里下载到最新打包的artifacts
\n大佬: 因为gitlab的API不保证多次打包取最新结果,它只是按job id取artifacts
\n大佬: 重新提交一次,重新生成一个commit id就可以了
\n菜鸡: (似懂非懂)谢谢大佬!

\n
\n

解决方案

\n
    \n
  1. 重新提交,刷新commit id,重新ci打包
  2. \n
  3. 再次发布成功
  4. \n
\n

原因分析

\n

再次问了大佬之后,终于弄明白了原因。
\ngitlab只能通过API下载artifacts,而不是保存在固定文件路径里。所以公司自己弄了一个组件,通过拼接参数获得artifacts的下载地址,规则如下:

\n
    \n
  1. \n

    根据commit ID取最新的Pipeline ID

    \n
    \n

    API - Get a single commit

    \n

    Get a specific commit identified by the commit hash or name of a branch or tag.

    \n
    GET /projects/:id/repository/commits/:sha
    \n

    返回的字段中的last_pipeline就是最新的pipeline id

    \n
    \n
  2. \n
  3. \n

    根据最新的Pipeline ID取第一个成功的Job ID

    \n
    \n

    API - List pipeline jobs

    \n

    Get a list of jobs for a pipeline.

    \n
    GET /projects/:id/pipelines/:pipeline_id/jobs
    \n

    返回一个数组,根据status字段过滤掉执行失败Jobs,然后再取response[0]就是第一个成功的Job

    \n
    \n
  4. \n
  5. \n

    根据Job ID下载对应的artifacts

    \n
    \n

    API - Download a single artifact file by job ID

    \n

    Download a single artifact file from a job with a specified ID from within the job’s artifacts zipped archive. The file is extracted from the archive and streamed to the client.

    \n
    GET /projects/:id/jobs/:job_id/artifacts/*artifact_path
    \n

    返回要下载的artifacts文件流

    \n
    \n
  6. \n
\n

结论: 当有多次打包的时候,因为pipeline id不会变化,只要之前有成功的jobs生成artifacts,那么按照上面的规则,artifacts下载API就会指向它。当artifacts过期被清除后,自然就无法找到文件了,因此接口状态返回404失败,如下表所示:

\n
\n

API - Download a single artifact file by job ID 接口返回状态码

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
StatusDescription
200Sends a single artifact file
400Invalid path provided
404Build not found or no file/artifacts
\n
\n

问题二:忘记配置线上数据库

\n
\n

这个实在是有点尴尬,但是部署的时候真的忘记了配置线上数据库

\n
\n

发布成功后打开线上地址,发现迎接我的是nginx欢迎页,当时就知道完蛋了

\n

排查过程

\n
    \n
  1. 登陆服务器,pm2 list,发现所有node进程状态都是errored
  2. \n
  3. pm2 show app_name,查pm2的out和error日志
  4. \n
  5. 发现error log里一堆 Cannot read property 'models' of undefined
  6. \n
  7. 然后排查数据库相关的所有文件,发现没配置线上数据库- -
  8. \n
  9. 因为数据库没配置,数据库对象为undefined,然后脚本自动生成的数据库表对象统统变成了 property of undefined,自然无法运行。
  10. \n
\n

解决方案

\n

配置好线上数据库,然后再次发布,错误消失,终于看到业务界面了

\n

问题三:多个PM2守护进程互相干扰

\n

进入业务界面后,发现首页列表接口一直报错,提示api request error. Request failed with status code 403

\n

403显然是没有权限,这个错误消息看的我一脸懵逼...

\n

排查过程

\n
    \n
  1. \n

    错误消息显然不是我包装的,那只能来自其他地方

    \n

    因为列表请求分为2个步骤,第一步取数据库数据,第二步请求接口服务的数据,所以最可能的地方有2个:一是数据库请求报错了;二是列表接口调用的公司接口服务报错了

    \n
  2. \n
  3. \n

    排查数据库错误

    \n

    进一步试验发现不仅列表接口报错,新建接口也报了同样的错误。

    \n
      \n
    • 难以确定是否是数据库错误的情况下,查了数据库的数据,发现尽管新建接口报错,但是新建的数据都已经写入了数据库,似乎与数据库没关系
    • \n
    • 登陆服务器,继续排查列表接口,数据库请求操作那里打印数据,重启业务应用pm2 restart app_name,再次请求后查看日志,发现数据库请求能正常返回数据,基本排除数据库错误
    • \n
    \n
  4. \n
  5. \n

    排查接口服务错误

    \n

    既然数据库错误可以排除,那么自然开始排查接口服务错误

    \n
      \n
    • 在接口服务请求前后打印日志,做个标记,看看是否请求会报错,以及如果请求成功会返回什么数据
    • \n
    • 重启业务应用,再次请求接口后查看日志,发现日志只有接口服务请求前的输出,然后就报错了
    • \n
    • 基本上可以确定是请求接口服务导致的错误
    • \n
    \n
  6. \n
  7. \n

    接口服务大佬帮忙看日志

    \n

    到这一步我已经没什么办法了,只能跪求负责接口服务的大佬帮我看一下他那边的日志。

    \n
    \n

    这个接口服务是需要授权的,线上和测试环境都有独立的授权key,通过key+请求时间,应该就可以找到原因

    \n
    \n

    结果接口服务的日志里根本没有业务应用的任何请求,我当时的内心是崩溃的...

    \n
      \n
    • 大佬继续帮忙排查授权key,没发现问题
    • \n
    • 排查接口服务初始化的代码,没发现问题
    • \n
    • 排查传入接口服务的参数,没发现问题
    • \n
    • 大佬上服务器直接用node调用代码请求接口服务,居然好了,可以获取数据,同时接口服务的日志也记录到了这个请求
    • \n
    \n

    到这里,接口服务肯定是正常的,我的代码应该也是正常的,基本上只能是业务应用部署环境的原因了

    \n
  8. \n
  9. \n

    停止pm2,裸跑node

    \n

    考虑到大佬直接用node调用代码请求是成功的,我也照猫画虎,先停掉所有pm2的服务pm2 stop app_name,然后用node启动业务应用NODE_ENV=production node app_server.js

    \n

    见证奇迹的时刻到了,这样启动的业务完全正常,没有报任何错误,那么可以肯定问题来自于pm2了,下面继续排查

    \n
  10. \n
  11. \n

    起动单进程pm2

    \n

    为了排除pm2多进程间互相影响的可能性,我修改了pm2生产环境的配置文件,把它的进程数限制为1。

    \n

    然后就是套路操作,为了避免缓存影响,先停止服务,再删除当前应用,最后重新启动应用。

    \n

    访问应用页面,依然报错...我又崩溃了

    \n

    不过这一步再次确认了pm2就是问题根源,继续排查

    \n
  12. \n
  13. \n

    终于排查到错误

    \n

    经过大佬提示,查看了pm2相关的所有进程ps aux | grep pm2,发现居然有2个pm2 God Daemon守护进程

    \n

    大佬说很有可能问题就在这里了。

    \n
  14. \n
\n

解决方案

\n

杀掉多余的pm2 God Daemon守护进程,重启pm2服务,再次访问,终于不报错了...

\n

原因分析

\n

都是最开始安装再卸载node10的锅。

\n

咨询了运维大佬,告诉我服务器安装node的时候会安装nodejs,pm2和pm2-logrotate日志切片服务,卸载的时候会直接卸载nodejs服务,同时删除pm2的目录,但好像不会杀掉pm2的进程

\n

所以安装node7的时候,前一个pm2的进程还在运行,安装完成后2个pm2进程互相干扰。细节就不清楚了,反正对接口服务的请求在这样的情况下根本就没发出去。哎...

\n

总耗时:断断续续花了3天

\n

反馈运维:bug重现试验

\n

为了得到确切的结论:

\n
- 服务器卸载时是否会杀掉pm2进程\n- 遗漏杀掉前一个pm2进程,而直接安装新的node是否导致了问题三的bug
\n

和运维大佬沟通了一下,决定试试能否重现bug,这样运维大佬可以有针对性的更改部署脚本,避免下次还有人跟我踩一样的坑。

\n

一共做了2次试验,第一次是为了复现bug,第二次是为了排除bug,确定具体bug源究竟在哪里。

\n
    \n
  1. 第一次:复原bug过程
  2. \n
  3. 准备工作:停止pm2服务,杀掉所有pm2关联进程,卸载node及相关组件服务
  4. \n
  5. 恢复初始状态:安装node10 -> 卸载node10 -> 手动安装node7失败 -> 运维人工介入 -> 发布业务
  6. \n
  7. bug复现
  8. \n
  9. 第二次:每次安装卸载都杀掉进程,观察是否bug复现
  10. \n
  11. 准备工作: 在第一次的基础上,停止pm2服务,杀掉所有pm2关联进程,卸载node及相关组件服务
  12. \n
  13. 安装node10
  14. \n
  15. 停止所有pm2相关服务,杀掉pm2关联进程,卸载node10
  16. \n
  17. 安装node7,自动安装失败,运维人工介入
  18. \n
  19. 发布业务
  20. \n
  21. bug消失
  22. \n
","frontmatter":{"date":"October 10, 2019","title":"部署node管理后台遇到的几个问题","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/部署node管理后台遇到的一个问题/","previous":{"fields":{"slug":"/Blog/前端二年/"},"frontmatter":{"title":"前端二年"}},"next":{"fields":{"slug":"/Blog/nginx配置的一个小错误/"},"frontmatter":{"title":"nginx配置的一个小错误"}}}}} \ No newline at end of file diff --git "a/page-data/Blog/\351\205\215\347\275\256Nginx\345\222\214WebpackDevServer\346\224\257\346\214\201\345\274\200\345\217\221\347\216\257\345\242\203\347\203\255\346\233\264\346\226\260\345\222\214https\345\237\237\345\220\215\350\256\277\351\227\256/page-data.json" "b/page-data/Blog/\351\205\215\347\275\256Nginx\345\222\214WebpackDevServer\346\224\257\346\214\201\345\274\200\345\217\221\347\216\257\345\242\203\347\203\255\346\233\264\346\226\260\345\222\214https\345\237\237\345\220\215\350\256\277\351\227\256/page-data.json" new file mode 100644 index 0000000..cbf6663 --- /dev/null +++ "b/page-data/Blog/\351\205\215\347\275\256Nginx\345\222\214WebpackDevServer\346\224\257\346\214\201\345\274\200\345\217\221\347\216\257\345\242\203\347\203\255\346\233\264\346\226\260\345\222\214https\345\237\237\345\220\215\350\256\277\351\227\256/page-data.json" @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-post-js","path":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/","result":{"data":{"markdownRemark":{"id":"9e5c733d-c0a1-5de8-aac8-6790c0f6b061","excerpt":"开始之前,先推荐一个工具网站 用于测试配置文件中location匹配,感觉很方便 Nginx location match tester: https://nginx.viraptor.info/ 背景 node…","html":"

开始之前,先推荐一个工具网站

\n
\n

用于测试配置文件中location匹配,感觉很方便

\n

Nginx location match tester: https://nginx.viraptor.info/

\n
\n

背景

\n

node接入层+前端,新老业务共用域名

\n

新业务通过地址前缀来区分请求

\n

问题

\n

经过配置生产环境下可以正常访问,但:

\n
    \n
  1. 开发模式下无法从webpack-dev-server获取静态资源
  2. \n
  3. 无法实现dev-server热更新
  4. \n
\n

原因

\n

通过域名访问时,Nginx把新对应的业务请求转发给node

\n
    \n
  1. 因为开发模式下静态资源保存在webpack-dev-server里,其端口号与node监听端口不同,所以node无法找到静态资源,表现为资源请求失败
  2. \n
  3. \n

    webpack-dev-server热更新是基于websocket实现的,但是:

    \n
      \n
    • 请求的域名不同,Nginx无法响应
    • \n
    • Nginx不能响应websocket请求,也无法响应
    • \n
    \n
  4. \n
\n

解决方案

\n
    \n
  1. 开发模式下静态资源请求反向代理到webpack-dev-server
  2. \n
  3. 开发模式下修改webpack配置,使其热更新websocket请求域名与业务域名相同
  4. \n
  5. Nginx配置websocket响应规则,反向代理到webpack-dev-server
  6. \n
\n

具体代码

\n
//webpack config 追加配置\n// 静态资源发布配置\npublicPath: DEV ? 'https://www.example.com/dev' : 'https://www.example.com',\n// webpack-dev-server配置\ndevServer: {\n\tport,\n\thost,\n  // Invalid Host/Origin Header\n  disableHostCheck: true,\n  // 修改web socket端口和域名,让nginx可以解析响应\n  sockPort: 443,\n  sockHost: 'www.example.com'\n},
\n
server\n{\n    listen 80;\n\n    server_name www.example.com;\n    return  301 https://$host$request_uri;\n}\nserver\n{\n    listen 443 ssl;\n    server_name www.example.com;\n    index index.html index.htm index.php;\n    root /path/to/your/project;\n\t\n\t# ssl             on;\n    ssl_certificate /path/to/your/cert;\n    ssl_certificate_key /path/to/your/key;\n\n    error_log /path/to/your/error/log;\n    access_log /path/to/your/access/log combined;    \n\n\n    if ($host ~* ^example\\.com$)\n    {\n        rewrite ^/(.*)$ https://www.$host$request_uri  permanent;\n        break;\n    }\n    \n    #生产环境,node站点静态资源请求转发到node\n    location ^~ /node/assets {\n        proxy_pass http://node_proxy;\n    }\n\n    #开发环境下静态资源反向代理到 Webpack devServer\n    location ^~ /dev {\n        proxy_pass http://webpack_dev_server;\n    }\n\t\t\n    location ~* \\.(css|js)$ {\n\t    add_header Access-Control-Allow-Credentials  true;\n        add_header Access-Control-Allow-Origin https://www.example.com;\n    }\n\n    \n    ##websocket反向代理,支持dev-server热更新\n    location /sockjs-node {\n        proxy_set_header X-Real-IP  $remote_addr;\n        proxy_set_header X-Forwarded-For $remote_addr;\n        proxy_set_header Host $host;\n        proxy_pass http://webpack_dev_server;\n        proxy_redirect off;\n      \tproxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";  \n    }\n\n    \n\t\t#node服务\n    location /node {\n        proxy_store off;\n        proxy_redirect off;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header Host $http_host;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        proxy_set_header Remote-Host $remote_addr;\n        proxy_set_header X-Nginx-Proxy true;\n        proxy_pass http://node_proxy;\n    }\n}\nupstream node_proxy {\n    server 127.0.0.1:10110;\n}\n#webpack-dev-server服务器地址\nupstream webpack_dev_server {\n   server 127.0.0.1:10100;\n}
\n

总结

\n

其他方案:webpack-dev-server代理转发到Nginx

\n

这样在本地开发时就可以实现https访问+webpack-dev-server热更新了

\n

Done

","frontmatter":{"date":"January 07, 2020","title":"配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwkC0D//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABoQAAICAwAAAAAAAAAAAAAAAAERACAhMUH/2gAIAQEAAT8hQT3McFf/2gAMAwEAAgADAAAAEDDP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHBAAAgEFAQAAAAAAAAAAAAAAAREAECExUWFx/9oACAEBAAE/EFAwDTvCXwelxjkZSr//2Q==","aspectRatio":1.5060240963855422,"src":"/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg","srcSet":"/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg 750w,\n/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg 1500w,\n/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg 3000w,\n/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg 4288w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}}}},"pageContext":{"slug":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/","previous":{"fields":{"slug":"/Blog/Vue使用provide-inject特性注入皮肤配置/"},"frontmatter":{"title":"Vue使用provide-inject特性注入皮肤配置"}},"next":{"fields":{"slug":"/Blog/LeetCode-2-Add Two Numbers/"},"frontmatter":{"title":"LeetCode-2-Add Two Numbers"}}}}} \ No newline at end of file diff --git a/page-data/Portfolio/page-data.json b/page-data/Portfolio/page-data.json new file mode 100644 index 0000000..ec9139e --- /dev/null +++ b/page-data/Portfolio/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-portfolio-js","path":"/Portfolio/","result":{"data":{"bgImg":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHgrZcBP//EABcQAAMBAAAAAAAAAAAAAAAAAAAQIRH/2gAIAQEAAQUCpXq//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAGRABAQEAAwAAAAAAAAAAAAAAAQAREDFR/9oACAEBAAE/IQ8Tjsy2JRx//9oADAMBAAIAAwAAABAMP//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPxAxf//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPxClf//EABoQAQEBAAMBAAAAAAAAAAAAAAEAETFxkfD/2gAIAQEAAT8QU4PyHI9i1A+bABl11v/Z","aspectRatio":1.5090543259557343,"src":"/static/a51bc4e7c3864343bdada28464c50650/7a34f/arun-nallamayan-1207263-unsplash.jpg","srcSet":"/static/a51bc4e7c3864343bdada28464c50650/72227/arun-nallamayan-1207263-unsplash.jpg 750w,\n/static/a51bc4e7c3864343bdada28464c50650/d41e0/arun-nallamayan-1207263-unsplash.jpg 1500w,\n/static/a51bc4e7c3864343bdada28464c50650/7a34f/arun-nallamayan-1207263-unsplash.jpg 3000w,\n/static/a51bc4e7c3864343bdada28464c50650/f9e02/arun-nallamayan-1207263-unsplash.jpg 4500w,\n/static/a51bc4e7c3864343bdada28464c50650/9ad13/arun-nallamayan-1207263-unsplash.jpg 4928w","sizes":"(max-width: 3000px) 100vw, 3000px"}}}},"pageContext":{}}} \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json new file mode 100644 index 0000000..8fd6c2d --- /dev/null +++ b/page-data/app-data.json @@ -0,0 +1 @@ +{"webpackCompilationHash":"9336e4438754f3f2a2a6"} diff --git a/page-data/dev-404-page/page-data.json b/page-data/dev-404-page/page-data.json new file mode 100644 index 0000000..7aaecd3 --- /dev/null +++ b/page-data/dev-404-page/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---cache-dev-404-page-js","path":"/dev-404-page/","result":{"data":{"allSitePage":{"nodes":[{"path":"/Blog/Mac桌面端webview打开页面失败排查/"},{"path":"/Blog/Server-Side GraphQL/"},{"path":"/Blog/手写bind/"},{"path":"/Blog/Design Systems with Storybook/"},{"path":"/Blog/Client-Side GraphQL/"},{"path":"/Blog/手写instanceof/"},{"path":"/Blog/Vue实例方法的this指向/"},{"path":"/Blog/手写new/"},{"path":"/Blog/Svelte初探/"},{"path":"/Blog/background-image踩坑/"},{"path":"/Blog/scroll事件踩坑记录/"},{"path":"/Blog/手写Array.prototype.every/"},{"path":"/Blog/手写Array.prototype.pop/"},{"path":"/Blog/手写Array.prototype.push/"},{"path":"/Blog/手写Array.prototype.some/"},{"path":"/Blog/手写Array.prototype.forEach/"},{"path":"/Blog/手写Array.prototype.filter/"},{"path":"/Blog/手写Array.prototype.reduce/"},{"path":"/Blog/手写Array.prototype.map/"},{"path":"/Blog/BGP Hijacking/"},{"path":"/Blog/Intro to Docker/"},{"path":"/Blog/Websocket初步/"},{"path":"/Blog/Intro to Functional Programming/"},{"path":"/Blog/php调参优化小记/"},{"path":"/Blog/国际化和本地化初步/"},{"path":"/Blog/shell脚本合并csv文件/"},{"path":"/Blog/web图片优化初步/"},{"path":"/Blog/web性能测试-locust/"},{"path":"/Blog/web性能优化指标解析/"},{"path":"/Blog/响应式图片优化/"},{"path":"/Blog/web性能测试-jmeter/"},{"path":"/Blog/web性能测试初步/"},{"path":"/Blog/后端单元测试-数据库model/"},{"path":"/Blog/后端单元测试-接入层请求mock/"},{"path":"/Blog/web安全初步/"},{"path":"/Blog/后端单元测试-service/"},{"path":"/Blog/后端单元测试-Koa中间件测试/"},{"path":"/Blog/后端单元测试-controller/"},{"path":"/Blog/前端单元测试-测试组件/"},{"path":"/Blog/前端单元测试-Vue组件mock/"},{"path":"/Blog/前端单元测试-Axios对象Mock/"},{"path":"/Blog/前端单元测试-Vue对象Mock/"},{"path":"/Blog/入坑TypeScript/"},{"path":"/Blog/自己实现Promise/"},{"path":"/Blog/单元测试初步/"},{"path":"/Blog/前端错误监控与上报原理/"},{"path":"/Blog/多语言的判断优先级/"},{"path":"/Blog/HTTP2.0初步/"},{"path":"/Blog/HTTP缓存小结/"},{"path":"/Blog/XMLHttpRequest回顾/"},{"path":"/Blog/HTTPS初步/"},{"path":"/Blog/TCP三次握手/"},{"path":"/Blog/2019总结与2020年计划/"},{"path":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/"},{"path":"/Blog/nginx基本配置/"},{"path":"/Blog/LeetCode-2-Add Two Numbers/"},{"path":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/"},{"path":"/Blog/Vue使用provide-inject特性注入皮肤配置/"},{"path":"/Blog/iTerm2自动填充密码访问ssh/"},{"path":"/Blog/echarts封装Vue组件/"},{"path":"/Blog/echarts使用小记/"},{"path":"/Blog/使用eslint+prettier+husky规范项目代码风格/"},{"path":"/Blog/Vue中v-if和v-show遇到的小问题/"},{"path":"/Blog/ES2015-ES2020/"},{"path":"/Blog/mac终端中文显示数字编码的设置问题/"},{"path":"/Blog/HTML中自闭合Vue组件的bug/"},{"path":"/Blog/nginx配置的一个小错误/"},{"path":"/Blog/部署node管理后台遇到的一个问题/"},{"path":"/Blog/前端二年/"},{"path":"/Blog/JSBridge的一点总结/"},{"path":"/Blog/PM2遇到的一个小问题/"},{"path":"/Blog/一个关于babel的愚蠢小错误/"},{"path":"/Blog/Sequelize和MySql时间格式小记/"},{"path":"/Blog/移动端网页调试技巧/"},{"path":"/Blog/使用Charles抓包移动端网络请求/"},{"path":"/Blog/node开发遇到的一个小坑/"},{"path":"/Blog/一次App内页的bug溯源/"},{"path":"/Blog/CDN缓存不同步,一次线上调试的经历/"},{"path":"/Blog/2019半年小结/"},{"path":"/Blog/JavaScript中的原型链/"},{"path":"/Blog/判断有序数组B是否为有序数组A的子集/"},{"path":"/Blog/LeetCode-1-Two Sum/"},{"path":"/Blog/转-如何有效地写算法题/"},{"path":"/Blog/LeetCode-278-First Bad Version/"},{"path":"/Blog/LeetCode-88-Merge Sorted Array/"},{"path":"/Blog/LeetCode-461-Hamming Distance/"},{"path":"/Blog/开始刷leetcode/"},{"path":"/Blog/2018总结与2019希望/"},{"path":"/Blog/用Gatsby重写了博客/"},{"path":"/Blog/译-写给恐龙的现代Javascript指南/"},{"path":"/Blog/parameter与argument/"},{"path":"/Blog/恶趣味构造函数/"},{"path":"/Blog/typeof与instanceof/"},{"path":"/Blog/几个JS高阶函数的简单底层实现/"},{"path":"/Blog/array.indexof和array.includes/"},{"path":"/Blog/IEEE-754标准与JS中的number类型/"},{"path":"/Blog/JS中的隐式转换/"},{"path":"/Blog/加法操作符/"},{"path":"/Blog/相等操作符/"},{"path":"/Blog/使用json-server搭建API模拟服务器/"},{"path":"/Blog/FlatList和ScrollView的一个小问题/"},{"path":"/Blog/CST与GMT的差别/"},{"path":"/Blog/一次搞笑而深刻的bug调试/"},{"path":"/Blog/如何判断日期是否为今天/"},{"path":"/Blog/null和undefined的比较/"},{"path":"/Blog/JavaScript前端RSA加密/"},{"path":"/Blog/JavaScript编码URL/"},{"path":"/Blog/normalizr扁平化递归结构的json/"},{"path":"/Blog/Android模拟器访问本地web服务的url/"},{"path":"/Blog/RN Animated API使用/"},{"path":"/Blog/React-Navigation中去掉header下的阴影/"},{"path":"/Blog/Android键盘遮挡问题/"},{"path":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/"},{"path":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/"},{"path":"/Blog/实现自定义tabbar component/"},{"path":"/Blog/React-Navigation中tabNavigator去掉指示线/"},{"path":"/Blog/antd-mobile引用错误解决办法/"},{"path":"/Blog/RN0.53找不到remote debugger解决方案/"},{"path":"/Blog/react-native-init以指定版本创建project/"},{"path":"/Blog/StackNavigator Header增加“返回”按钮/"},{"path":"/Blog/header title在Android下不居中问题的解决技巧/"},{"path":"/Blog/搭建RN开发环境/"},{"path":"/Blog/The Virtual DOM阅读笔记/"},{"path":"/404/"},{"path":"/About/"},{"path":"/Blog/"},{"path":"/"},{"path":"/Portfolio/"},{"path":"/404.html"},{"path":"/Blog/Google XSS game Level 1/"}]}},"pageContext":{}}} \ No newline at end of file diff --git a/page-data/index/page-data.json b/page-data/index/page-data.json new file mode 100644 index 0000000..3180bc1 --- /dev/null +++ b/page-data/index/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-index-js","path":"/","result":{"data":{"site":{"siteMetadata":{"title":"Welcome to Alex's Midway","sloganHome":"An Old dog learning new tricks"}},"bgImg":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECBf/EABQBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAeFc1IB//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQABBQJf/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAFxAAAwEAAAAAAAAAAAAAAAAAABARAf/aAAgBAQABPyHCOr//2gAMAwEAAgADAAAAEEcv/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAFxABAQEBAAAAAAAAAAAAAAAAAQARIf/aAAgBAQABPxASMk7Dal7f/9k=","aspectRatio":1.5,"src":"/static/5b330a46e2073ce438b4ebf6ccbd2b1d/7a34f/paul-volkmer-638816-unsplash.jpg","srcSet":"/static/5b330a46e2073ce438b4ebf6ccbd2b1d/72227/paul-volkmer-638816-unsplash.jpg 750w,\n/static/5b330a46e2073ce438b4ebf6ccbd2b1d/d41e0/paul-volkmer-638816-unsplash.jpg 1500w,\n/static/5b330a46e2073ce438b4ebf6ccbd2b1d/7a34f/paul-volkmer-638816-unsplash.jpg 3000w,\n/static/5b330a46e2073ce438b4ebf6ccbd2b1d/f9e02/paul-volkmer-638816-unsplash.jpg 4500w,\n/static/5b330a46e2073ce438b4ebf6ccbd2b1d/51d5f/paul-volkmer-638816-unsplash.jpg 6000w","sizes":"(max-width: 3000px) 100vw, 3000px"}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Recently I've been reviewing Frontend basics and came across this XSS game made by Google Security Team, I believe. Although it was…","fields":{"slug":"/Blog/Google XSS game Level 1/"},"id":"2f1f8b91-417f-51ce-976a-efe06d73c404","frontmatter":{"date":"November 18, 2020","title":"Google XSS game - Level 1"}}},{"node":{"excerpt":"背景 公司产品的Mac桌面端使用webview打开公司PC端主页,主页上有多个Tab。 其中一个Tab(以下简称A Tab,对应地址以下代称为:https://correct.domain.com)可以跳转到我负责的PC端页面(以下简称B页,对应地址https://correct…","fields":{"slug":"/Blog/Mac桌面端webview打开页面失败排查/"},"id":"66c9e06e-fbf8-58c6-873c-cd862e329846","frontmatter":{"date":"October 12, 2020","title":"Mac桌面端webview打开页面失败排查"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Server-Side GraphQL/"},"id":"9f40db4b-0cfd-5ade-a564-d65471bbde5c","frontmatter":{"date":"June 25, 2020","title":"Server-Side GraphQL"}}},{"node":{"excerpt":"前端知识复习 code snippet Function.prototype.bind 标准 When the bind method is called with argument thisArg and zero or more args, it performs the…","fields":{"slug":"/Blog/手写bind/"},"id":"2a0b1fca-b55a-56ee-9ad0-63d480e9aa31","frontmatter":{"date":"June 17, 2020","title":"手写bind"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Design Systems with Storybook/"},"id":"5b284b1b-e8d2-5ddb-9dc4-65aabcfb0280","frontmatter":{"date":"June 15, 2020","title":"Design Systems with Storybook"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Client-Side GraphQL/"},"id":"140d550b-dd69-57e9-890a-da83ea6ed869","frontmatter":{"date":"June 15, 2020","title":"Client-Side GraphQL"}}},{"node":{"excerpt":"前端知识复习 code snippet instanceof 标准 If Type(target) is not Object, throw a TypeError exception. Let instOfHandler be ? GetMethod(target…","fields":{"slug":"/Blog/手写instanceof/"},"id":"9b39a23f-9cb2-5e10-8493-44f92d28297c","frontmatter":{"date":"June 15, 2020","title":"手写instanceof"}}},{"node":{"excerpt":"背景 做Code Review的时候遇到一段Vue的SFC代码,需要在mounted生命周期里绑定document的scroll事件 下面这段代码的问题有哪些? 另一个例子 再看一个其他例子 答案 第一个console输出的是Vue实例 第二个console…","fields":{"slug":"/Blog/Vue实例方法的this指向/"},"id":"0bbe4a7f-d87d-592c-a034-38926ae81a87","frontmatter":{"date":"June 09, 2020","title":"Vue实例方法的this指向"}}},{"node":{"excerpt":"前端知识复习 code snippet 根据MDN,new主要做了4件事情 The new keyword does the following things: Creates a blank, plain JavaScript object; Links (sets the…","fields":{"slug":"/Blog/手写new/"},"id":"f28f6d8e-a799-5a30-89f3-82317cbfc986","frontmatter":{"date":"May 28, 2020","title":"手写new"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Svelte初探/"},"id":"e1f6e456-c9f4-56e8-b6c7-5cb7cf415407","frontmatter":{"date":"May 26, 2020","title":"Svelte初探"}}},{"node":{"excerpt":"现象 用了一个雪碧图,图片的真实宽高是 112px*22px,对应了 4 种情况下的 4 个图标 A,B,C,D, 每个分别是 28pt*22pt,折算到两倍屏就是 14pt*11pt 的图标尺寸。 @1x,@2x,@3x 整数倍 dpr…","fields":{"slug":"/Blog/background-image踩坑/"},"id":"90c3fcde-bc1e-5ab9-a666-74fe764e33f0","frontmatter":{"date":"May 25, 2020","title":"background-image踩坑"}}},{"node":{"excerpt":"背景 使用Vue重构一个jQuery的H5/PC页面,一个列表组件实现滚动加载更多的时候踩了个坑。 现象 没有触发滚动\n开始是把滚动事件绑定在列表组件的父级元素,然后发现无论如何都无法触发滚动事件 实现父元素滚动的布局导致了刘海屏下的一个兼容性bug\n让html和body…","fields":{"slug":"/Blog/scroll事件踩坑记录/"},"id":"0b6bd893-0d6b-514d-ad4a-160327e1f97d","frontmatter":{"date":"May 25, 2020","title":"scroll事件踩坑记录"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.every 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","fields":{"slug":"/Blog/手写Array.prototype.every/"},"id":"73eaddd5-bc49-52b3-bb19-6eebc47d6607","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.every"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.pop 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If len is zero, then Perform…","fields":{"slug":"/Blog/手写Array.prototype.pop/"},"id":"4f66deb7-bf30-5339-a9a5-cbb87ff09c95","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.pop"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.push 标准 t O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). Let items be a List whose…","fields":{"slug":"/Blog/手写Array.prototype.push/"},"id":"603756e2-ff0b-5ca3-aef9-fff4557b8d22","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.push"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.some 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn) is…","fields":{"slug":"/Blog/手写Array.prototype.some/"},"id":"5010b486-92c1-5f77-be25-2154d3d877ad","frontmatter":{"date":"May 24, 2020","title":"手写Array.prototype.some"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.foreach 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","fields":{"slug":"/Blog/手写Array.prototype.forEach/"},"id":"8f739d39-7b65-59b7-8837-6fdb4b3387f2","frontmatter":{"date":"May 23, 2020","title":"手写Array.prototype.forEach"}}},{"node":{"excerpt":"前端知识复习 code snippet array.prototype.filter 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable(callbackfn…","fields":{"slug":"/Blog/手写Array.prototype.filter/"},"id":"3a2a9a67-7077-5fc5-90a0-c39132697111","frontmatter":{"date":"May 22, 2020","title":"手写Array.prototype.filter"}}},{"node":{"excerpt":"前端知识复习 code snippet 先看 array.prototype.reduce 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable…","fields":{"slug":"/Blog/手写Array.prototype.reduce/"},"id":"3e05ec7f-10db-5f38-a5e0-6b538033dd72","frontmatter":{"date":"May 21, 2020","title":"手写Array.prototype.reduce"}}},{"node":{"excerpt":"前端知识复习 code snippet 废话少说,先看 array.prototype.map 标准 Let O be ? ToObject(this value). Let len be ? LengthOfArrayLike(O). If IsCallable…","fields":{"slug":"/Blog/手写Array.prototype.map/"},"id":"b0f6f384-9672-512b-ac7e-0a4cf63787a1","frontmatter":{"date":"May 20, 2020","title":"手写Array.prototype.map"}}},{"node":{"excerpt":"reference:https://www.cloudflare.com/learning/security/glossary/bgp-hijacking/","fields":{"slug":"/Blog/BGP Hijacking/"},"id":"947c1159-00ce-523d-86d6-7931d7de665c","frontmatter":{"date":"May 18, 2020","title":"BGP Hijacking"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Intro to Docker/"},"id":"362bffe2-a8a0-514b-b5f4-7916692907d8","frontmatter":{"date":"May 15, 2020","title":"Intro to Docker"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Websocket初步/"},"id":"7cf95374-586d-5c2f-98c6-3021aea78171","frontmatter":{"date":"May 03, 2020","title":"Websocket初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/Intro to Functional Programming/"},"id":"642301ea-ca1f-50da-8876-12246915c618","frontmatter":{"date":"May 02, 2020","title":"Intro to Functional Programming"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/php调参优化小记/"},"id":"3a2dc2b4-0203-51bf-8d4c-ea89d1021dcb","frontmatter":{"date":"April 28, 2020","title":"php调参优化小记"}}},{"node":{"excerpt":"写在前面 公司项目网站改版在即,需要扩充国际化和本地化支持。 查资料看了下这两个东西,理清了一些概念,简单记录一下。 国际化和本地化 根据wiki的说法,国际化与本地化(internationalization and localization…","fields":{"slug":"/Blog/国际化和本地化初步/"},"id":"8a32452e-abbf-555e-adce-ce304b54693f","frontmatter":{"date":"April 27, 2020","title":"国际化和本地化初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/shell脚本合并csv文件/"},"id":"d0c5b21d-fd38-5c8f-a2bf-86402ef3440c","frontmatter":{"date":"April 26, 2020","title":"shell脚本合并csv文件"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web图片优化初步/"},"id":"63ebd2f2-b369-595b-807b-870e37018de7","frontmatter":{"date":"April 21, 2020","title":"web图片优化初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web性能测试-locust/"},"id":"eb8cc83c-273e-5edc-baca-94c27f35e406","frontmatter":{"date":"April 18, 2020","title":"web性能测试-locust"}}},{"node":{"excerpt":"写在前面 1.sequence request - server responds - domContentLoaded - load Choose the metrics web.dev/user-centric-performance-metrics 2.1 Is there…","fields":{"slug":"/Blog/web性能优化指标解析/"},"id":"28edb7f8-457f-5fe4-bd0b-a1406bec1de5","frontmatter":{"date":"April 12, 2020","title":"web性能优化指标解析"}}},{"node":{"excerpt":"写在前面 图片消耗了网页流量的50%(中位数),移动端图片消耗了大约900Kb ​ - httparchive.org, 2020.01 图片优化的…","fields":{"slug":"/Blog/响应式图片优化/"},"id":"e0fbe291-555e-51e5-b342-d22459126a9e","frontmatter":{"date":"April 12, 2020","title":"响应式图片优化"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web性能测试-jmeter/"},"id":"05374403-0fc9-576b-a1d5-76b27aa2e6f5","frontmatter":{"date":"April 11, 2020","title":"web性能测试-jmeter"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web性能测试初步/"},"id":"a17a33c5-c83a-5c6e-859b-2d9cbed6a64c","frontmatter":{"date":"April 08, 2020","title":"web性能测试初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-数据库model/"},"id":"edca47b0-5826-5638-81c1-3074764524a2","frontmatter":{"date":"April 07, 2020","title":"后端单元测试-数据库model"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-接入层请求mock/"},"id":"81d585ad-d91a-570a-a3f4-0ce9e10d8b97","frontmatter":{"date":"April 06, 2020","title":"后端单元测试-接入层请求mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/web安全初步/"},"id":"cf0f9da2-05aa-5aa6-9889-2513e1837ad5","frontmatter":{"date":"April 02, 2020","title":"web安全初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-service/"},"id":"e4c03580-a16a-5867-abf0-c2d2c95b3736","frontmatter":{"date":"April 02, 2020","title":"后端单元测试-service"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-Koa中间件测试/"},"id":"9e7ed8c5-4235-54fa-acad-f6dcfd7bd4c8","frontmatter":{"date":"March 29, 2020","title":"后端单元测试-Koa中间件测试"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/后端单元测试-controller/"},"id":"997e63e1-57f0-53f9-b328-fb0da58c2260","frontmatter":{"date":"March 23, 2020","title":"后端单元测试-controller"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-测试组件/"},"id":"5c2012e3-3d1c-5bc0-af34-f3dd62491acb","frontmatter":{"date":"March 19, 2020","title":"前端单元测试-测试组件"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-Vue组件mock/"},"id":"e8d712f4-e45b-5cbd-baf8-529d651ecde7","frontmatter":{"date":"March 17, 2020","title":"前端单元测试-Vue组件Mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-Axios对象Mock/"},"id":"f2c90e0f-f550-5eba-9efd-4881c115409e","frontmatter":{"date":"March 15, 2020","title":"前端单元测试-Axios对象Mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端单元测试-Vue对象Mock/"},"id":"e4090338-39f6-5d5c-87e9-6996d08640b6","frontmatter":{"date":"March 12, 2020","title":"前端单元测试-Vue对象Mock"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/入坑TypeScript/"},"id":"237ddafe-9bc6-5063-bc8d-24a25dfdd2d7","frontmatter":{"date":"March 11, 2020","title":"入坑TypeScript"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/自己实现Promise/"},"id":"71da6e18-470a-5f6c-be65-5c8d2965dffd","frontmatter":{"date":"March 11, 2020","title":"自己实现Promise"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/单元测试初步/"},"id":"350d6ea2-e5d7-5c00-8b15-613fc7a93874","frontmatter":{"date":"March 09, 2020","title":"单元测试初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/前端错误监控与上报原理/"},"id":"9fd36c51-f455-5273-b2b0-213c9ca6ef0f","frontmatter":{"date":"March 08, 2020","title":"前端错误监控与上报原理"}}},{"node":{"excerpt":"写在前面 最近增加Node多语言的支持,后端获取语言参数的优先级有点不清楚 特意查了些文档,在这里记录一下 优先级 Domain: 顶级域名(TLD, Top Level Domain),如.cn, .de等 Subdomain: 子域名,如cn.amazon.com…","fields":{"slug":"/Blog/多语言的判断优先级/"},"id":"25c6cc2f-53d2-5f10-af94-0e39d8c8f5ee","frontmatter":{"date":"March 05, 2020","title":"多语言的判断优先级"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/HTTP2.0初步/"},"id":"35f8591d-1ecb-55af-8d98-639aa8ad0276","frontmatter":{"date":"February 28, 2020","title":"HTTP/2初步"}}},{"node":{"excerpt":"常见相关HTTP Header HTTP 1.0 Pragma 与HTTP 1.1 Cache-Control对等,为了兼容而存在; 如果Cache-Control同时存在,Pragma会被忽略; 通常设置为Pragma: no-cache; HTTP 1.1 Cache…","fields":{"slug":"/Blog/HTTP缓存小结/"},"id":"7c460279-2a30-572b-8a20-49b67e336392","frontmatter":{"date":"February 25, 2020","title":"HTTP缓存小结"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/XMLHttpRequest回顾/"},"id":"677ea431-8aa1-5b18-8cae-e2420f5022df","frontmatter":{"date":"February 21, 2020","title":"XMLHttpRequest回顾"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/HTTPS初步/"},"id":"a5367ab2-d182-5be3-b310-7838fadb13a6","frontmatter":{"date":"February 19, 2020","title":"HTTPS初步"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/TCP三次握手/"},"id":"7b235de6-6b7a-5fab-a80c-26afde87bdb6","frontmatter":{"date":"February 09, 2020","title":"TCP三次握手"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/2019总结与2020年计划/"},"id":"f4bb9bc4-b1a8-50e0-9435-f6ed736fd43d","frontmatter":{"date":"January 31, 2020","title":"2019总结与2020年计划"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/LeetCode-3-Longest Substring Without Repeating Characters/"},"id":"0f100913-0711-5c14-b7c4-088682d17473","frontmatter":{"date":"January 16, 2020","title":"LeetCode-3-Longest Substring Without Repeating Characters"}}},{"node":{"excerpt":"三个主要字段 http,server,location location配置 优先级 = ^~ ~ ~* / 反向代理配置 proxy_pass gzip配置 案例","fields":{"slug":"/Blog/nginx基本配置/"},"id":"a9c3daec-c088-5db7-91e5-87226adeb45b","frontmatter":{"date":"January 15, 2020","title":"nginx基本配置"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/LeetCode-2-Add Two Numbers/"},"id":"e89253ca-e84d-5893-8d2c-c2cb71b6a2ba","frontmatter":{"date":"January 15, 2020","title":"LeetCode-2-Add Two Numbers"}}},{"node":{"excerpt":"开始之前,先推荐一个工具网站 用于测试配置文件中location匹配,感觉很方便 Nginx location match tester: https://nginx.viraptor.info/ 背景 node…","fields":{"slug":"/Blog/配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问/"},"id":"9e5c733d-c0a1-5de8-aac8-6790c0f6b061","frontmatter":{"date":"January 07, 2020","title":"配置Nginx和WebpackDevServer支持开发环境热更新和https域名访问"}}},{"node":{"excerpt":"背景 H5页面主题皮肤切换,有2条路线,一是使用css实现,一是使用js实现。 其实需求很简单,希望组件本身可以和皮肤主题解耦,这样至少有…","fields":{"slug":"/Blog/Vue使用provide-inject特性注入皮肤配置/"},"id":"fd2d5b3f-7c43-5a03-a5f2-71fb5e9d1309","frontmatter":{"date":"January 03, 2020","title":"Vue使用provide-inject特性注入皮肤配置"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/iTerm2自动填充密码访问ssh/"},"id":"8921904a-72d4-5e7e-9542-c5ec2b648d10","frontmatter":{"date":"November 29, 2019","title":"iTerm2自动填充密码访问ssh"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/echarts封装Vue组件/"},"id":"3e857be3-26b5-5e58-9f9f-c1e24b745e6d","frontmatter":{"date":"November 27, 2019","title":"echarts封装Vue组件"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/echarts使用小记/"},"id":"6a857de3-8465-5902-8fb2-990446eccc51","frontmatter":{"date":"November 21, 2019","title":"echarts使用小记"}}},{"node":{"excerpt":"写在前面 项目配置 ESLint eslint babel-eslint eslint-config-airbnb-base eslint-plugin-vue eslint-config-futu eslint-plugin-import, 不认识webpack…","fields":{"slug":"/Blog/使用eslint+prettier+husky规范项目代码风格/"},"id":"f46bbcb3-d0da-5e3e-ae88-8e967791e8df","frontmatter":{"date":"November 05, 2019","title":"使用eslint+prettier+husky规范项目代码风格"}}},{"node":{"excerpt":"同一个页面有多个相同组件,根据配置分别控制显隐,使用v-if时始终都只有第一个组件能取到props,第二个没有被初始化","fields":{"slug":"/Blog/Vue中v-if和v-show遇到的小问题/"},"id":"e3a61e55-c1c0-5a96-b0f9-8957af55a3b6","frontmatter":{"date":"November 02, 2019","title":"Vue中v-if和v-show遇到的小问题"}}},{"node":{"excerpt":"1. TC39 工作流程 - 标准一般每年6-7月发布 2. ES2015(ES6):常用特性 2.1 模版字符串 2.2 解构赋值,rest/spread操作符 2.3 Symbol / Iterator / Generator 3. ES2016(ES7) 4. ES…","fields":{"slug":"/Blog/ES2015-ES2020/"},"id":"a0cbb589-3084-57ea-9d0c-b08d3bab8d2a","frontmatter":{"date":"October 31, 2019","title":"ES2015-ES2020"}}},{"node":{"excerpt":"问题描述 新部署的服务器,查看git commit message不显示中文了,全是各种数字编码,而旧服务器显示一切正常,这显然是编码问题了。 原因 简单google了一下,发现是服务器字符集和本机字符集不匹配。 输入locale查看本机的配置,发现LANG和LC_ALL…","fields":{"slug":"/Blog/mac终端中文显示数字编码的设置问题/"},"id":"1fa48a2a-9891-592d-98e4-11da760e3ab6","frontmatter":{"date":"October 16, 2019","title":"mac终端中文显示数字编码的设置问题"}}},{"node":{"excerpt":"写在前面 今天犯了个低级错误,页面新增加了一个vue组件,因为是直接在html里写的(需要用php的后端直出,没有用vue单文件的写法),在使用自闭合标记写法的情况下这个组件没有直接渲染,而是把它后面的div…","fields":{"slug":"/Blog/HTML中自闭合Vue组件的bug/"},"id":"5966dc21-09c0-50a0-be45-1fe9dbdbc1fa","frontmatter":{"date":"October 12, 2019","title":"HTML中自闭合Vue组件的bug"}}},{"node":{"excerpt":"写在前面 最近一次帮同事找错误的经历,虽然最后发现是很低级的错误,但是过程挺有意思 问题描述 之前搭建的新管理后台项目A上线了,搭档想在本地调试,于是按照文档配好了nginx配置文件,本地启动项目,按域名访问却被重定向到了另一个项目B的页面 排查过程 检查项目A的ip…","fields":{"slug":"/Blog/nginx配置的一个小错误/"},"id":"a9751351-ab54-589f-804d-cf3d7be07d7a","frontmatter":{"date":"October 11, 2019","title":"nginx配置的一个小错误"}}},{"node":{"excerpt":"写在前面 核心服务扩容,之前预定分配给node管理后台用的服务器不能用了。 不得不重新申请了一台服务器部署,结果部署成功后业务一直运行不起来,花了3天才排查到原因,真是尴尬。 这里记录一下,留作备忘。 背景信息 开始安装又卸载node…","fields":{"slug":"/Blog/部署node管理后台遇到的一个问题/"},"id":"6aef6008-329b-5323-abb5-95225f7b1387","frontmatter":{"date":"October 10, 2019","title":"部署node管理后台遇到的几个问题"}}},{"node":{"excerpt":"很多年以后,我可能仍然会记得2017年7月某个下午的那场谈话。 入职第一天,项目负责人笑眯眯的给我说,公司项目有了变化,临时前端缺人,需要我支持一下。就这样,本以为做java后台开发的我,误打误撞进了前端的门。 从什么前端知识都不会,到可以使用react-native…","fields":{"slug":"/Blog/前端二年/"},"id":"57d1b658-9f0d-52c2-9c09-0aa67bfcc0e6","frontmatter":{"date":"October 08, 2019","title":"前端二年"}}},{"node":{"excerpt":"写在前面 最近做了几个混合App开发的需求,涉及到了JSBridge,记录一下 一点总结 webview的URL最大长度,跟使用的浏览器内核有关,和客户端同学测试过是8182个字符,和chrome标称的长度一致,所以我司webview内核用的应该是chrome","fields":{"slug":"/Blog/JSBridge的一点总结/"},"id":"f10505f3-3720-58aa-8aad-b78722974c24","frontmatter":{"date":"September 28, 2019","title":"JSBridge的一点总结"}}},{"node":{"excerpt":"写在前面 这篇是大概一个半月前部署node项目时遇到的一个小问题,写下来备忘 问题描述 部署完毕,运行报错的时候才发现服务器没有pm2.config.js配置的文件路径 ssh…","fields":{"slug":"/Blog/PM2遇到的一个小问题/"},"id":"5be4d78e-7d0a-52d1-af56-0df5ba30f087","frontmatter":{"date":"September 25, 2019","title":"PM2遇到的一个小问题"}}},{"node":{"excerpt":"TL;DR babel不会打包node_modules里的文件,所以引入组件时,必须用组件打包后的代码 问题描述 npm install安装了公司内部组件之后,使用时import了源文件,然后项目打包报错: ... UglifyJS unexpected token: punc…","fields":{"slug":"/Blog/一个关于babel的愚蠢小错误/"},"id":"aca42108-7c9b-5114-aa02-19dd68185375","frontmatter":{"date":"September 19, 2019","title":"一个关于babel的愚蠢错误"}}},{"node":{"excerpt":"写在前面 Sequelize内部时间格式","fields":{"slug":"/Blog/Sequelize和MySql时间格式小记/"},"id":"e066ab84-1aa5-5179-ad5a-e586738cdb89","frontmatter":{"date":"September 17, 2019","title":"Sequelize和MySql时间格式小记"}}},{"node":{"excerpt":"写在前面 这是4个月前的一篇工作记录,是上一篇Charles使用的扩展版。 因为平时用Mac,所以只列出了Mac调试不同移动端的情况,windows没有涉及。 在Mac下调试App常用3种手段: USB调试 使用腾讯开源的vConsole 使用Charles调试 USB…","fields":{"slug":"/Blog/移动端网页调试技巧/"},"id":"b4ea2cba-b13c-5b3a-94fd-2511d2b008c5","frontmatter":{"date":"September 08, 2019","title":"移动端网页调试技巧"}}},{"node":{"excerpt":"写在前面 这是4个月前的一篇简要工作记录,重新编辑整理了一下,算是自己技能成长的一个见证。 可以抓包移动端网络请求的工具很多,windows下有fiddler和wireshark,Mac下有Charlse和Surge for Mac(Surge iOS版甚至可以在iOS…","fields":{"slug":"/Blog/使用Charles抓包移动端网络请求/"},"id":"3a355e3e-4e71-5c85-a8f5-2598e81462bc","frontmatter":{"date":"September 07, 2019","title":"使用Charles抓包移动端网络请求"}}},{"node":{"excerpt":"写在前面 大前端之路又迈出了坚实一步。 leader架不住我们前端切图仔的各种游说,终于决定了上node。马上就可以写node接入层了,后端哥们可以专心开发微服务,切图仔们也可以想要什么数据字段就用什么了,毕竟求人不如求己。 leader给我分配了搭建框架的任务,以公司内部koa…","fields":{"slug":"/Blog/node开发遇到的一个小坑/"},"id":"8744745f-b72c-589d-a330-a829dde8c7b0","frontmatter":{"date":"September 03, 2019","title":"node开发遇到的一个小坑"}}},{"node":{"excerpt":"写在前面 上一篇博客中提到的业务,这次引发了另一个bug 背景信息 上一次的H5页面上线有段时间了,客户端同学终于赶上了进度,把页面用到了App里更多的地方。 这次bug的主角是2个页面,一个列表页(以下简称L),一个详情页(以下简称D)。L由内嵌webview为容器,作为App…","fields":{"slug":"/Blog/一次App内页的bug溯源/"},"id":"ce599e5a-c388-55a0-871f-53bed85780f6","frontmatter":{"date":"September 02, 2019","title":"一次App内页的bug溯源"}}},{"node":{"excerpt":"写在前面 这是大概3个月之前的一次线上调试过程,最后排查到的原因很简单,但调试过程让我认识了所谓“线上环境复杂”是什么意思。 背景信息 这是入职后接手的第一个H…","fields":{"slug":"/Blog/CDN缓存不同步,一次线上调试的经历/"},"id":"6d3f78a2-9d9e-5150-8f8a-cc925982a1b3","frontmatter":{"date":"August 31, 2019","title":"CDN缓存不同步:一次线上调试的经历"}}},{"node":{"excerpt":"写在前面 2019 年计划完成情况 写在前面 这是今年的第十篇博客。距离上一次写博客已经过去四个月了。 4 月份入职了新公司做 web…","fields":{"slug":"/Blog/2019半年小结/"},"id":"a7c262c0-f025-544b-89d9-c287d05b5344","frontmatter":{"date":"July 28, 2019","title":"2019半年小结"}}},{"node":{"excerpt":"原型链的前提规则 原型链关系试验 试验的一点解释 原型链关系图 原型链的前提规则 任何对象都拥有__proto__属性,指向其 构造函数 (constructor function) 的 原型 (prototype) 对象 例: 假设有数组对象 a…","fields":{"slug":"/Blog/JavaScript中的原型链/"},"id":"3f2a1e16-aa8f-5c90-a824-edea76e7b8b4","frontmatter":{"date":"March 24, 2019","title":"JavaScript中的原型链"}}},{"node":{"excerpt":"富途面试遇到的手写算法题:\n2 个有序数组 A 和 B,只含有数字,每个数组内的元素都有可能重复。请写一个函数,判断 B 是否为 A 的子集。如果是,返回 true;反之,返回 false…","fields":{"slug":"/Blog/判断有序数组B是否为有序数组A的子集/"},"id":"f3cacb59-6c95-53db-9236-d7f8b347d42e","frontmatter":{"date":"March 12, 2019","title":"判断有序数组B是否为有序数组A的子集"}}},{"node":{"excerpt":"Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input…","fields":{"slug":"/Blog/LeetCode-1-Two Sum/"},"id":"10736f50-ca44-5117-a343-1d80c5d049fc","frontmatter":{"date":"February 28, 2019","title":"[LeetCode 1] Two Sum"}}},{"node":{"excerpt":"…","fields":{"slug":"/Blog/转-如何有效地写算法题/"},"id":"0b8dd816-4830-5200-885f-0f2aa77f8ef3","frontmatter":{"date":"February 14, 2019","title":"[转] 如何有效地写算法题"}}},{"node":{"excerpt":"You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the…","fields":{"slug":"/Blog/LeetCode-278-First Bad Version/"},"id":"a4081362-7685-58ab-8015-0ba2200b9a88","frontmatter":{"date":"February 13, 2019","title":"[LeetCode 278] First Bad Version"}}},{"node":{"excerpt":"Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: The number of elements initialized in…","fields":{"slug":"/Blog/LeetCode-88-Merge Sorted Array/"},"id":"05690cee-9b94-5b65-b457-d9d1d763112c","frontmatter":{"date":"February 12, 2019","title":"[LeetCode 88] Merge Sorted Array"}}},{"node":{"excerpt":"The Hamming distance between two integers is the number of positions at which the corresponding bits are different. Given two integers x and…","fields":{"slug":"/Blog/LeetCode-461-Hamming Distance/"},"id":"5a6f3fb4-05aa-5791-aa3c-4ffa8e3365b4","frontmatter":{"date":"February 11, 2019","title":"[LeetCode 461] Hamming Distance"}}},{"node":{"excerpt":"可能是今年 flag 里包含项目最多的一个,今天正式开始 leetcode 刷题,目标是 7 月 31 日之前至少刷完一遍。 leetcode 官方放出了一个 top interview questions list,一共 151 题: easy 共 49 题 medium…","fields":{"slug":"/Blog/开始刷leetcode/"},"id":"4050fece-1838-5092-bc55-e7ec6df7cb69","frontmatter":{"date":"February 11, 2019","title":"开始刷leetcode"}}},{"node":{"excerpt":"近期因为家里各种事情的耽误,一直没有时间完成这篇总结与希望。新的一年已经过完 1/12,这篇姗姗来迟的文章还没开始就有点过时了。 2018 年总结 工作 阅读 代码 2019 希望 2018 年总结 如果要用一个词概括我的 2018,那么这个主题词是:“转型” 工作 201…","fields":{"slug":"/Blog/2018总结与2019希望/"},"id":"b723930e-fcfc-5d82-bf85-9094ddc2a466","frontmatter":{"date":"January 31, 2019","title":"2018总结与2019希望"}}},{"node":{"excerpt":"花了 3,4 天,用 Gatsby 断断续续的重写了之前的博客,现在是 SPA 了,哈哈哈。Gatsby 包装了各种插件,用起来挺方便,最关键是不用自己配置 webpack 了,省事不少。当然了,新东西 bug…","fields":{"slug":"/Blog/用Gatsby重写了博客/"},"id":"9b252f6d-1912-5ff3-a78e-f3b262435809","frontmatter":{"date":"December 16, 2018","title":"用Gatsby重写了博客"}}},{"node":{"excerpt":"写在前面:这是一篇译文,是原作者系列文章的第一篇,第二篇主题是 CSS , 第三篇是 HTML。 作者:Peter Jang 原文名:Modern JavaScript Explained For Dinosaurs 原文于 2017 年 10 月 19 日发表于 medium…","fields":{"slug":"/Blog/译-写给恐龙的现代Javascript指南/"},"id":"8646b4e3-546e-5695-abf6-7229c1a5b9e3","frontmatter":{"date":"December 08, 2018","title":"[译]写给恐龙的现代Javascript指南"}}},{"node":{"excerpt":"以前一直迷迷糊糊的,parameter 和 argument,形参和实参,这 2 个概念中英文完全对不上,现在终于弄清楚了 parameter: 函数声明中用来占位的参数名,中译“形参” 其实它就是 placeholder,翻译成“参数占位符”更容易理解 argument…","fields":{"slug":"/Blog/parameter与argument/"},"id":"ca6f475d-7f00-5394-afc8-39723c3f2219","frontmatter":{"date":"November 21, 2018","title":"parameter与argument"}}},{"node":{"excerpt":"date: 2018-10-29 引子 带返回值的构造函数 一点引申: 单例模式 引子 理论上说,只要对函数使用new语法,任何function都可以作为constructor创建新实例,但是如果function…","fields":{"slug":"/Blog/恶趣味构造函数/"},"id":"3857c34c-ce84-55fb-b2d4-db2cf3baf44a","frontmatter":{"date":"October 29, 2018","title":"恶趣味构造函数"}}},{"node":{"excerpt":"typeof instanceof typeof typeof可以用来测试变量的类型,语法是typeof myVariable,返回值为变量类型的字符串。一般来说,基本类型会返回描述基本类型的字符串,而对象则返回'object'字符串,但是有…","fields":{"slug":"/Blog/typeof与instanceof/"},"id":"f9508ca1-1b79-5469-8dc1-7e60ca32e787","frontmatter":{"date":"October 22, 2018","title":"typeof与instanceof"}}},{"node":{"excerpt":"高阶函数 Array.prototype.forEach Array.prototype.map Array.prototype.filter Array.prototype.every Array.protytype.some Array.protytype.reduce…","fields":{"slug":"/Blog/几个JS高阶函数的简单底层实现/"},"id":"2b10b427-cc23-5c7e-829e-2da304fb0796","frontmatter":{"date":"October 07, 2018","title":"几个JS高阶函数的简单底层实现"}}},{"node":{"excerpt":"date: 2018-10-03 一点微小差别 为什么 结论 参考文献 一点微小差别 indexOf 和 includes 都可以用来判断数组是否包含某个元素,二者到底有什么区别呢?看一个例子: 为什么 二者内部使用的算法不同: indexof…","fields":{"slug":"/Blog/array.indexof和array.includes/"},"id":"f34e0db1-4140-59a5-9355-c4721c9fc774","frontmatter":{"date":"October 03, 2018","title":"array.indexOf和array.includes"}}},{"node":{"excerpt":"title: 'IEEE-754标准与JS中的number类型' 引子: 0.1+0.2===0.3 ? Number类型的二进制表示 二进制小数与二进制科学记数法 IEEE-754双精度浮点数 存储结构 计算方法 特殊情况 浮点数的误差 十进制转浮点数 舍入 0.1+0.…","fields":{"slug":"/Blog/IEEE-754标准与JS中的number类型/"},"id":"2f6626d8-952d-54a8-8347-6e0ca34b51ae","frontmatter":{"date":"October 01, 2018","title":"IEEE-754标准与JS中的number类型"}}},{"node":{"excerpt":"date: 2018-09-21 基本类型隐式转换 基本类型转换为Boolean类型 基本类型转换为String类型 基本类型转换为Number类型 对象隐式转换为基本类型 基本类型隐式转换 基本类型转换为Boolean类型 隐式转换相当于调用Boolean(value…","fields":{"slug":"/Blog/JS中的隐式转换/"},"id":"03287e36-0dba-56a1-b4f5-a1090bd5b8e6","frontmatter":{"date":"September 21, 2018","title":"JS中的隐式转换"}}},{"node":{"excerpt":"date: 2018-09-18 引子 +操作符规则 题目解析 引子 JavaScript上手快…","fields":{"slug":"/Blog/加法操作符/"},"id":"59936140-86b7-5f18-8570-44d5f3e9c4ef","frontmatter":{"date":"September 18, 2018","title":"加法操作符"}}},{"node":{"excerpt":"引子 操作符运算规则 全等操作符判定规则 - Strict Equality Comparison(SEC) 相等操作符判定规则 - Abstract Equality Comparison(AEC) 对象转换基本类型规则 - Object To Primitive(OTP…","fields":{"slug":"/Blog/相等操作符/"},"id":"370dd3a5-9614-5664-be9d-c20ad770a15a","frontmatter":{"date":"September 15, 2018","title":"相等操作符"}}},{"node":{"excerpt":"--先挖坑,有时间再填-- 超简单服务器 20 秒 done(只用于数据测试) 自定义 API route 复杂 API 模拟服务器实现 结合 Fake.js 实现随机数据 API 模拟服务器","fields":{"slug":"/Blog/使用json-server搭建API模拟服务器/"},"id":"896f075f-3140-5c6c-a524-4241bdb18731","frontmatter":{"date":"May 29, 2018","title":"使用json-server搭建API模拟服务器"}}},{"node":{"excerpt":"问题描述 列表 FlatList 直接放在 View 里面,无法 pull to refresh 原因排查 因为 FlatList 基于 ScrollView 和 VirtualizedList 封装,查看了 ScrollView 的官方文档说明 Keep in mind…","fields":{"slug":"/Blog/FlatList和ScrollView的一个小问题/"},"id":"fbe672a3-1f5b-5580-8441-38065ff3de58","frontmatter":{"date":"May 19, 2018","title":"使用FlatList(ScrollView)的一个小问题"}}},{"node":{"excerpt":"date: 2018-05-15 问题描述 排查过程 CST & GMT 冷知识 问题解决 反思 问题描述 今天偶然发现了一个问题,JAVA 后台返回的时间字符串解析后居然比原始数据差了 14 个小时 后台时间字符串:Thu Feb 17 16:31:52 CST 201…","fields":{"slug":"/Blog/CST与GMT的差别/"},"id":"397d76da-580b-54f8-a699-682d12826d62","frontmatter":{"date":"May 15, 2018","title":"CST与GMT的差别"}}},{"node":{"excerpt":"问题出现 APP 某个页面加载时访问了 2 个 API,两者的返回数据都分别有type字段,用于区分对应的数据列表中项目的类别,前端界面再根据类别渲染不同的界面 这个时候问题出现了,第一个 API 一切正常,第二个 API 返回列表本应全是type=…","fields":{"slug":"/Blog/一次搞笑而深刻的bug调试/"},"id":"5b0f3306-22a6-5439-885c-4b40b7b0debd","frontmatter":{"date":"May 04, 2018","title":"一次搞笑而深刻的bug调试"}}},{"node":{"excerpt":"","fields":{"slug":"/Blog/如何判断日期是否为今天/"},"id":"fcb9d14b-f410-5d3e-bd9e-5af1f2d34019","frontmatter":{"date":"May 04, 2018","title":"如何判断日期是否为今天"}}},{"node":{"excerpt":"相同点 均为基本类型 都属于“假值”,用Boolean()转换类型后都为false 使用==进行比较时,二者相等 看 2 个可能会遇到的情况: 例 1 中,这几个值在 if 语句中都会被隐式转换为boolean类型,而且恰好都为假值,取反之后均为真,因此 三个 if…","fields":{"slug":"/Blog/null和undefined的比较/"},"id":"aede8ad6-3f0c-5cad-aa35-6b731fbaed2c","frontmatter":{"date":"May 03, 2018","title":"null和undefined的比较"}}},{"node":{"excerpt":"照例挖坑","fields":{"slug":"/Blog/JavaScript前端RSA加密/"},"id":"f0205ecb-fbdb-50a5-b0f3-7e5964c32191","frontmatter":{"date":"May 02, 2018","title":"JavaScript前端RSA加密"}}},{"node":{"excerpt":"挖坑,等填 调试 REST API 遇到的问题\n用户密码加密后,还要再经过一边 URL 加密\nencodeURIComponent","fields":{"slug":"/Blog/JavaScript编码URL/"},"id":"df6bd36a-4bd1-5dcb-988c-2d3bffe11ec0","frontmatter":{"date":"May 01, 2018","title":"JavaScript编码URL"}}},{"node":{"excerpt":"挖坑待填","fields":{"slug":"/Blog/normalizr扁平化递归结构的json/"},"id":"f5930753-9030-5e83-bc82-027553933968","frontmatter":{"date":"April 23, 2018","title":"normalizr扁平化递归结构的json"}}},{"node":{"excerpt":"不会自己搭mock server的前端不是好前端。 后台开发和前端开发不能完全实现同步,一直停下等后台是要出问题的。\n于是基于json-server搭了一个 API 本地测试服务器,却遇到了一个莫名其妙但极其简单的问题,简单记录一下,避免以后二次踩坑。 TL;DR Android…","fields":{"slug":"/Blog/Android模拟器访问本地web服务的url/"},"id":"e7c733d6-aec8-54d0-8303-505a775565a2","frontmatter":{"date":"March 29, 2018","title":"Android模拟器访问本地web服务的url"}}},{"node":{"excerpt":"RN 也用了小一段时间了,之前都着重实现功能+赶工期,交互体验方面基本无暇顾及。 最近项目周期不算太紧,于是小小试验了一下 Animated 的 API,模拟器上的效果还不错。\n简单记录一下 API 的内容,以后备查:\n---先挖坑,以后再填--- 组件 自带的有Animated…","fields":{"slug":"/Blog/RN Animated API使用/"},"id":"c76cf011-e5be-5b68-8ee3-0fd86675f13d","frontmatter":{"date":"March 29, 2018","title":"RN Animated API使用"}}},{"node":{"excerpt":"StackNavigator 在navigationOptions里修改headerStyle TabNavigator 在tabBarOptions修改style 代码 最好在navigator定义时设置navigationOptions…","fields":{"slug":"/Blog/React-Navigation中去掉header下的阴影/"},"id":"d540c216-50da-5bcc-a8a7-d6f73fee29b1","frontmatter":{"date":"March 18, 2018","title":"React-Navigation中去掉header下的阴影"}}},{"node":{"excerpt":"有时候需要键盘遮挡住屏幕的一部分,有时候不需要,可以配置android\\app\\src\\main\\AndroidManifest.xml文件 android:windowSoftInputMode=\"adjustResize\"可以让键盘推起页面 android…","fields":{"slug":"/Blog/Android键盘遮挡问题/"},"id":"1a5a2f8f-5c1c-58c2-8cfe-0bcd3bfbb64c","frontmatter":{"date":"March 14, 2018","title":"Android键盘遮挡问题"}}},{"node":{"excerpt":"安卓下又报了个错误 Native module SplashScreenModule tired to override SplashScreenModule for module name SplashScreenModule. If this was your…","fields":{"slug":"/Blog/Native Module xxx tried to override xxx native module错误解决办法/"},"id":"743e7946-0a7f-5e1c-b5fe-f4deea4abfa4","frontmatter":{"date":"March 13, 2018","title":"Native Module xxx tried to override xxx native module错误解决办法"}}},{"node":{"excerpt":"splash-screen 这个 RN 插件挺好用的,升级之后启动 Android 版 APP 就闪退\n查了 issue 之后发现是文档没更新,在按照说明操作之后,还需要做额外调整: 插件 github 地址 MainActivity.java…","fields":{"slug":"/Blog/RN0.53+react-native-splash-screen3.0.1,Android启动闪退/"},"id":"ce2b210d-bf2d-54d6-9c14-1820e4be885d","frontmatter":{"date":"March 13, 2018","title":"RN0.53+react-native-splash-screen3.0.1,Android启动闪退"}}},{"node":{"excerpt":"需要覆盖 tabbar component 如果是 bottom 模式,就需要覆盖 tabbarBottom 如果是 top 模式,就需要覆盖该 tabbarTop 参考这里","fields":{"slug":"/Blog/实现自定义tabbar component/"},"id":"16a13c24-9ba6-5b59-a5ed-006fa77c6301","frontmatter":{"date":"March 13, 2018","title":"实现自定义tabbar component"}}},{"node":{"excerpt":"bottom 模式的 tabBar 也出现了 indicator(就是选中某个 tabbar icon 的时候,出现的那根线,一般是出现在 top 模式下的)\n感觉很烦人,想去掉,开始自然想到把这根线调为透明 发现不管用。 查了一下 issue,发现了下面这个解决方案: 搞定!","fields":{"slug":"/Blog/React-Navigation中tabNavigator去掉指示线/"},"id":"c46bf79c-2d86-54de-9e3a-0c891c301e7f","frontmatter":{"date":"March 12, 2018","title":"React-Navigation中tabNavigator去掉指示线"}}},{"node":{"excerpt":"问题: 创建 APP 代码完整框架的时候,因为升级到了 2.x 版本的antd-mobile,报了下面错误 但是运行时出现依赖 react-dom 的错误 \"Unable to resolve module react-dom from /Users/xiesubin…","fields":{"slug":"/Blog/antd-mobile引用错误解决办法/"},"id":"3c88f723-4d0b-55db-afd2-3f229841b66f","frontmatter":{"date":"March 09, 2018","title":"antd-mobile引用错误解决办法"}}},{"node":{"excerpt":"更新:\n换了 0.53 版本的 RN,目前 android 遇到的,而且只有模拟器,真机调试都不会有以下问题 现象: 直接打开调试会找 10.0.2.2:8081/debugger-ui/,但是这个地址并不能连接成功 解决方法: 手动修改地址为http://localhost…","fields":{"slug":"/Blog/RN0.53找不到remote debugger解决方案/"},"id":"746c6106-0b82-5e9f-960d-88e1a9763b83","frontmatter":{"date":"March 08, 2018","title":"RN0.53找不到remote debugger解决方案"}}},{"node":{"excerpt":"RN 版本升级太快,现在以指定版本的 RN 重构老 APP 用 init 创建的格式如下 react-native init yourProject --version react-native@0.53","fields":{"slug":"/Blog/react-native-init以指定版本创建project/"},"id":"ef22f3c3-d5bb-5bc5-9a46-b89a952b9361","frontmatter":{"date":"March 07, 2018","title":"react-native-init以指定版本创建project"}}},{"node":{"excerpt":"StackNavigator 自带了 navigationOptions 属性,但必须以静态对象申明 实现有 3 个要点: navigationOptions 对象里,创建{param}常量,然后 headerLeft 或者 headerRight…","fields":{"slug":"/Blog/StackNavigator Header增加“返回”按钮/"},"id":"02af43cc-b90b-5167-9a31-fa325b4d0cdc","frontmatter":{"date":"September 26, 2017","title":"StackNavigator Header增加“返回”按钮"}}},{"node":{"excerpt":"页面用了 stackNavigator,header left 加了一个 button,header titleStyle 也设置了居中 iOS 下没有问题,但是在 Android 下发现 title 向右偏移 系统版本 RN 0.47.2 NODE 8.4 NPM 4.6.…","fields":{"slug":"/Blog/header title在Android下不居中问题的解决技巧/"},"id":"71c8f3ae-0ce7-5539-ac52-d167b9625a0d","frontmatter":{"date":"September 22, 2017","title":"header title在Android下不居中问题的解决技巧"}}},{"node":{"excerpt":"最近开始用 RN 做项目,第一步当然是搭建开发环境,不过 RN 的环境搭建真是一件要命的事情,不熟悉的话会折腾很久的。 windows 下环境搭建 Mac 下环境搭建 从项目代码开始构建","fields":{"slug":"/Blog/搭建RN开发环境/"},"id":"3facfde5-dfed-54ef-8348-7f5817fbc5b4","frontmatter":{"date":"August 31, 2017","title":"搭建RN开发环境"}}},{"node":{"excerpt":"Dan Abramov 在 2018-11-24 发了一系列推文是说明 React 的本质。他提到 Virtual DOM 这个词该退休了,这个词并没有说清楚 React 到底是什么。React 本质是“UI 类型”,和 JS…","fields":{"slug":"/Blog/The Virtual DOM阅读笔记/"},"id":"49d45663-8fe9-5dc1-8ba3-2f4b668d4f0a","frontmatter":{"date":"August 22, 2017","title":"The Virtual DOM阅读笔记"}}}]}},"pageContext":{}}} \ No newline at end of file diff --git a/page-data/offline-plugin-app-shell-fallback/page-data.json b/page-data/offline-plugin-app-shell-fallback/page-data.json new file mode 100644 index 0000000..1315ceb --- /dev/null +++ b/page-data/offline-plugin-app-shell-fallback/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---node-modules-gatsby-plugin-offline-app-shell-js","path":"/offline-plugin-app-shell-fallback/","result":{"pageContext":{}}} \ No newline at end of file diff --git a/src/components/Header/Header.js b/src/components/Header/Header.js deleted file mode 100644 index 5e016af..0000000 --- a/src/components/Header/Header.js +++ /dev/null @@ -1,77 +0,0 @@ -import { Link } from 'gatsby'; -import PropTypes from 'prop-types'; -import React from 'react'; -import headerStyles from './Header.module.css'; - -class Header extends React.Component { - constructor(props) { - super(props); - this.state = { - showNav: false - }; - } - toggleNav = () => { - this.setState({ - showNav: !this.state.showNav - }); - }; - - render() { - const { showNav } = this.state; - return ( -
-
- - {this.props.siteTitle} - -
-
- ☰ -
- - -
- ); - } -} - -Header.propTypes = { - siteTitle: PropTypes.string -}; - -Header.defaultProps = { - siteTitle: '' -}; - -export default Header; diff --git a/src/components/Header/Header.module.css b/src/components/Header/Header.module.css deleted file mode 100644 index 2231e7b..0000000 --- a/src/components/Header/Header.module.css +++ /dev/null @@ -1,104 +0,0 @@ -.header { - background-color: #242121; - color: white; - width: 100%; - position: fixed; - z-index: 99; - display: flex; - flex-flow: row wrap; - align-items: center; - font-size: 0.8rem; -} - -.logo__link { - text-decoration: none; - color: white; - font-size: 1rem; - /* margin-left: 1rem; */ - padding: 0.8rem 1rem; - - cursor: pointer; - user-select: none; -} -.toggle { - font-size: 1.5rem; - margin-left: auto; - padding: 0.8rem 1rem; - cursor: pointer; - user-select: none; -} -.nav { - display: block; - background: white; - width: 100%; -} -.nav > ul { - list-style-type: none; - padding: 1rem 0; - margin: 0; -} -.nav__mobile { - display: flex; - flex-direction: column; - align-items: center; -} -.nav__desktop { - display: none; -} -.nav__item { - width: 100%; - margin: 0; - padding: 0; -} -.nav__link { - display: block; - width: 100%; - height: 100%; - padding: 0.8rem 1rem; - text-align: center; - text-decoration: none; - color: #242121; - font-size: 1rem; - font-family: sans-serif; - font-weight: normal; - transition: all 0.3s ease-in-out 0.1s; - text-transform: capitalize; -} -.nav__link:hover { - background: #d45c54; - color: white; -} - -@media only screen and (max-width: 280px) { - .logo__link { - display: none; - } -} - -@media only screen and (min-width: 1024px) { - .toggle { - display: none; - } - .nav { - display: block; - width: auto; - margin-left: auto; - margin-right: 2rem; - background: transparent; - } - .nav > ul { - padding: 0; - } - .nav__mobile { - display: none; - } - .nav__desktop { - display: flex; - justify-content: space-around; - align-items: center; - } - .nav__link { - color: white; - font-size: 0.8rem; - } -} diff --git a/src/components/Header/index.js b/src/components/Header/index.js deleted file mode 100644 index 7cd29d7..0000000 --- a/src/components/Header/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Header from './Header' - -export default Header diff --git a/src/components/PostPreview/PostPreview.js b/src/components/PostPreview/PostPreview.js deleted file mode 100644 index bee4994..0000000 --- a/src/components/PostPreview/PostPreview.js +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; -import { Link } from 'gatsby'; -import postPreviewStyles from './PostPreview.module.css'; - -const PostPreview = ({ node: post, showExcerpt = true, showButton = true }) => { - return ( -
- - {post.frontmatter.date} -

{post.frontmatter.title}

- {showExcerpt && ( -

{post.excerpt}

- )} - - {showButton && ( - - Read - - )} -
- ); -}; - -const PostPreviewByYear = ({ year, postsInYear = [] }) => { - return ( -
-

{year}

- {postsInYear ? ( - postsInYear.map(post => ( -
- -
- )) - ) : ( -

暂无

- )} -
- ); -}; - -export default PostPreview; -export { PostPreviewByYear }; diff --git a/src/components/PostPreview/PostPreview.module.css b/src/components/PostPreview/PostPreview.module.css deleted file mode 100644 index db28870..0000000 --- a/src/components/PostPreview/PostPreview.module.css +++ /dev/null @@ -1,98 +0,0 @@ -.container { - display: flex; - position: relative; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - flex: 1 0 80%; - padding: 5%; - border-bottom: 1px solid rgba(36, 33, 33, 0.1); -} -.entry { - min-height: 6rem; - text-decoration: none; - position: relative; - color: #242121; - font-family: Arial, Helvetica, sans-serif; - font-size: 1rem; - width: 100%; -} -.entry:focus, -.entry:hover { - cursor: pointer; -} -.date { - text-transform: uppercase; - font-size: 0.7rem; -} -.title { - text-transform: uppercase; -} -.entry:focus .title, -.entry:hover .title { - color: #d45c54; -} -.excerpt { - color: rgba(36, 33, 33, 0.6); -} -.button { - background: #242121; - position: relative; - display: inline-block; - color: white; - text-decoration: none; - font-size: 0.7rem; - text-align: center; - line-height: 2; - font-family: Arial, Helvetica, sans-serif; - text-transform: uppercase; - padding: 0.4rem 2rem; - overflow: hidden; - letter-spacing: 0.1rem; - max-width: 8rem; - border-width: 0; - outline: 0; -} - -.arrow::after { - position: relative; - display: inline-block; - content: '➞'; - transform: translateX(50%); - transition: transform 0.3s ease-in-out; -} - -.button:focus .arrow::after, -.button:hover .arrow::after { - transform: translateX(100%); -} - -.yearPostsContainer { - display: block; - /* flex-direction: column; - justify-content: center; - align-items: center; - flex: 1 1 100%; */ - width: 100%; - padding: 5%; - padding-bottom: 0; - margin: auto; -} -.year { - margin: auto; - padding: 0 5%; -} -.postPreviewWrapper { - padding: 0 5%; -} - -@media only screen and (min-width: 1024px) { - .container { - display: flex; - flex: 0 0 50%; - /* max-width: 50%; */ - } - .yearPostsContainer { - width: 60%; - } -} diff --git a/src/components/PostPreview/index.js b/src/components/PostPreview/index.js deleted file mode 100644 index 4d9cbbc..0000000 --- a/src/components/PostPreview/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import PostPreview, { PostPreviewByYear } from './PostPreview'; - -export default PostPreview; -export { PostPreviewByYear }; diff --git a/src/components/layout.js b/src/components/layout.js deleted file mode 100644 index 3f9d989..0000000 --- a/src/components/layout.js +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { StaticQuery, graphql } from 'gatsby'; -import Header from './Header/index'; -import '../global-styles.css'; - -const Layout = ({ children }) => ( - ( - <> -
- -
- {children} -
- - )} - /> -); - -Layout.propTypes = { - children: PropTypes.node.isRequired -}; - -export default Layout; diff --git a/src/components/seo.js b/src/components/seo.js deleted file mode 100644 index c59050d..0000000 --- a/src/components/seo.js +++ /dev/null @@ -1,96 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import Helmet from 'react-helmet' -import { StaticQuery, graphql } from 'gatsby' - -function SEO({ description, lang, meta, keywords, title }) { - return ( - { - const metaDescription = - description || data.site.siteMetadata.description - return ( - 0 - ? { - name: 'keywords', - content: keywords.join(', '), - } - : [] - ) - .concat(meta)} - /> - ) - }} - /> - ) -} - -SEO.defaultProps = { - lang: 'en', - meta: [], - keywords: [], -} - -SEO.propTypes = { - description: PropTypes.string, - lang: PropTypes.string, - meta: PropTypes.array, - keywords: PropTypes.arrayOf(PropTypes.string), - title: PropTypes.string.isRequired, -} - -export default SEO - -export const detailsQuery = graphql` - query DefaultSEOQuery { - site { - siteMetadata { - title - description - author - } - } - } -` diff --git a/src/global-styles.css b/src/global-styles.css deleted file mode 100644 index 0a06cc9..0000000 --- a/src/global-styles.css +++ /dev/null @@ -1,761 +0,0 @@ -html { - font-family: sans-serif; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - box-sizing: border-box; -} -*, -*::after, -*::before { - box-sizing: inherit; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; -} -audio:not([controls]) { - display: none; - height: 0; -} -progress { - vertical-align: baseline; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; - -webkit-text-decoration-skip: objects; -} -a:active, -a:hover { - outline-width: 0; -} -abbr[title] { - border-bottom: none; - text-decoration: underline; - text-decoration: underline dotted; -} -b, -strong { - font-weight: inherit; - font-weight: bolder; -} -dfn { - font-style: italic; -} -h1 { - font-size: 2em; - margin: 0.67em 0; -} -mark { - background-color: #ff0; - color: #000; -} -small { - font-size: 80%; -} -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sub { - bottom: -0.25em; -} -sup { - top: -0.5em; -} -img { - border-style: none; -} -svg:not(:root) { - overflow: hidden; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -figure { - margin: 1em 40px; -} -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} -button, -input, -optgroup, -select, -textarea { - font: inherit; - margin: 0; -} -optgroup { - font-weight: 700; -} -button, -input { - overflow: visible; -} -button, -select { - text-transform: none; -} -[type='reset'], -[type='submit'], -button, -html [type='button'] { - -webkit-appearance: button; -} -[type='button']::-moz-focus-inner, -[type='reset']::-moz-focus-inner, -[type='submit']::-moz-focus-inner, -button::-moz-focus-inner { - border-style: none; - padding: 0; -} -[type='button']:-moz-focusring, -[type='reset']:-moz-focusring, -[type='submit']:-moz-focusring, -button:-moz-focusring { - outline: 1px dotted ButtonText; -} -fieldset { - border: 1px solid silver; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} -legend { - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; -} -textarea { - overflow: auto; -} -[type='checkbox'], -[type='radio'] { - box-sizing: border-box; - padding: 0; -} -[type='number']::-webkit-inner-spin-button, -[type='number']::-webkit-outer-spin-button { - height: auto; -} -[type='search'] { - -webkit-appearance: textfield; - outline-offset: -2px; -} -[type='search']::-webkit-search-cancel-button, -[type='search']::-webkit-search-decoration { - -webkit-appearance: none; -} -::-webkit-input-placeholder { - color: inherit; - opacity: 0.54; -} -::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; -} -html { - font: 112.5%/1.45em georgia, serif; - box-sizing: border-box; - overflow-y: scroll; -} -* { - box-sizing: inherit; -} -*:before { - box-sizing: inherit; -} -*:after { - box-sizing: inherit; -} -body { - color: hsla(0, 0%, 0%, 0.8); - font-family: Impact, 'Arial Narrow Bold', georgia, serif; - font-weight: normal; - word-wrap: break-word; - font-kerning: normal; - -moz-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - -ms-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - -webkit-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - font-feature-settings: 'kern', 'liga', 'clig', 'calt'; -} -img { - max-width: 100%; - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -h1 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 2.25rem; - line-height: 1.1; -} -h2 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 1.62671rem; - line-height: 1.1; -} -h3 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 1.38316rem; - line-height: 1.1; -} -h4 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 1rem; - line-height: 1.1; -} -h5 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 0.85028rem; - line-height: 1.1; -} -h6 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, - Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 0.78405rem; - line-height: 1.1; -} -hgroup { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -ul { - margin-left: 1.45rem; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - list-style-position: outside; - list-style-image: none; -} -ol { - margin-left: 1.45rem; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - list-style-position: outside; - list-style-image: none; -} -dl { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -dd { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -p { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -figure { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -pre { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 0rem; - font-size: 0.85rem; - line-height: 1.42; - background: hsla(0, 0%, 0%, 0.04); - border-radius: 3px; - overflow: auto; - word-wrap: normal; - padding: 1.45rem; -} -table { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - font-size: 0.8rem; - line-height: 1.45rem; - border-collapse: collapse; - width: 100%; -} -fieldset { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -blockquote { - /* margin-left: 1.45rem; - margin-right: 1.45rem; */ - - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - /* change */ - margin-left: -1rem; - margin-right: -1rem; - padding: 1rem; - border-left: 5px solid #cecece; - background: hsla(0, 0%, 0%, 0.04); - font-style: italic; -} -form { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -noscript { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -iframe { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -hr { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: calc(1.45rem - 1px); - background: hsla(0, 0%, 0%, 0.2); - border: none; - height: 1px; -} -address { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; -} -b { - font-weight: bold; -} -strong { - font-weight: bold; -} -dt { - font-weight: bold; -} -th { - font-weight: bold; -} -li { - margin-bottom: calc(1.45rem / 2); -} -ol li { - padding-left: 0; -} -ul li { - padding-left: 0; -} -li > ol { - margin-left: 1.45rem; - margin-bottom: calc(1.45rem / 2); - margin-top: calc(1.45rem / 2); -} -li > ul { - margin-left: 1.45rem; - margin-bottom: calc(1.45rem / 2); - margin-top: calc(1.45rem / 2); -} -blockquote *:last-child { - margin-bottom: 0; -} -li *:last-child { - margin-bottom: 0; -} -p *:last-child { - margin-bottom: 0; -} -li > p { - margin-bottom: calc(1.45rem / 2); -} -code { - font-size: 0.85rem; - line-height: 1.45rem; -} -kbd { - font-size: 0.85rem; - line-height: 1.45rem; -} -samp { - font-size: 0.85rem; - line-height: 1.45rem; -} -abbr { - border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); - cursor: help; -} -acronym { - border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); - cursor: help; -} -abbr[title] { - border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); - cursor: help; - text-decoration: none; -} -thead { - text-align: left; -} -td, -th { - text-align: left; - border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); - font-feature-settings: 'tnum'; - -moz-font-feature-settings: 'tnum'; - -ms-font-feature-settings: 'tnum'; - -webkit-font-feature-settings: 'tnum'; - padding-left: 0.96667rem; - padding-right: 0.96667rem; - padding-top: 0.725rem; - padding-bottom: calc(0.725rem - 1px); -} -th:first-child, -td:first-child { - padding-left: 0; -} -th:last-child, -td:last-child { - padding-right: 0; -} -tt, -code { - background-color: hsla(0, 0%, 0%, 0.04); - border-radius: 3px; - font-family: 'SFMono-Regular', Consolas, 'Roboto Mono', 'Droid Sans Mono', - 'Liberation Mono', Menlo, Courier, monospace; - padding: 0; - padding-top: 0.2em; - padding-bottom: 0.2em; -} -pre code { - background: none; - line-height: 1.42; -} -code:before, -code:after, -tt:before, -tt:after { - letter-spacing: -0.2em; - content: ' '; -} -pre code:before, -pre code:after, -pre tt:before, -pre tt:after { - content: ''; -} -@media only screen and (max-width: 480px) { - html { - font-size: 100%; - } -} - -.gatsby-highlight { - background: #242121; - color: #fff; - border-radius: 10px; - overflow: auto; - tab-size: 1.5em; - -webkit-overflow-scrolling: touch; - margin-bottom: 1rem; -} - -.gatsby-highlight > code[class*='gatsby-code-'], -.gatsby-highlight > pre[class*='gatsby-code-'], -.gatsby-highlight > pre.prism-code { - height: auto !important; - margin: 1rem; - font-size: 14; - line-height: 20px; - white-space: pre-wrap; - word-break: break-word; -} - -.gatsby-highlight + .gatsby-highlight { - margin-top: 20px; -} - -.gatsby-highlight-code-line { - background-color: #353b45; - display: block; - /* margin: -0.125rem calc(-1rem - 15px); - padding: 0.125rem calc(1rem + 15px); */ - margin-right: -1em; - margin-left: -1em; - padding-right: 1em; - padding-left: 0.75em; -} - -.token.attr-name { - color: #c5a5c5; -} - -.token.comment, -.token.block-comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #b2b2b2; -} - -.token.property, -.token.number, -.token.function-name, -.token.constant, -.token.symbol, -.token.deleted { - color: #5a9bcf; -} - -.token.boolean { - color: #ff8b50; -} - -.token.tag { - color: #fc929e; -} - -.token.string { - color: #8dc891; -} - -.token.punctuation { - color: #88c6be; -} - -.token.selector, -.token.char, -.token.builtin, -.token.inserted { - color: #d8dee9; -} - -.token.function { - color: #79b6f2; -} - -.token.operator, -.token.entity, -.token.url, -.token.variable { - color: #d7deea; -} - -.token.attr-value { - color: #8dc891; -} - -.token.keyword { - color: #c5a5c5; -} - -.token.atrule, -.token.class-name { - color: p#FAC863; -} - -.token.important { - font-weight: 400; -} - -.token.bold { - font-weight: 700; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -.namespace { - opacity: 0.7; -} diff --git a/src/images/arun-nallamayan-1207263-unsplash.jpg b/src/images/arun-nallamayan-1207263-unsplash.jpg deleted file mode 100644 index 4835199..0000000 Binary files a/src/images/arun-nallamayan-1207263-unsplash.jpg and /dev/null differ diff --git a/src/images/favicon.png b/src/images/favicon.png deleted file mode 100644 index f08dbee..0000000 Binary files a/src/images/favicon.png and /dev/null differ diff --git a/src/images/james-traf-242341-unsplash.jpg b/src/images/james-traf-242341-unsplash.jpg deleted file mode 100644 index 47254d3..0000000 Binary files a/src/images/james-traf-242341-unsplash.jpg and /dev/null differ diff --git a/src/images/markus-spiske-1208933-unsplash.jpg b/src/images/markus-spiske-1208933-unsplash.jpg deleted file mode 100644 index 5844e20..0000000 Binary files a/src/images/markus-spiske-1208933-unsplash.jpg and /dev/null differ diff --git a/src/images/osman-rana-263708-unsplash.jpg b/src/images/osman-rana-263708-unsplash.jpg deleted file mode 100644 index 83b8686..0000000 Binary files a/src/images/osman-rana-263708-unsplash.jpg and /dev/null differ diff --git a/src/images/paul-frenzel-159408-unsplash.jpg b/src/images/paul-frenzel-159408-unsplash.jpg deleted file mode 100644 index b4da03a..0000000 Binary files a/src/images/paul-frenzel-159408-unsplash.jpg and /dev/null differ diff --git a/src/images/paul-volkmer-638816-unsplash.jpg b/src/images/paul-volkmer-638816-unsplash.jpg deleted file mode 100644 index e9d600a..0000000 Binary files a/src/images/paul-volkmer-638816-unsplash.jpg and /dev/null differ diff --git a/src/images/post-default-bg.jpg b/src/images/post-default-bg.jpg deleted file mode 100644 index a11a77d..0000000 Binary files a/src/images/post-default-bg.jpg and /dev/null differ diff --git a/src/images/samuel-zeller-34751-unsplash.jpg b/src/images/samuel-zeller-34751-unsplash.jpg deleted file mode 100644 index 7be944b..0000000 Binary files a/src/images/samuel-zeller-34751-unsplash.jpg and /dev/null differ diff --git a/src/images/stefan-odobasu-1209110-unsplash.jpg b/src/images/stefan-odobasu-1209110-unsplash.jpg deleted file mode 100644 index fcfb6f8..0000000 Binary files a/src/images/stefan-odobasu-1209110-unsplash.jpg and /dev/null differ diff --git a/src/pages/404.js b/src/pages/404.js deleted file mode 100644 index 77a691f..0000000 --- a/src/pages/404.js +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react' - -import Layout from '../components/layout' -import SEO from '../components/seo' - -const NotFoundPage = () => ( - - -

NOT FOUND

-

You just hit a route that doesn't exist... the sadness.

-
-) - -export default NotFoundPage diff --git a/src/pages/About.js b/src/pages/About.js deleted file mode 100644 index 9e81cba..0000000 --- a/src/pages/About.js +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; -import Layout from '../components/layout'; -import SEO from '../components/seo'; - -class AboutPage extends React.Component { - componentDidMount() {} - render() { - return ( - - -

About Me

-

About

-

Me

-
- ); - } -} - -export default AboutPage; diff --git a/src/pages/Blog.js b/src/pages/Blog.js deleted file mode 100644 index b8d12dc..0000000 --- a/src/pages/Blog.js +++ /dev/null @@ -1,135 +0,0 @@ -import React from 'react'; -import { graphql } from 'gatsby'; - -import Layout from '../components/layout'; -import SEO from '../components/seo'; -import { PostPreviewByYear } from '../components/PostPreview'; -import Img from 'gatsby-image'; -// eslint-disable-next-line -import { fluidImageBg } from '../utils/ImageQuery'; - -const BlogPage = ({ data }) => { - const { edges: posts } = data.allMarkdownRemark; - const postsByYear = categoryPostsByYear(posts); - const yearDesc = Object.keys(postsByYear).sort((a, b) => b - a); - // console.log(yearDesc); - return ( - - -
- osman-rana-263708-unsplash - -
-
-

- "The ultimate test of your knowledge is your capacity to convey it - to another." -

-
-
-
-
- {yearDesc.map(year => { - let postsInYear = postsByYear[year]; - return ( - - ); - })} -
-
- ); -}; - -export default BlogPage; - -export const pageQuery = graphql` - query { - site { - siteMetadata { - title - description - } - } - bgImg: file(relativePath: { eq: "osman-rana-263708-unsplash.jpg" }) { - childImageSharp { - fluid(maxWidth: 3000, grayscale: true) { - ...GatsbyImageSharpFluid - } - } - } - allMarkdownRemark(sort: { fields: [frontmatter___date], order: DESC }) { - edges { - node { - excerpt - fields { - slug - } - id - frontmatter { - date(formatString: "MMMM DD, YYYY") - title - } - } - } - } - } -`; - -function categoryPostsByYear(posts, order = 'DESC') { - var postsByYear = {}; - const reg = /(\d)+/g; - posts.forEach(post => { - const { date } = post.node.frontmatter; - const dates = date.match(reg); - const year = dates[1]; - - if (!postsByYear[year]) { - postsByYear[year] = []; - } - postsByYear[year].push(post); - }); - // console.log(postsByYear['2017'], postsByYear['2018']); - return postsByYear; -} diff --git a/src/pages/Portfolio.js b/src/pages/Portfolio.js deleted file mode 100644 index 495b3fa..0000000 --- a/src/pages/Portfolio.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import Layout from '../components/layout'; -import SEO from '../components/seo'; -import Img from 'gatsby-image'; -import { graphql } from 'gatsby'; -// eslint-disable-next-line -import { fluidImageBg } from '../utils/ImageQuery'; - -const PortfolioPage = ({ data }) => ( - - -
- paul-volkmer-638816-unsplash -
-
-

- Coming Soon -

-
-
-
-
-); - -export default PortfolioPage; - -export const pageQuery = graphql` - query { - bgImg: file(relativePath: { eq: "arun-nallamayan-1207263-unsplash.jpg" }) { - ...fluidImageBg - } - } -`; diff --git a/src/pages/index.js b/src/pages/index.js deleted file mode 100644 index fc34111..0000000 --- a/src/pages/index.js +++ /dev/null @@ -1,106 +0,0 @@ -import React from 'react'; -import Img from 'gatsby-image'; -import { graphql } from 'gatsby'; - -import Layout from '../components/layout'; -import SEO from '../components/seo'; -import PostPreview from '../components/PostPreview'; -// eslint-disable-next-line -import { fluidImageBg } from '../utils/ImageQuery'; - -const IndexPage = ({ data }) => { - const { edges: posts } = data.allMarkdownRemark; - return ( - - -
- paul-volkmer-638816-unsplash -
-
-

- Thoughts die but codes survive - -

-

- welcom to alex's midway -

-
-
-
-
- {posts.map(({ node: post }) => { - return ; - })} -
-
- ); -}; - -export default IndexPage; - -export const pageQuery = graphql` - query { - site { - siteMetadata { - title - description - } - } - bgImg: file(relativePath: { eq: "paul-volkmer-638816-unsplash.jpg" }) { - ...fluidImageBg - } - allMarkdownRemark(sort: { fields: [frontmatter___date], order: DESC }) { - edges { - node { - excerpt - fields { - slug - } - id - frontmatter { - date(formatString: "MMMM DD, YYYY") - title - } - } - } - } - } -`; diff --git a/src/templates/Post/Post.js b/src/templates/Post/Post.js deleted file mode 100644 index 7133027..0000000 --- a/src/templates/Post/Post.js +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react'; -import { graphql, Link } from 'gatsby'; -import Img from 'gatsby-image'; - -import Layout from '../../components/layout'; -import SEO from '../../components/seo'; -import postStyles from './Post.module.css'; -// eslint-disable-next-line -import { fluidImageBg } from '../../utils/ImageQuery'; -import 'katex/dist/katex.min.css'; - -const BlogPost = ({ data, pageContext }) => { - const post = data.markdownRemark; - const { previous, next } = pageContext; - console.log(previous, next); - return ( - - -
- { -
-
-

{post.frontmatter.title}

-

{post.frontmatter.date}

-
-
-
- -
-
- - -
-
-
- ); -}; - -export default BlogPost; - -export const pageQuery = graphql` - query BlogPostByID($slug: String!) { - markdownRemark(fields: { slug: { eq: $slug } }) { - id - excerpt - html - frontmatter { - date(formatString: "MMMM DD, YYYY") - title - image { - ...fluidImageBg - } - } - } - } -`; diff --git a/src/templates/Post/Post.module.css b/src/templates/Post/Post.module.css deleted file mode 100644 index 5500490..0000000 --- a/src/templates/Post/Post.module.css +++ /dev/null @@ -1,118 +0,0 @@ -.article { - background: #fff; - font-family: Arial, Helvetica, sans-serif; - font-size: 0.8rem; -} -.grid { - display: block; - width: 90%; - margin: 5% auto; - padding: 0 2%; -} -.header { - position: relative; - display: block; - margin: 0 auto; - max-width: 90%; - display: flex; - flex-direction: column; - justify-content: center; -} -.img { - width: 100%; - height: 50vh; -} -.title { - width: 100%; - font-size: 1.9rem; - text-transform: capitalize; -} -.date { - width: 100%; - font-size: 0.8rem; - font-weight: bold; -} -.passage { - max-width: 90%; - margin: 0 auto 1rem; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); -} -.nav { - display: flex; - justify-content: space-between; - align-items: center; - flex-basis: 90%; - max-width: 90%; - margin: 0 auto; -} -.left { - display: flex; - align-self: flex-start; -} -.right { - display: flex; - align-self: flex-end; -} - -.button { - background: white; - position: relative; - display: inline-block; - color: #242121; - text-decoration: none; - font-size: 0.7rem; - text-align: center; - line-height: 2; - font-family: Arial, Helvetica, sans-serif; - text-transform: uppercase; - padding: 0.4rem 2rem; - overflow: hidden; - letter-spacing: 0.1rem; - min-width: 8rem; - - border: 1px solid #242121; - outline: 0; - transition: transform 0.3s ease-in-out; -} - -.button:hover { - background-color: #242121; - color: white; -} -.arrow { - font-weight: lighter; -} -.prev::before { - position: relative; - display: block; - content: 'PREVIOUS'; - font-weight: bolder; -} -.next::before { - position: relative; - display: block; - content: 'NEXT'; - font-weight: bolder; -} - -@media only screen and (min-width: 1024px) { - .header { - max-width: 60%; - } - .passage { - max-width: 60%; - } - .title { - font-size: 2.9rem; - } - .nav { - flex-basis: 60%; - max-width: 60%; - } -} - -@media only screen and (min-width: 1920px) { - .article { - font-size: 1.2rem; - } -} diff --git a/src/templates/Post/index.js b/src/templates/Post/index.js deleted file mode 100644 index 9f41bde..0000000 --- a/src/templates/Post/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import BlogPost from './Post'; - -export default BlogPost; diff --git a/src/templates/ProjectCard.js b/src/templates/ProjectCard.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/theme/index.js b/src/theme/index.js deleted file mode 100644 index 58799ee..0000000 --- a/src/theme/index.js +++ /dev/null @@ -1,22 +0,0 @@ -const background = { - primary: '#242121', - secondary: '#fff' -}; - -const textColor = { - primary: '#242121', - secondary: '#d45c54' -}; - -const fontSize = { - small: '16px', - medium: '24px', - large: '32px' -}; - -const colors = { - dark: '#242121', - white: '#fff' -}; - -export { background, textColor, fontSize, colors }; diff --git a/src/utils/ImageQuery.js b/src/utils/ImageQuery.js deleted file mode 100644 index 4c162c5..0000000 --- a/src/utils/ImageQuery.js +++ /dev/null @@ -1,11 +0,0 @@ -import { graphql } from 'gatsby'; - -export const fluidImageBg = graphql` - fragment fluidImageBg on File { - childImageSharp { - fluid(maxWidth: 3000, quality: 70) { - ...GatsbyImageSharpFluid - } - } - } -`; diff --git a/static/05b6cb81388438cc41b80dff746d46d2/08115/charles-7.png b/static/05b6cb81388438cc41b80dff746d46d2/08115/charles-7.png new file mode 100644 index 0000000..086106b Binary files /dev/null and b/static/05b6cb81388438cc41b80dff746d46d2/08115/charles-7.png differ diff --git a/static/05b6cb81388438cc41b80dff746d46d2/5a46d/charles-7.png b/static/05b6cb81388438cc41b80dff746d46d2/5a46d/charles-7.png new file mode 100644 index 0000000..d67e7ed Binary files /dev/null and b/static/05b6cb81388438cc41b80dff746d46d2/5a46d/charles-7.png differ diff --git a/static/08a6bc1c754ab96fb148451410267679/05ed2/web-debugging.png b/static/08a6bc1c754ab96fb148451410267679/05ed2/web-debugging.png new file mode 100644 index 0000000..d6e092a Binary files /dev/null and b/static/08a6bc1c754ab96fb148451410267679/05ed2/web-debugging.png differ diff --git a/static/08a6bc1c754ab96fb148451410267679/5a46d/web-debugging.png b/static/08a6bc1c754ab96fb148451410267679/5a46d/web-debugging.png new file mode 100644 index 0000000..5136249 Binary files /dev/null and b/static/08a6bc1c754ab96fb148451410267679/5a46d/web-debugging.png differ diff --git a/static/17a8bf4931ec5ebeec0380440978f8a7/09d21/charles-22-android-3.jpg b/static/17a8bf4931ec5ebeec0380440978f8a7/09d21/charles-22-android-3.jpg new file mode 100644 index 0000000..eefa7e9 Binary files /dev/null and b/static/17a8bf4931ec5ebeec0380440978f8a7/09d21/charles-22-android-3.jpg differ diff --git a/static/17a8bf4931ec5ebeec0380440978f8a7/f93b5/charles-22-android-3.jpg b/static/17a8bf4931ec5ebeec0380440978f8a7/f93b5/charles-22-android-3.jpg new file mode 100644 index 0000000..2da7312 Binary files /dev/null and b/static/17a8bf4931ec5ebeec0380440978f8a7/f93b5/charles-22-android-3.jpg differ diff --git a/static/1b0805edc8a70143abc833187a4a8b27/a430b/charles-18-ios-6.jpg b/static/1b0805edc8a70143abc833187a4a8b27/a430b/charles-18-ios-6.jpg new file mode 100644 index 0000000..a29e359 Binary files /dev/null and b/static/1b0805edc8a70143abc833187a4a8b27/a430b/charles-18-ios-6.jpg differ diff --git a/static/1b0805edc8a70143abc833187a4a8b27/b4294/charles-18-ios-6.jpg b/static/1b0805edc8a70143abc833187a4a8b27/b4294/charles-18-ios-6.jpg new file mode 100644 index 0000000..4afd088 Binary files /dev/null and b/static/1b0805edc8a70143abc833187a4a8b27/b4294/charles-18-ios-6.jpg differ diff --git a/static/1b0805edc8a70143abc833187a4a8b27/f93b5/charles-18-ios-6.jpg b/static/1b0805edc8a70143abc833187a4a8b27/f93b5/charles-18-ios-6.jpg new file mode 100644 index 0000000..e9bb8ab Binary files /dev/null and b/static/1b0805edc8a70143abc833187a4a8b27/f93b5/charles-18-ios-6.jpg differ diff --git a/static/1e41155ace4c8d1c34232d5885aa8a4b/09d21/charles-21-android-2.jpg b/static/1e41155ace4c8d1c34232d5885aa8a4b/09d21/charles-21-android-2.jpg new file mode 100644 index 0000000..fc5aa5c Binary files /dev/null and b/static/1e41155ace4c8d1c34232d5885aa8a4b/09d21/charles-21-android-2.jpg differ diff --git a/static/1e41155ace4c8d1c34232d5885aa8a4b/f93b5/charles-21-android-2.jpg b/static/1e41155ace4c8d1c34232d5885aa8a4b/f93b5/charles-21-android-2.jpg new file mode 100644 index 0000000..08a1310 Binary files /dev/null and b/static/1e41155ace4c8d1c34232d5885aa8a4b/f93b5/charles-21-android-2.jpg differ diff --git a/static/239eb9840b9632a1bbc56f4ac80201e4/09d21/charles-20-android-1.jpg b/static/239eb9840b9632a1bbc56f4ac80201e4/09d21/charles-20-android-1.jpg new file mode 100644 index 0000000..7b827c3 Binary files /dev/null and b/static/239eb9840b9632a1bbc56f4ac80201e4/09d21/charles-20-android-1.jpg differ diff --git a/static/239eb9840b9632a1bbc56f4ac80201e4/f93b5/charles-20-android-1.jpg b/static/239eb9840b9632a1bbc56f4ac80201e4/f93b5/charles-20-android-1.jpg new file mode 100644 index 0000000..d5764c9 Binary files /dev/null and b/static/239eb9840b9632a1bbc56f4ac80201e4/f93b5/charles-20-android-1.jpg differ diff --git a/static/276c91e03be37bc857446b7126428ea6/39185/event-bubbling.png b/static/276c91e03be37bc857446b7126428ea6/39185/event-bubbling.png new file mode 100644 index 0000000..dd6ecc2 Binary files /dev/null and b/static/276c91e03be37bc857446b7126428ea6/39185/event-bubbling.png differ diff --git a/static/276c91e03be37bc857446b7126428ea6/5a46d/event-bubbling.png b/static/276c91e03be37bc857446b7126428ea6/5a46d/event-bubbling.png new file mode 100644 index 0000000..d4efd15 Binary files /dev/null and b/static/276c91e03be37bc857446b7126428ea6/5a46d/event-bubbling.png differ diff --git a/static/2a76f8bf960a657e79ba3f629c488a52/09d21/charles-23-android-4.jpg b/static/2a76f8bf960a657e79ba3f629c488a52/09d21/charles-23-android-4.jpg new file mode 100644 index 0000000..45d19cd Binary files /dev/null and b/static/2a76f8bf960a657e79ba3f629c488a52/09d21/charles-23-android-4.jpg differ diff --git a/static/2a76f8bf960a657e79ba3f629c488a52/f93b5/charles-23-android-4.jpg b/static/2a76f8bf960a657e79ba3f629c488a52/f93b5/charles-23-android-4.jpg new file mode 100644 index 0000000..fb8df3a Binary files /dev/null and b/static/2a76f8bf960a657e79ba3f629c488a52/f93b5/charles-23-android-4.jpg differ diff --git a/static/2df63147f7c201943b80caf632c2b314/0a47e/charles-12.png b/static/2df63147f7c201943b80caf632c2b314/0a47e/charles-12.png new file mode 100644 index 0000000..a9ac9cb Binary files /dev/null and b/static/2df63147f7c201943b80caf632c2b314/0a47e/charles-12.png differ diff --git a/static/2df63147f7c201943b80caf632c2b314/5a46d/charles-12.png b/static/2df63147f7c201943b80caf632c2b314/5a46d/charles-12.png new file mode 100644 index 0000000..d074ee5 Binary files /dev/null and b/static/2df63147f7c201943b80caf632c2b314/5a46d/charles-12.png differ diff --git a/static/2df63147f7c201943b80caf632c2b314/9f9a4/charles-12.png b/static/2df63147f7c201943b80caf632c2b314/9f9a4/charles-12.png new file mode 100644 index 0000000..3d47fef Binary files /dev/null and b/static/2df63147f7c201943b80caf632c2b314/9f9a4/charles-12.png differ diff --git a/static/2df63147f7c201943b80caf632c2b314/c1b63/charles-12.png b/static/2df63147f7c201943b80caf632c2b314/c1b63/charles-12.png new file mode 100644 index 0000000..9322f45 Binary files /dev/null and b/static/2df63147f7c201943b80caf632c2b314/c1b63/charles-12.png differ diff --git a/static/4471b2dcbf5a10f09df81c33a58c029e/0a47e/charles-10.png b/static/4471b2dcbf5a10f09df81c33a58c029e/0a47e/charles-10.png new file mode 100644 index 0000000..75015b6 Binary files /dev/null and b/static/4471b2dcbf5a10f09df81c33a58c029e/0a47e/charles-10.png differ diff --git a/static/4471b2dcbf5a10f09df81c33a58c029e/1843f/charles-10.png b/static/4471b2dcbf5a10f09df81c33a58c029e/1843f/charles-10.png new file mode 100644 index 0000000..fd6f3da Binary files /dev/null and b/static/4471b2dcbf5a10f09df81c33a58c029e/1843f/charles-10.png differ diff --git a/static/4471b2dcbf5a10f09df81c33a58c029e/5a46d/charles-10.png b/static/4471b2dcbf5a10f09df81c33a58c029e/5a46d/charles-10.png new file mode 100644 index 0000000..b51cb15 Binary files /dev/null and b/static/4471b2dcbf5a10f09df81c33a58c029e/5a46d/charles-10.png differ diff --git a/static/5602d1218a32e2073b9b93e073083e42/010dc/charles-11.png b/static/5602d1218a32e2073b9b93e073083e42/010dc/charles-11.png new file mode 100644 index 0000000..7d7b231 Binary files /dev/null and b/static/5602d1218a32e2073b9b93e073083e42/010dc/charles-11.png differ diff --git a/static/5602d1218a32e2073b9b93e073083e42/0a47e/charles-11.png b/static/5602d1218a32e2073b9b93e073083e42/0a47e/charles-11.png new file mode 100644 index 0000000..c39bb26 Binary files /dev/null and b/static/5602d1218a32e2073b9b93e073083e42/0a47e/charles-11.png differ diff --git a/static/5602d1218a32e2073b9b93e073083e42/5a46d/charles-11.png b/static/5602d1218a32e2073b9b93e073083e42/5a46d/charles-11.png new file mode 100644 index 0000000..76ddf52 Binary files /dev/null and b/static/5602d1218a32e2073b9b93e073083e42/5a46d/charles-11.png differ diff --git a/static/5602d1218a32e2073b9b93e073083e42/c1b63/charles-11.png b/static/5602d1218a32e2073b9b93e073083e42/c1b63/charles-11.png new file mode 100644 index 0000000..c94850e Binary files /dev/null and b/static/5602d1218a32e2073b9b93e073083e42/c1b63/charles-11.png differ diff --git a/static/5b330a46e2073ce438b4ebf6ccbd2b1d/51d5f/paul-volkmer-638816-unsplash.jpg b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/51d5f/paul-volkmer-638816-unsplash.jpg new file mode 100644 index 0000000..f9d14eb Binary files /dev/null and b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/51d5f/paul-volkmer-638816-unsplash.jpg differ diff --git a/static/5b330a46e2073ce438b4ebf6ccbd2b1d/72227/paul-volkmer-638816-unsplash.jpg b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/72227/paul-volkmer-638816-unsplash.jpg new file mode 100644 index 0000000..8052fd8 Binary files /dev/null and b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/72227/paul-volkmer-638816-unsplash.jpg differ diff --git a/static/5b330a46e2073ce438b4ebf6ccbd2b1d/7a34f/paul-volkmer-638816-unsplash.jpg b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/7a34f/paul-volkmer-638816-unsplash.jpg new file mode 100644 index 0000000..ffb6811 Binary files /dev/null and b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/7a34f/paul-volkmer-638816-unsplash.jpg differ diff --git a/static/5b330a46e2073ce438b4ebf6ccbd2b1d/d41e0/paul-volkmer-638816-unsplash.jpg b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/d41e0/paul-volkmer-638816-unsplash.jpg new file mode 100644 index 0000000..b908243 Binary files /dev/null and b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/d41e0/paul-volkmer-638816-unsplash.jpg differ diff --git a/static/5b330a46e2073ce438b4ebf6ccbd2b1d/f9e02/paul-volkmer-638816-unsplash.jpg b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/f9e02/paul-volkmer-638816-unsplash.jpg new file mode 100644 index 0000000..0137ea4 Binary files /dev/null and b/static/5b330a46e2073ce438b4ebf6ccbd2b1d/f9e02/paul-volkmer-638816-unsplash.jpg differ diff --git a/static/685a7e3d75fb69ba9d6eacd7fd34af9f/a430b/charles-16-ios-4.jpg b/static/685a7e3d75fb69ba9d6eacd7fd34af9f/a430b/charles-16-ios-4.jpg new file mode 100644 index 0000000..fa69c3b Binary files /dev/null and b/static/685a7e3d75fb69ba9d6eacd7fd34af9f/a430b/charles-16-ios-4.jpg differ diff --git a/static/685a7e3d75fb69ba9d6eacd7fd34af9f/b4294/charles-16-ios-4.jpg b/static/685a7e3d75fb69ba9d6eacd7fd34af9f/b4294/charles-16-ios-4.jpg new file mode 100644 index 0000000..da8cbb7 Binary files /dev/null and b/static/685a7e3d75fb69ba9d6eacd7fd34af9f/b4294/charles-16-ios-4.jpg differ diff --git a/static/685a7e3d75fb69ba9d6eacd7fd34af9f/f93b5/charles-16-ios-4.jpg b/static/685a7e3d75fb69ba9d6eacd7fd34af9f/f93b5/charles-16-ios-4.jpg new file mode 100644 index 0000000..641ce0c Binary files /dev/null and b/static/685a7e3d75fb69ba9d6eacd7fd34af9f/f93b5/charles-16-ios-4.jpg differ diff --git a/static/6f0bba001e9410f895f37e9e21922344/a430b/charles-13-ios-1.jpg b/static/6f0bba001e9410f895f37e9e21922344/a430b/charles-13-ios-1.jpg new file mode 100644 index 0000000..e6578b0 Binary files /dev/null and b/static/6f0bba001e9410f895f37e9e21922344/a430b/charles-13-ios-1.jpg differ diff --git a/static/6f0bba001e9410f895f37e9e21922344/b4294/charles-13-ios-1.jpg b/static/6f0bba001e9410f895f37e9e21922344/b4294/charles-13-ios-1.jpg new file mode 100644 index 0000000..842c528 Binary files /dev/null and b/static/6f0bba001e9410f895f37e9e21922344/b4294/charles-13-ios-1.jpg differ diff --git a/static/6f0bba001e9410f895f37e9e21922344/f93b5/charles-13-ios-1.jpg b/static/6f0bba001e9410f895f37e9e21922344/f93b5/charles-13-ios-1.jpg new file mode 100644 index 0000000..d76f927 Binary files /dev/null and b/static/6f0bba001e9410f895f37e9e21922344/f93b5/charles-13-ios-1.jpg differ diff --git a/static/7014a0cb830442401ef733d7533e86d5/0a47e/charles-19.png b/static/7014a0cb830442401ef733d7533e86d5/0a47e/charles-19.png new file mode 100644 index 0000000..8ef951d Binary files /dev/null and b/static/7014a0cb830442401ef733d7533e86d5/0a47e/charles-19.png differ diff --git a/static/7014a0cb830442401ef733d7533e86d5/5a46d/charles-19.png b/static/7014a0cb830442401ef733d7533e86d5/5a46d/charles-19.png new file mode 100644 index 0000000..86e0aa3 Binary files /dev/null and b/static/7014a0cb830442401ef733d7533e86d5/5a46d/charles-19.png differ diff --git a/static/7014a0cb830442401ef733d7533e86d5/60b8f/charles-19.png b/static/7014a0cb830442401ef733d7533e86d5/60b8f/charles-19.png new file mode 100644 index 0000000..7728b4b Binary files /dev/null and b/static/7014a0cb830442401ef733d7533e86d5/60b8f/charles-19.png differ diff --git a/static/7014a0cb830442401ef733d7533e86d5/c1b63/charles-19.png b/static/7014a0cb830442401ef733d7533e86d5/c1b63/charles-19.png new file mode 100644 index 0000000..2091afc Binary files /dev/null and b/static/7014a0cb830442401ef733d7533e86d5/c1b63/charles-19.png differ diff --git a/static/8408bc9eeee980cacec0824f454c744c/0a47e/prototype-chain.png b/static/8408bc9eeee980cacec0824f454c744c/0a47e/prototype-chain.png new file mode 100644 index 0000000..fda29b3 Binary files /dev/null and b/static/8408bc9eeee980cacec0824f454c744c/0a47e/prototype-chain.png differ diff --git a/static/8408bc9eeee980cacec0824f454c744c/5a46d/prototype-chain.png b/static/8408bc9eeee980cacec0824f454c744c/5a46d/prototype-chain.png new file mode 100644 index 0000000..94ca534 Binary files /dev/null and b/static/8408bc9eeee980cacec0824f454c744c/5a46d/prototype-chain.png differ diff --git a/static/8408bc9eeee980cacec0824f454c744c/97a96/prototype-chain.png b/static/8408bc9eeee980cacec0824f454c744c/97a96/prototype-chain.png new file mode 100644 index 0000000..9a8b568 Binary files /dev/null and b/static/8408bc9eeee980cacec0824f454c744c/97a96/prototype-chain.png differ diff --git a/static/8408bc9eeee980cacec0824f454c744c/c1b63/prototype-chain.png b/static/8408bc9eeee980cacec0824f454c744c/c1b63/prototype-chain.png new file mode 100644 index 0000000..c4946f8 Binary files /dev/null and b/static/8408bc9eeee980cacec0824f454c744c/c1b63/prototype-chain.png differ diff --git a/static/8408bc9eeee980cacec0824f454c744c/d61c2/prototype-chain.png b/static/8408bc9eeee980cacec0824f454c744c/d61c2/prototype-chain.png new file mode 100644 index 0000000..f9ab76d Binary files /dev/null and b/static/8408bc9eeee980cacec0824f454c744c/d61c2/prototype-chain.png differ diff --git a/static/8408bc9eeee980cacec0824f454c744c/db664/prototype-chain.png b/static/8408bc9eeee980cacec0824f454c744c/db664/prototype-chain.png new file mode 100644 index 0000000..45bba26 Binary files /dev/null and b/static/8408bc9eeee980cacec0824f454c744c/db664/prototype-chain.png differ diff --git a/static/8e723a12851df191cfdbabad765f5468/a430b/charles-17-ios-5.jpg b/static/8e723a12851df191cfdbabad765f5468/a430b/charles-17-ios-5.jpg new file mode 100644 index 0000000..2a55908 Binary files /dev/null and b/static/8e723a12851df191cfdbabad765f5468/a430b/charles-17-ios-5.jpg differ diff --git a/static/8e723a12851df191cfdbabad765f5468/b4294/charles-17-ios-5.jpg b/static/8e723a12851df191cfdbabad765f5468/b4294/charles-17-ios-5.jpg new file mode 100644 index 0000000..0d292cf Binary files /dev/null and b/static/8e723a12851df191cfdbabad765f5468/b4294/charles-17-ios-5.jpg differ diff --git a/static/8e723a12851df191cfdbabad765f5468/f93b5/charles-17-ios-5.jpg b/static/8e723a12851df191cfdbabad765f5468/f93b5/charles-17-ios-5.jpg new file mode 100644 index 0000000..0ad131e Binary files /dev/null and b/static/8e723a12851df191cfdbabad765f5468/f93b5/charles-17-ios-5.jpg differ diff --git a/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg b/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg new file mode 100644 index 0000000..aaff25d Binary files /dev/null and b/static/9983387778f1c70c0ce32374522d12c6/72227/post-default-bg.jpg differ diff --git a/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg b/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg new file mode 100644 index 0000000..48632b2 Binary files /dev/null and b/static/9983387778f1c70c0ce32374522d12c6/76224/post-default-bg.jpg differ diff --git a/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg b/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg new file mode 100644 index 0000000..4b3bde4 Binary files /dev/null and b/static/9983387778f1c70c0ce32374522d12c6/7a34f/post-default-bg.jpg differ diff --git a/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg b/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg new file mode 100644 index 0000000..b0f8245 Binary files /dev/null and b/static/9983387778f1c70c0ce32374522d12c6/d41e0/post-default-bg.jpg differ diff --git a/static/KaTeX_AMS-Regular-7f06b4e30317f784d61d26686aed0ab2.woff b/static/KaTeX_AMS-Regular-7f06b4e30317f784d61d26686aed0ab2.woff new file mode 100644 index 0000000..4f57515 Binary files /dev/null and b/static/KaTeX_AMS-Regular-7f06b4e30317f784d61d26686aed0ab2.woff differ diff --git a/static/KaTeX_AMS-Regular-aaf4eee9fba9907d61c3935e0b6a54ae.ttf b/static/KaTeX_AMS-Regular-aaf4eee9fba9907d61c3935e0b6a54ae.ttf new file mode 100644 index 0000000..afcd2eb Binary files /dev/null and b/static/KaTeX_AMS-Regular-aaf4eee9fba9907d61c3935e0b6a54ae.ttf differ diff --git a/static/KaTeX_AMS-Regular-e78e28b4834954df047e4925e9dbf354.woff2 b/static/KaTeX_AMS-Regular-e78e28b4834954df047e4925e9dbf354.woff2 new file mode 100644 index 0000000..b982d6e Binary files /dev/null and b/static/KaTeX_AMS-Regular-e78e28b4834954df047e4925e9dbf354.woff2 differ diff --git a/static/KaTeX_Caligraphic-Bold-021dd4dc61ee5f5cdf315f43b48c094b.ttf b/static/KaTeX_Caligraphic-Bold-021dd4dc61ee5f5cdf315f43b48c094b.ttf new file mode 100644 index 0000000..f84148d Binary files /dev/null and b/static/KaTeX_Caligraphic-Bold-021dd4dc61ee5f5cdf315f43b48c094b.ttf differ diff --git a/static/KaTeX_Caligraphic-Bold-1e802ca9dedc4ed4e3c6f645e4316128.woff b/static/KaTeX_Caligraphic-Bold-1e802ca9dedc4ed4e3c6f645e4316128.woff new file mode 100644 index 0000000..ab56ab7 Binary files /dev/null and b/static/KaTeX_Caligraphic-Bold-1e802ca9dedc4ed4e3c6f645e4316128.woff differ diff --git a/static/KaTeX_Caligraphic-Bold-4ec58befa687e9752c3c91cd9bcf1bcb.woff2 b/static/KaTeX_Caligraphic-Bold-4ec58befa687e9752c3c91cd9bcf1bcb.woff2 new file mode 100644 index 0000000..710c261 Binary files /dev/null and b/static/KaTeX_Caligraphic-Bold-4ec58befa687e9752c3c91cd9bcf1bcb.woff2 differ diff --git a/static/KaTeX_Caligraphic-Regular-7edb53b6693d75b8a2232481eea1a52c.woff2 b/static/KaTeX_Caligraphic-Regular-7edb53b6693d75b8a2232481eea1a52c.woff2 new file mode 100644 index 0000000..ee5193d Binary files /dev/null and b/static/KaTeX_Caligraphic-Regular-7edb53b6693d75b8a2232481eea1a52c.woff2 differ diff --git a/static/KaTeX_Caligraphic-Regular-d3b46c3a530116933081d9d74e3e9fe8.woff b/static/KaTeX_Caligraphic-Regular-d3b46c3a530116933081d9d74e3e9fe8.woff new file mode 100644 index 0000000..aec8a33 Binary files /dev/null and b/static/KaTeX_Caligraphic-Regular-d3b46c3a530116933081d9d74e3e9fe8.woff differ diff --git a/static/KaTeX_Caligraphic-Regular-d49f2d55ce4f40f982d8ba63d746fbf9.ttf b/static/KaTeX_Caligraphic-Regular-d49f2d55ce4f40f982d8ba63d746fbf9.ttf new file mode 100644 index 0000000..97814db Binary files /dev/null and b/static/KaTeX_Caligraphic-Regular-d49f2d55ce4f40f982d8ba63d746fbf9.ttf differ diff --git a/static/KaTeX_Fraktur-Bold-a31e7cba7b7221ebf1a2ae545fb306b2.ttf b/static/KaTeX_Fraktur-Bold-a31e7cba7b7221ebf1a2ae545fb306b2.ttf new file mode 100644 index 0000000..483a7cd Binary files /dev/null and b/static/KaTeX_Fraktur-Bold-a31e7cba7b7221ebf1a2ae545fb306b2.ttf differ diff --git a/static/KaTeX_Fraktur-Bold-c4c8cab7d5be97b2bb283e531c077355.woff b/static/KaTeX_Fraktur-Bold-c4c8cab7d5be97b2bb283e531c077355.woff new file mode 100644 index 0000000..189fea5 Binary files /dev/null and b/static/KaTeX_Fraktur-Bold-c4c8cab7d5be97b2bb283e531c077355.woff differ diff --git a/static/KaTeX_Fraktur-Bold-d5b59ec9764e10f4a82369ae29f3ac58.woff2 b/static/KaTeX_Fraktur-Bold-d5b59ec9764e10f4a82369ae29f3ac58.woff2 new file mode 100644 index 0000000..dc3bd4c Binary files /dev/null and b/static/KaTeX_Fraktur-Bold-d5b59ec9764e10f4a82369ae29f3ac58.woff2 differ diff --git a/static/KaTeX_Fraktur-Regular-32a5339eb809f381a7357ba56f82aab3.woff2 b/static/KaTeX_Fraktur-Regular-32a5339eb809f381a7357ba56f82aab3.woff2 new file mode 100644 index 0000000..7eeba37 Binary files /dev/null and b/static/KaTeX_Fraktur-Regular-32a5339eb809f381a7357ba56f82aab3.woff2 differ diff --git a/static/KaTeX_Fraktur-Regular-a48dad4f58c82e38a10da0ceebb86370.ttf b/static/KaTeX_Fraktur-Regular-a48dad4f58c82e38a10da0ceebb86370.ttf new file mode 100644 index 0000000..9aa5f67 Binary files /dev/null and b/static/KaTeX_Fraktur-Regular-a48dad4f58c82e38a10da0ceebb86370.ttf differ diff --git a/static/KaTeX_Fraktur-Regular-b7d9c46bff5d51da6209e355cc4a235d.woff b/static/KaTeX_Fraktur-Regular-b7d9c46bff5d51da6209e355cc4a235d.woff new file mode 100644 index 0000000..d01450e Binary files /dev/null and b/static/KaTeX_Fraktur-Regular-b7d9c46bff5d51da6209e355cc4a235d.woff differ diff --git a/static/KaTeX_Main-Bold-22086eb5d97009c3e99bcc1d16ce6865.woff b/static/KaTeX_Main-Bold-22086eb5d97009c3e99bcc1d16ce6865.woff new file mode 100644 index 0000000..acf48e6 Binary files /dev/null and b/static/KaTeX_Main-Bold-22086eb5d97009c3e99bcc1d16ce6865.woff differ diff --git a/static/KaTeX_Main-Bold-8e1e01c4b1207c0a383d9a2b4f86e637.woff2 b/static/KaTeX_Main-Bold-8e1e01c4b1207c0a383d9a2b4f86e637.woff2 new file mode 100644 index 0000000..cf5abab Binary files /dev/null and b/static/KaTeX_Main-Bold-8e1e01c4b1207c0a383d9a2b4f86e637.woff2 differ diff --git a/static/KaTeX_Main-Bold-9ceff51b3cb7ce6eb4e8efa8163a1472.ttf b/static/KaTeX_Main-Bold-9ceff51b3cb7ce6eb4e8efa8163a1472.ttf new file mode 100644 index 0000000..dc0185a Binary files /dev/null and b/static/KaTeX_Main-Bold-9ceff51b3cb7ce6eb4e8efa8163a1472.ttf differ diff --git a/static/KaTeX_Main-BoldItalic-284a17fe5baf72ff8217d4c7e70c0f82.woff2 b/static/KaTeX_Main-BoldItalic-284a17fe5baf72ff8217d4c7e70c0f82.woff2 new file mode 100644 index 0000000..d0178f4 Binary files /dev/null and b/static/KaTeX_Main-BoldItalic-284a17fe5baf72ff8217d4c7e70c0f82.woff2 differ diff --git a/static/KaTeX_Main-BoldItalic-4c57dbc44bfff1fdf08a59cf556fdab3.woff b/static/KaTeX_Main-BoldItalic-4c57dbc44bfff1fdf08a59cf556fdab3.woff new file mode 100644 index 0000000..d2cfe4e Binary files /dev/null and b/static/KaTeX_Main-BoldItalic-4c57dbc44bfff1fdf08a59cf556fdab3.woff differ diff --git a/static/KaTeX_Main-BoldItalic-e8b44b990516dab7937bf240fde8b46a.ttf b/static/KaTeX_Main-BoldItalic-e8b44b990516dab7937bf240fde8b46a.ttf new file mode 100644 index 0000000..4346f17 Binary files /dev/null and b/static/KaTeX_Main-BoldItalic-e8b44b990516dab7937bf240fde8b46a.ttf differ diff --git a/static/KaTeX_Main-Italic-29c86397e75cdcb3135af8295f1c2e28.ttf b/static/KaTeX_Main-Italic-29c86397e75cdcb3135af8295f1c2e28.ttf new file mode 100644 index 0000000..f2c3eba Binary files /dev/null and b/static/KaTeX_Main-Italic-29c86397e75cdcb3135af8295f1c2e28.ttf differ diff --git a/static/KaTeX_Main-Italic-99be0e10c38cd42466e6fe1665ef9536.woff b/static/KaTeX_Main-Italic-99be0e10c38cd42466e6fe1665ef9536.woff new file mode 100644 index 0000000..1184295 Binary files /dev/null and b/static/KaTeX_Main-Italic-99be0e10c38cd42466e6fe1665ef9536.woff differ diff --git a/static/KaTeX_Main-Italic-e533d5a2506cf053cd671b335ec04dde.woff2 b/static/KaTeX_Main-Italic-e533d5a2506cf053cd671b335ec04dde.woff2 new file mode 100644 index 0000000..aa05e14 Binary files /dev/null and b/static/KaTeX_Main-Italic-e533d5a2506cf053cd671b335ec04dde.woff2 differ diff --git a/static/KaTeX_Main-Regular-5c734d78610fa35282f3379f866707f2.woff2 b/static/KaTeX_Main-Regular-5c734d78610fa35282f3379f866707f2.woff2 new file mode 100644 index 0000000..e3f71eb Binary files /dev/null and b/static/KaTeX_Main-Regular-5c734d78610fa35282f3379f866707f2.woff2 differ diff --git a/static/KaTeX_Main-Regular-5c94aef490324b0925dbe5f643e8fd04.ttf b/static/KaTeX_Main-Regular-5c94aef490324b0925dbe5f643e8fd04.ttf new file mode 100644 index 0000000..8acb365 Binary files /dev/null and b/static/KaTeX_Main-Regular-5c94aef490324b0925dbe5f643e8fd04.ttf differ diff --git a/static/KaTeX_Main-Regular-b741441f6d71014d0453ca3ebc884dd4.woff b/static/KaTeX_Main-Regular-b741441f6d71014d0453ca3ebc884dd4.woff new file mode 100644 index 0000000..9f8228f Binary files /dev/null and b/static/KaTeX_Main-Regular-b741441f6d71014d0453ca3ebc884dd4.woff differ diff --git a/static/KaTeX_Math-BoldItalic-9a2834a9ff8ab411153571e0e55ac693.ttf b/static/KaTeX_Math-BoldItalic-9a2834a9ff8ab411153571e0e55ac693.ttf new file mode 100644 index 0000000..a645df6 Binary files /dev/null and b/static/KaTeX_Math-BoldItalic-9a2834a9ff8ab411153571e0e55ac693.ttf differ diff --git a/static/KaTeX_Math-BoldItalic-b13731ef4e2bfc3d8d859271e39550fc.woff b/static/KaTeX_Math-BoldItalic-b13731ef4e2bfc3d8d859271e39550fc.woff new file mode 100644 index 0000000..87d4f22 Binary files /dev/null and b/static/KaTeX_Math-BoldItalic-b13731ef4e2bfc3d8d859271e39550fc.woff differ diff --git a/static/KaTeX_Math-BoldItalic-d747bd1e7a6a43864285edd73dcde253.woff2 b/static/KaTeX_Math-BoldItalic-d747bd1e7a6a43864285edd73dcde253.woff2 new file mode 100644 index 0000000..83b4996 Binary files /dev/null and b/static/KaTeX_Math-BoldItalic-d747bd1e7a6a43864285edd73dcde253.woff2 differ diff --git a/static/KaTeX_Math-Italic-291e76b8871b84560701bd29f9d1dcc7.ttf b/static/KaTeX_Math-Italic-291e76b8871b84560701bd29f9d1dcc7.ttf new file mode 100644 index 0000000..9c38359 Binary files /dev/null and b/static/KaTeX_Math-Italic-291e76b8871b84560701bd29f9d1dcc7.ttf differ diff --git a/static/KaTeX_Math-Italic-4ad08b826b8065e1eab85324d726538c.woff2 b/static/KaTeX_Math-Italic-4ad08b826b8065e1eab85324d726538c.woff2 new file mode 100644 index 0000000..e3ea522 Binary files /dev/null and b/static/KaTeX_Math-Italic-4ad08b826b8065e1eab85324d726538c.woff2 differ diff --git a/static/KaTeX_Math-Italic-f0303906c2a67ac63bf1e8ccd638a89e.woff b/static/KaTeX_Math-Italic-f0303906c2a67ac63bf1e8ccd638a89e.woff new file mode 100644 index 0000000..959746e Binary files /dev/null and b/static/KaTeX_Math-Italic-f0303906c2a67ac63bf1e8ccd638a89e.woff differ diff --git a/static/KaTeX_SansSerif-Bold-3fb419559955e3ce75619f1a5e8c6c84.woff b/static/KaTeX_SansSerif-Bold-3fb419559955e3ce75619f1a5e8c6c84.woff new file mode 100644 index 0000000..f0d6ea7 Binary files /dev/null and b/static/KaTeX_SansSerif-Bold-3fb419559955e3ce75619f1a5e8c6c84.woff differ diff --git a/static/KaTeX_SansSerif-Bold-6e0830bee40435e72165345e0682fbfc.woff2 b/static/KaTeX_SansSerif-Bold-6e0830bee40435e72165345e0682fbfc.woff2 new file mode 100644 index 0000000..4cf8f14 Binary files /dev/null and b/static/KaTeX_SansSerif-Bold-6e0830bee40435e72165345e0682fbfc.woff2 differ diff --git a/static/KaTeX_SansSerif-Bold-7dc027cba9f7b11ec92af4a311372a85.ttf b/static/KaTeX_SansSerif-Bold-7dc027cba9f7b11ec92af4a311372a85.ttf new file mode 100644 index 0000000..ff10851 Binary files /dev/null and b/static/KaTeX_SansSerif-Bold-7dc027cba9f7b11ec92af4a311372a85.ttf differ diff --git a/static/KaTeX_SansSerif-Italic-4059868e460d2d2e6be18e180d20c43d.ttf b/static/KaTeX_SansSerif-Italic-4059868e460d2d2e6be18e180d20c43d.ttf new file mode 100644 index 0000000..3dd7671 Binary files /dev/null and b/static/KaTeX_SansSerif-Italic-4059868e460d2d2e6be18e180d20c43d.ttf differ diff --git a/static/KaTeX_SansSerif-Italic-727a9b0d97d72d2fc0228fe4e07fb4d8.woff b/static/KaTeX_SansSerif-Italic-727a9b0d97d72d2fc0228fe4e07fb4d8.woff new file mode 100644 index 0000000..9da0dfe Binary files /dev/null and b/static/KaTeX_SansSerif-Italic-727a9b0d97d72d2fc0228fe4e07fb4d8.woff differ diff --git a/static/KaTeX_SansSerif-Italic-fba01c9c6fb2866a0f95bcacb2c187a5.woff2 b/static/KaTeX_SansSerif-Italic-fba01c9c6fb2866a0f95bcacb2c187a5.woff2 new file mode 100644 index 0000000..ce19ae0 Binary files /dev/null and b/static/KaTeX_SansSerif-Italic-fba01c9c6fb2866a0f95bcacb2c187a5.woff2 differ diff --git a/static/KaTeX_SansSerif-Regular-2555754a67062cac3a0913b715ab982f.woff b/static/KaTeX_SansSerif-Regular-2555754a67062cac3a0913b715ab982f.woff new file mode 100644 index 0000000..6ed9878 Binary files /dev/null and b/static/KaTeX_SansSerif-Regular-2555754a67062cac3a0913b715ab982f.woff differ diff --git a/static/KaTeX_SansSerif-Regular-5c58d168c0b66d2c32234a6718e74dfb.ttf b/static/KaTeX_SansSerif-Regular-5c58d168c0b66d2c32234a6718e74dfb.ttf new file mode 100644 index 0000000..f117cd6 Binary files /dev/null and b/static/KaTeX_SansSerif-Regular-5c58d168c0b66d2c32234a6718e74dfb.ttf differ diff --git a/static/KaTeX_SansSerif-Regular-d929cd671b19f0cfea55b6200fb47461.woff2 b/static/KaTeX_SansSerif-Regular-d929cd671b19f0cfea55b6200fb47461.woff2 new file mode 100644 index 0000000..2761149 Binary files /dev/null and b/static/KaTeX_SansSerif-Regular-d929cd671b19f0cfea55b6200fb47461.woff2 differ diff --git a/static/KaTeX_Script-Regular-755e2491f13b5269f0afd5a56f7aa692.woff2 b/static/KaTeX_Script-Regular-755e2491f13b5269f0afd5a56f7aa692.woff2 new file mode 100644 index 0000000..b0aed19 Binary files /dev/null and b/static/KaTeX_Script-Regular-755e2491f13b5269f0afd5a56f7aa692.woff2 differ diff --git a/static/KaTeX_Script-Regular-d12ea9efb375f9dc331f562e69892638.ttf b/static/KaTeX_Script-Regular-d12ea9efb375f9dc331f562e69892638.ttf new file mode 100644 index 0000000..e6f3454 Binary files /dev/null and b/static/KaTeX_Script-Regular-d12ea9efb375f9dc331f562e69892638.ttf differ diff --git a/static/KaTeX_Script-Regular-d524c9a5b62a17f98f4a97af37fea735.woff b/static/KaTeX_Script-Regular-d524c9a5b62a17f98f4a97af37fea735.woff new file mode 100644 index 0000000..4a48e65 Binary files /dev/null and b/static/KaTeX_Script-Regular-d524c9a5b62a17f98f4a97af37fea735.woff differ diff --git a/static/KaTeX_Size1-Regular-7342d45b052c3a2abc21049959fbab7f.ttf b/static/KaTeX_Size1-Regular-7342d45b052c3a2abc21049959fbab7f.ttf new file mode 100644 index 0000000..37faa0f Binary files /dev/null and b/static/KaTeX_Size1-Regular-7342d45b052c3a2abc21049959fbab7f.ttf differ diff --git a/static/KaTeX_Size2-Regular-eb130dcc661de766c999c60ba1525a88.ttf b/static/KaTeX_Size2-Regular-eb130dcc661de766c999c60ba1525a88.ttf new file mode 100644 index 0000000..cf32623 Binary files /dev/null and b/static/KaTeX_Size2-Regular-eb130dcc661de766c999c60ba1525a88.ttf differ diff --git a/static/KaTeX_Size4-Regular-ad7672524b64b730dfd176140a8945cb.ttf b/static/KaTeX_Size4-Regular-ad7672524b64b730dfd176140a8945cb.ttf new file mode 100644 index 0000000..3034091 Binary files /dev/null and b/static/KaTeX_Size4-Regular-ad7672524b64b730dfd176140a8945cb.ttf differ diff --git a/static/KaTeX_Typewriter-Regular-257023560753aeb0b89b7e434d3da17f.ttf b/static/KaTeX_Typewriter-Regular-257023560753aeb0b89b7e434d3da17f.ttf new file mode 100644 index 0000000..2fd8529 Binary files /dev/null and b/static/KaTeX_Typewriter-Regular-257023560753aeb0b89b7e434d3da17f.ttf differ diff --git a/static/KaTeX_Typewriter-Regular-3fe216d2a5f736c560cde71984554b64.woff b/static/KaTeX_Typewriter-Regular-3fe216d2a5f736c560cde71984554b64.woff new file mode 100644 index 0000000..e90fa2b Binary files /dev/null and b/static/KaTeX_Typewriter-Regular-3fe216d2a5f736c560cde71984554b64.woff differ diff --git a/static/KaTeX_Typewriter-Regular-6cc31ea5c223c88705a13727a71417fa.woff2 b/static/KaTeX_Typewriter-Regular-6cc31ea5c223c88705a13727a71417fa.woff2 new file mode 100644 index 0000000..e40ab15 Binary files /dev/null and b/static/KaTeX_Typewriter-Regular-6cc31ea5c223c88705a13727a71417fa.woff2 differ diff --git a/static/a3d3e2bfc84b9abef613c50c5db061d2/6f3f2/charles-1.png b/static/a3d3e2bfc84b9abef613c50c5db061d2/6f3f2/charles-1.png new file mode 100644 index 0000000..df9b29d Binary files /dev/null and b/static/a3d3e2bfc84b9abef613c50c5db061d2/6f3f2/charles-1.png differ diff --git a/static/a51bc4e7c3864343bdada28464c50650/72227/arun-nallamayan-1207263-unsplash.jpg b/static/a51bc4e7c3864343bdada28464c50650/72227/arun-nallamayan-1207263-unsplash.jpg new file mode 100644 index 0000000..dda70dc Binary files /dev/null and b/static/a51bc4e7c3864343bdada28464c50650/72227/arun-nallamayan-1207263-unsplash.jpg differ diff --git a/static/a51bc4e7c3864343bdada28464c50650/7a34f/arun-nallamayan-1207263-unsplash.jpg b/static/a51bc4e7c3864343bdada28464c50650/7a34f/arun-nallamayan-1207263-unsplash.jpg new file mode 100644 index 0000000..c92223e Binary files /dev/null and b/static/a51bc4e7c3864343bdada28464c50650/7a34f/arun-nallamayan-1207263-unsplash.jpg differ diff --git a/static/a51bc4e7c3864343bdada28464c50650/9ad13/arun-nallamayan-1207263-unsplash.jpg b/static/a51bc4e7c3864343bdada28464c50650/9ad13/arun-nallamayan-1207263-unsplash.jpg new file mode 100644 index 0000000..8a894ea Binary files /dev/null and b/static/a51bc4e7c3864343bdada28464c50650/9ad13/arun-nallamayan-1207263-unsplash.jpg differ diff --git a/static/a51bc4e7c3864343bdada28464c50650/d41e0/arun-nallamayan-1207263-unsplash.jpg b/static/a51bc4e7c3864343bdada28464c50650/d41e0/arun-nallamayan-1207263-unsplash.jpg new file mode 100644 index 0000000..d48eb0a Binary files /dev/null and b/static/a51bc4e7c3864343bdada28464c50650/d41e0/arun-nallamayan-1207263-unsplash.jpg differ diff --git a/static/a51bc4e7c3864343bdada28464c50650/f9e02/arun-nallamayan-1207263-unsplash.jpg b/static/a51bc4e7c3864343bdada28464c50650/f9e02/arun-nallamayan-1207263-unsplash.jpg new file mode 100644 index 0000000..cc5d271 Binary files /dev/null and b/static/a51bc4e7c3864343bdada28464c50650/f9e02/arun-nallamayan-1207263-unsplash.jpg differ diff --git a/static/add23b523366e779086701afca3cadb8/29f4e/charles-9.png b/static/add23b523366e779086701afca3cadb8/29f4e/charles-9.png new file mode 100644 index 0000000..dcfbe91 Binary files /dev/null and b/static/add23b523366e779086701afca3cadb8/29f4e/charles-9.png differ diff --git a/static/add23b523366e779086701afca3cadb8/5a46d/charles-9.png b/static/add23b523366e779086701afca3cadb8/5a46d/charles-9.png new file mode 100644 index 0000000..d61c6e2 Binary files /dev/null and b/static/add23b523366e779086701afca3cadb8/5a46d/charles-9.png differ diff --git a/static/afa8b410c6f865195f3cfdc46de69f54/b4294/performance-panel.jpg b/static/afa8b410c6f865195f3cfdc46de69f54/b4294/performance-panel.jpg new file mode 100644 index 0000000..f81341a Binary files /dev/null and b/static/afa8b410c6f865195f3cfdc46de69f54/b4294/performance-panel.jpg differ diff --git a/static/afa8b410c6f865195f3cfdc46de69f54/ba579/performance-panel.jpg b/static/afa8b410c6f865195f3cfdc46de69f54/ba579/performance-panel.jpg new file mode 100644 index 0000000..b37ec81 Binary files /dev/null and b/static/afa8b410c6f865195f3cfdc46de69f54/ba579/performance-panel.jpg differ diff --git a/static/afa8b410c6f865195f3cfdc46de69f54/e5166/performance-panel.jpg b/static/afa8b410c6f865195f3cfdc46de69f54/e5166/performance-panel.jpg new file mode 100644 index 0000000..2f14558 Binary files /dev/null and b/static/afa8b410c6f865195f3cfdc46de69f54/e5166/performance-panel.jpg differ diff --git a/static/afa8b410c6f865195f3cfdc46de69f54/f93b5/performance-panel.jpg b/static/afa8b410c6f865195f3cfdc46de69f54/f93b5/performance-panel.jpg new file mode 100644 index 0000000..b14fad8 Binary files /dev/null and b/static/afa8b410c6f865195f3cfdc46de69f54/f93b5/performance-panel.jpg differ diff --git a/static/b9451241131da82c37d7b6c6bb862afe/a430b/charles-4.jpg b/static/b9451241131da82c37d7b6c6bb862afe/a430b/charles-4.jpg new file mode 100644 index 0000000..7af02b3 Binary files /dev/null and b/static/b9451241131da82c37d7b6c6bb862afe/a430b/charles-4.jpg differ diff --git a/static/b9451241131da82c37d7b6c6bb862afe/b4294/charles-4.jpg b/static/b9451241131da82c37d7b6c6bb862afe/b4294/charles-4.jpg new file mode 100644 index 0000000..632944c Binary files /dev/null and b/static/b9451241131da82c37d7b6c6bb862afe/b4294/charles-4.jpg differ diff --git a/static/b9451241131da82c37d7b6c6bb862afe/f93b5/charles-4.jpg b/static/b9451241131da82c37d7b6c6bb862afe/f93b5/charles-4.jpg new file mode 100644 index 0000000..8101f84 Binary files /dev/null and b/static/b9451241131da82c37d7b6c6bb862afe/f93b5/charles-4.jpg differ diff --git a/static/d/1025518380.json b/static/d/1025518380.json new file mode 100644 index 0000000..0839d02 --- /dev/null +++ b/static/d/1025518380.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"title":"Welcome to Alex's Midway","description":"a simple personal blog","author":"Alex Wang"}}}} \ No newline at end of file diff --git a/static/d/2011440971.json b/static/d/2011440971.json new file mode 100644 index 0000000..0dad385 --- /dev/null +++ b/static/d/2011440971.json @@ -0,0 +1 @@ +{"data":{"placeholderImage":null}} \ No newline at end of file diff --git a/static/d/755544856.json b/static/d/755544856.json new file mode 100644 index 0000000..280afb6 --- /dev/null +++ b/static/d/755544856.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"title":"Welcome to Alex's Midway"}}}} \ No newline at end of file diff --git a/static/d20cc183d4dfced125d20e4b116aa90f/a430b/charles-3.jpg b/static/d20cc183d4dfced125d20e4b116aa90f/a430b/charles-3.jpg new file mode 100644 index 0000000..1ed3fdb Binary files /dev/null and b/static/d20cc183d4dfced125d20e4b116aa90f/a430b/charles-3.jpg differ diff --git a/static/d20cc183d4dfced125d20e4b116aa90f/b4294/charles-3.jpg b/static/d20cc183d4dfced125d20e4b116aa90f/b4294/charles-3.jpg new file mode 100644 index 0000000..f9e6f60 Binary files /dev/null and b/static/d20cc183d4dfced125d20e4b116aa90f/b4294/charles-3.jpg differ diff --git a/static/d20cc183d4dfced125d20e4b116aa90f/f93b5/charles-3.jpg b/static/d20cc183d4dfced125d20e4b116aa90f/f93b5/charles-3.jpg new file mode 100644 index 0000000..f408fd9 Binary files /dev/null and b/static/d20cc183d4dfced125d20e4b116aa90f/f93b5/charles-3.jpg differ diff --git a/static/d7424b6757a6f61468d19f193d05106b/0a47e/charles-2.png b/static/d7424b6757a6f61468d19f193d05106b/0a47e/charles-2.png new file mode 100644 index 0000000..c8ace0d Binary files /dev/null and b/static/d7424b6757a6f61468d19f193d05106b/0a47e/charles-2.png differ diff --git a/static/d7424b6757a6f61468d19f193d05106b/5a46d/charles-2.png b/static/d7424b6757a6f61468d19f193d05106b/5a46d/charles-2.png new file mode 100644 index 0000000..78f79e5 Binary files /dev/null and b/static/d7424b6757a6f61468d19f193d05106b/5a46d/charles-2.png differ diff --git a/static/d7424b6757a6f61468d19f193d05106b/6a6e9/charles-2.png b/static/d7424b6757a6f61468d19f193d05106b/6a6e9/charles-2.png new file mode 100644 index 0000000..592aef5 Binary files /dev/null and b/static/d7424b6757a6f61468d19f193d05106b/6a6e9/charles-2.png differ diff --git a/static/d80771559e71871fa28c88608a9a81a2/0a47e/charles-6.png b/static/d80771559e71871fa28c88608a9a81a2/0a47e/charles-6.png new file mode 100644 index 0000000..b0927dc Binary files /dev/null and b/static/d80771559e71871fa28c88608a9a81a2/0a47e/charles-6.png differ diff --git a/static/d80771559e71871fa28c88608a9a81a2/5a46d/charles-6.png b/static/d80771559e71871fa28c88608a9a81a2/5a46d/charles-6.png new file mode 100644 index 0000000..fed58a5 Binary files /dev/null and b/static/d80771559e71871fa28c88608a9a81a2/5a46d/charles-6.png differ diff --git a/static/d80771559e71871fa28c88608a9a81a2/c1b63/charles-6.png b/static/d80771559e71871fa28c88608a9a81a2/c1b63/charles-6.png new file mode 100644 index 0000000..a1febd8 Binary files /dev/null and b/static/d80771559e71871fa28c88608a9a81a2/c1b63/charles-6.png differ diff --git a/static/d80771559e71871fa28c88608a9a81a2/d1882/charles-6.png b/static/d80771559e71871fa28c88608a9a81a2/d1882/charles-6.png new file mode 100644 index 0000000..31f00f3 Binary files /dev/null and b/static/d80771559e71871fa28c88608a9a81a2/d1882/charles-6.png differ diff --git a/static/eb67e3f208d38d097ab5d170245ece93/01fdc/osman-rana-263708-unsplash.jpg b/static/eb67e3f208d38d097ab5d170245ece93/01fdc/osman-rana-263708-unsplash.jpg new file mode 100644 index 0000000..a2f05b9 Binary files /dev/null and b/static/eb67e3f208d38d097ab5d170245ece93/01fdc/osman-rana-263708-unsplash.jpg differ diff --git a/static/eb67e3f208d38d097ab5d170245ece93/03fe8/osman-rana-263708-unsplash.jpg b/static/eb67e3f208d38d097ab5d170245ece93/03fe8/osman-rana-263708-unsplash.jpg new file mode 100644 index 0000000..7eb98c7 Binary files /dev/null and b/static/eb67e3f208d38d097ab5d170245ece93/03fe8/osman-rana-263708-unsplash.jpg differ diff --git a/static/eb67e3f208d38d097ab5d170245ece93/582c1/osman-rana-263708-unsplash.jpg b/static/eb67e3f208d38d097ab5d170245ece93/582c1/osman-rana-263708-unsplash.jpg new file mode 100644 index 0000000..e33957e Binary files /dev/null and b/static/eb67e3f208d38d097ab5d170245ece93/582c1/osman-rana-263708-unsplash.jpg differ diff --git a/static/eb67e3f208d38d097ab5d170245ece93/71d73/osman-rana-263708-unsplash.jpg b/static/eb67e3f208d38d097ab5d170245ece93/71d73/osman-rana-263708-unsplash.jpg new file mode 100644 index 0000000..91edb24 Binary files /dev/null and b/static/eb67e3f208d38d097ab5d170245ece93/71d73/osman-rana-263708-unsplash.jpg differ diff --git a/static/eb67e3f208d38d097ab5d170245ece93/7ebb6/osman-rana-263708-unsplash.jpg b/static/eb67e3f208d38d097ab5d170245ece93/7ebb6/osman-rana-263708-unsplash.jpg new file mode 100644 index 0000000..4c67a6f Binary files /dev/null and b/static/eb67e3f208d38d097ab5d170245ece93/7ebb6/osman-rana-263708-unsplash.jpg differ diff --git a/static/ed8feeba14e28ef07d6f299fd108ecf3/a430b/charles-5.jpg b/static/ed8feeba14e28ef07d6f299fd108ecf3/a430b/charles-5.jpg new file mode 100644 index 0000000..0b49492 Binary files /dev/null and b/static/ed8feeba14e28ef07d6f299fd108ecf3/a430b/charles-5.jpg differ diff --git a/static/ed8feeba14e28ef07d6f299fd108ecf3/b4294/charles-5.jpg b/static/ed8feeba14e28ef07d6f299fd108ecf3/b4294/charles-5.jpg new file mode 100644 index 0000000..52dbf34 Binary files /dev/null and b/static/ed8feeba14e28ef07d6f299fd108ecf3/b4294/charles-5.jpg differ diff --git a/static/ed8feeba14e28ef07d6f299fd108ecf3/f93b5/charles-5.jpg b/static/ed8feeba14e28ef07d6f299fd108ecf3/f93b5/charles-5.jpg new file mode 100644 index 0000000..25f27dd Binary files /dev/null and b/static/ed8feeba14e28ef07d6f299fd108ecf3/f93b5/charles-5.jpg differ diff --git a/static/eee581256a36266525b05b4e3e7f9f1c/1edee/stefan-odobasu-1209110-unsplash.jpg b/static/eee581256a36266525b05b4e3e7f9f1c/1edee/stefan-odobasu-1209110-unsplash.jpg new file mode 100644 index 0000000..f3c25e9 Binary files /dev/null and b/static/eee581256a36266525b05b4e3e7f9f1c/1edee/stefan-odobasu-1209110-unsplash.jpg differ diff --git a/static/eee581256a36266525b05b4e3e7f9f1c/72227/stefan-odobasu-1209110-unsplash.jpg b/static/eee581256a36266525b05b4e3e7f9f1c/72227/stefan-odobasu-1209110-unsplash.jpg new file mode 100644 index 0000000..ea52c6f Binary files /dev/null and b/static/eee581256a36266525b05b4e3e7f9f1c/72227/stefan-odobasu-1209110-unsplash.jpg differ diff --git a/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg b/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg new file mode 100644 index 0000000..d8be3fd Binary files /dev/null and b/static/eee581256a36266525b05b4e3e7f9f1c/7a34f/stefan-odobasu-1209110-unsplash.jpg differ diff --git a/static/eee581256a36266525b05b4e3e7f9f1c/d41e0/stefan-odobasu-1209110-unsplash.jpg b/static/eee581256a36266525b05b4e3e7f9f1c/d41e0/stefan-odobasu-1209110-unsplash.jpg new file mode 100644 index 0000000..332bbef Binary files /dev/null and b/static/eee581256a36266525b05b4e3e7f9f1c/d41e0/stefan-odobasu-1209110-unsplash.jpg differ diff --git a/static/fbcbe4a352f936d311ac9294905439c1/a430b/charles-14-ios-2.jpg b/static/fbcbe4a352f936d311ac9294905439c1/a430b/charles-14-ios-2.jpg new file mode 100644 index 0000000..8c5051f Binary files /dev/null and b/static/fbcbe4a352f936d311ac9294905439c1/a430b/charles-14-ios-2.jpg differ diff --git a/static/fbcbe4a352f936d311ac9294905439c1/b4294/charles-14-ios-2.jpg b/static/fbcbe4a352f936d311ac9294905439c1/b4294/charles-14-ios-2.jpg new file mode 100644 index 0000000..e72adfa Binary files /dev/null and b/static/fbcbe4a352f936d311ac9294905439c1/b4294/charles-14-ios-2.jpg differ diff --git a/static/fbcbe4a352f936d311ac9294905439c1/f93b5/charles-14-ios-2.jpg b/static/fbcbe4a352f936d311ac9294905439c1/f93b5/charles-14-ios-2.jpg new file mode 100644 index 0000000..14bbb6b Binary files /dev/null and b/static/fbcbe4a352f936d311ac9294905439c1/f93b5/charles-14-ios-2.jpg differ diff --git a/static/fc81093e1c76bc8460b452c5e17afad4/0a47e/charles-8.png b/static/fc81093e1c76bc8460b452c5e17afad4/0a47e/charles-8.png new file mode 100644 index 0000000..cbef185 Binary files /dev/null and b/static/fc81093e1c76bc8460b452c5e17afad4/0a47e/charles-8.png differ diff --git a/static/fc81093e1c76bc8460b452c5e17afad4/302a4/charles-8.png b/static/fc81093e1c76bc8460b452c5e17afad4/302a4/charles-8.png new file mode 100644 index 0000000..8cf194b Binary files /dev/null and b/static/fc81093e1c76bc8460b452c5e17afad4/302a4/charles-8.png differ diff --git a/static/fc81093e1c76bc8460b452c5e17afad4/5a46d/charles-8.png b/static/fc81093e1c76bc8460b452c5e17afad4/5a46d/charles-8.png new file mode 100644 index 0000000..c0d71ce Binary files /dev/null and b/static/fc81093e1c76bc8460b452c5e17afad4/5a46d/charles-8.png differ diff --git a/static/ffb42536d1cd7d3dfc9701fb77530011/a430b/charles-15-ios-3.jpg b/static/ffb42536d1cd7d3dfc9701fb77530011/a430b/charles-15-ios-3.jpg new file mode 100644 index 0000000..f792fa4 Binary files /dev/null and b/static/ffb42536d1cd7d3dfc9701fb77530011/a430b/charles-15-ios-3.jpg differ diff --git a/static/ffb42536d1cd7d3dfc9701fb77530011/b4294/charles-15-ios-3.jpg b/static/ffb42536d1cd7d3dfc9701fb77530011/b4294/charles-15-ios-3.jpg new file mode 100644 index 0000000..be225ea Binary files /dev/null and b/static/ffb42536d1cd7d3dfc9701fb77530011/b4294/charles-15-ios-3.jpg differ diff --git a/static/ffb42536d1cd7d3dfc9701fb77530011/f93b5/charles-15-ios-3.jpg b/static/ffb42536d1cd7d3dfc9701fb77530011/f93b5/charles-15-ios-3.jpg new file mode 100644 index 0000000..a0c036d Binary files /dev/null and b/static/ffb42536d1cd7d3dfc9701fb77530011/f93b5/charles-15-ios-3.jpg differ diff --git a/styles-2784bacaa009e3e009ba.js b/styles-2784bacaa009e3e009ba.js new file mode 100644 index 0000000..4f08299 --- /dev/null +++ b/styles-2784bacaa009e3e009ba.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[]]); +//# sourceMappingURL=styles-2784bacaa009e3e009ba.js.map \ No newline at end of file diff --git a/styles-2784bacaa009e3e009ba.js.map b/styles-2784bacaa009e3e009ba.js.map new file mode 100644 index 0000000..f38571d --- /dev/null +++ b/styles-2784bacaa009e3e009ba.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"styles-2784bacaa009e3e009ba.js","sourceRoot":""} \ No newline at end of file diff --git a/styles.7d30df8a6f6a499a7ae6.css b/styles.7d30df8a6f6a499a7ae6.css new file mode 100644 index 0000000..f616a08 --- /dev/null +++ b/styles.7d30df8a6f6a499a7ae6.css @@ -0,0 +1 @@ +.Header-module--header--1Op28{background-color:#242121;color:#fff;width:100%;position:fixed;z-index:99;display:flex;flex-flow:row wrap;align-items:center;font-size:.8rem}.Header-module--logo__link--1Pt5A{text-decoration:none;color:#fff;font-size:1rem}.Header-module--logo__link--1Pt5A,.Header-module--toggle--3ZlCy{padding:.8rem 1rem;cursor:pointer;-webkit-user-select:none;-ms-user-select:none;user-select:none}.Header-module--toggle--3ZlCy{font-size:1.5rem;margin-left:auto}.Header-module--nav--10wjH{display:block;background:#fff;width:100%}.Header-module--nav--10wjH>ul{list-style-type:none;padding:1rem 0;margin:0}.Header-module--nav__mobile--3IJWS{display:flex;flex-direction:column;align-items:center}.Header-module--nav__desktop--GITIO{display:none}.Header-module--nav__item--2VcX9{width:100%;margin:0;padding:0}.Header-module--nav__link--3n2Pi{display:block;width:100%;height:100%;padding:.8rem 1rem;text-align:center;text-decoration:none;color:#242121;font-size:1rem;font-family:sans-serif;font-weight:400;transition:all .3s ease-in-out .1s;text-transform:capitalize}.Header-module--nav__link--3n2Pi:hover{background:#d45c54;color:#fff}@media only screen and (max-width:280px){.Header-module--logo__link--1Pt5A{display:none}}@media only screen and (min-width:1024px){.Header-module--toggle--3ZlCy{display:none}.Header-module--nav--10wjH{display:block;width:auto;margin-left:auto;margin-right:2rem;background:transparent}.Header-module--nav--10wjH>ul{padding:0}.Header-module--nav__mobile--3IJWS{display:none}.Header-module--nav__desktop--GITIO{display:flex;justify-content:space-around;align-items:center}.Header-module--nav__link--3n2Pi{color:#fff;font-size:.8rem}}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}*,:after,:before{box-sizing:inherit}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}html{font:112.5%/1.45em georgia,serif;box-sizing:border-box;overflow-y:scroll}*,:after,:before{box-sizing:inherit}body{color:rgba(0,0,0,.8);font-family:Impact,Arial Narrow Bold,georgia,serif;font-weight:400;word-wrap:break-word;-webkit-font-kerning:normal;font-kerning:normal;-ms-font-feature-settings:"kern","liga","clig","calt";font-feature-settings:"kern","liga","clig","calt"}img{max-width:100%;padding:0;margin:0 0 1.45rem}h1{font-size:2.25rem}h1,h2{padding:0;margin:0 0 1.45rem;color:inherit;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-weight:700;text-rendering:optimizeLegibility;line-height:1.1}h2{font-size:1.62671rem}h3{font-size:1.38316rem}h3,h4{padding:0;margin:0 0 1.45rem;color:inherit;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-weight:700;text-rendering:optimizeLegibility;line-height:1.1}h4{font-size:1rem}h5{font-size:.85028rem}h5,h6{padding:0;margin:0 0 1.45rem;color:inherit;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-weight:700;text-rendering:optimizeLegibility;line-height:1.1}h6{font-size:.78405rem}hgroup{padding:0;margin:0 0 1.45rem}ol,ul{padding:0;margin:0 0 1.45rem 1.45rem;list-style-position:outside;list-style-image:none}dd,dl,figure,p{padding:0;margin:0 0 1.45rem}pre{margin:0;font-size:.85rem;line-height:1.42;background:rgba(0,0,0,.04);border-radius:3px;overflow:auto;word-wrap:normal;padding:1.45rem}table{font-size:.8rem;line-height:1.45rem;border-collapse:collapse;width:100%}fieldset,table{padding:0;margin:0 0 1.45rem}blockquote{margin:0 -1rem 1.45rem;padding:1rem;border-left:5px solid #cecece;background:rgba(0,0,0,.04);font-style:italic}form,iframe,noscript{padding:0;margin:0 0 1.45rem}hr{padding:0;margin:0 0 calc(1.45rem - 1px);background:rgba(0,0,0,.2);border:none;height:1px}address{padding:0;margin:0 0 1.45rem}b,dt,strong,th{font-weight:700}li{margin-bottom:.725rem}ol li,ul li{padding-left:0}li>ol,li>ul{margin-left:1.45rem;margin-bottom:.725rem;margin-top:.725rem}blockquote :last-child,li :last-child,p :last-child{margin-bottom:0}li>p{margin-bottom:.725rem}code,kbd,samp{font-size:.85rem;line-height:1.45rem}abbr,abbr[title],acronym{border-bottom:1px dotted rgba(0,0,0,.5);cursor:help}abbr[title]{text-decoration:none}td,th,thead{text-align:left}td,th{border-bottom:1px solid rgba(0,0,0,.12);font-feature-settings:"tnum";-moz-font-feature-settings:"tnum";-ms-font-feature-settings:"tnum";-webkit-font-feature-settings:"tnum";padding:.725rem .96667rem calc(.725rem - 1px)}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}code,tt{background-color:rgba(0,0,0,.04);border-radius:3px;font-family:SFMono-Regular,Consolas,Roboto Mono,Droid Sans Mono,Liberation Mono,Menlo,Courier,monospace;padding:.2em 0}pre code{background:none;line-height:1.42}code:after,code:before,tt:after,tt:before{letter-spacing:-.2em;content:" "}pre code:after,pre code:before,pre tt:after,pre tt:before{content:""}@media only screen and (max-width:480px){html{font-size:100%}}.gatsby-highlight{background:#242121;color:#fff;border-radius:10px;overflow:auto;-moz-tab-size:1.5em;-o-tab-size:1.5em;tab-size:1.5em;-webkit-overflow-scrolling:touch;margin-bottom:1rem}.gatsby-highlight>code[class*=gatsby-code-],.gatsby-highlight>pre.prism-code,.gatsby-highlight>pre[class*=gatsby-code-]{height:auto!important;margin:1rem;font-size:14;line-height:20px;white-space:pre-wrap;word-break:break-word}.gatsby-highlight+.gatsby-highlight{margin-top:20px}.gatsby-highlight-code-line{background-color:#353b45;display:block;margin-right:-1em;margin-left:-1em;padding-right:1em;padding-left:.75em}.token.attr-name{color:#c5a5c5}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#b2b2b2}.token.constant,.token.deleted,.token.function-name,.token.number,.token.property,.token.symbol{color:#5a9bcf}.token.boolean{color:#ff8b50}.token.tag{color:#fc929e}.token.string{color:#8dc891}.token.punctuation{color:#88c6be}.token.builtin,.token.char,.token.inserted,.token.selector{color:#d8dee9}.token.function{color:#79b6f2}.token.entity,.token.operator,.token.url,.token.variable{color:#d7deea}.token.attr-value{color:#8dc891}.token.keyword{color:#c5a5c5}.token.atrule,.token.class-name{color:p#FAC863}.token.important{font-weight:400}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.namespace{opacity:.7}.PostPreview-module--container--JGFew{display:flex;position:relative;flex-direction:column;justify-content:flex-start;align-items:flex-start;flex:1 0 80%;padding:5%;border-bottom:1px solid rgba(36,33,33,.1)}.PostPreview-module--entry--B3Rmo{min-height:6rem;text-decoration:none;position:relative;color:#242121;font-family:Arial,Helvetica,sans-serif;font-size:1rem;width:100%}.PostPreview-module--entry--B3Rmo:focus,.PostPreview-module--entry--B3Rmo:hover{cursor:pointer}.PostPreview-module--date--1f3sI{text-transform:uppercase;font-size:.7rem}.PostPreview-module--title--2aI37{text-transform:uppercase}.PostPreview-module--entry--B3Rmo:focus .PostPreview-module--title--2aI37,.PostPreview-module--entry--B3Rmo:hover .PostPreview-module--title--2aI37{color:#d45c54}.PostPreview-module--excerpt--3FBNg{color:rgba(36,33,33,.6)}.PostPreview-module--button--HnC_e{background:#242121;position:relative;display:inline-block;color:#fff;text-decoration:none;font-size:.7rem;text-align:center;line-height:2;font-family:Arial,Helvetica,sans-serif;text-transform:uppercase;padding:.4rem 2rem;overflow:hidden;letter-spacing:.1rem;max-width:8rem;border-width:0;outline:0}.PostPreview-module--arrow--1djkn:after{position:relative;display:inline-block;content:"\279E";transform:translateX(50%);transition:transform .3s ease-in-out}.PostPreview-module--button--HnC_e:focus .PostPreview-module--arrow--1djkn:after,.PostPreview-module--button--HnC_e:hover .PostPreview-module--arrow--1djkn:after{transform:translateX(100%)}.PostPreview-module--yearPostsContainer--1PDOV{display:block;width:100%;padding:5% 5% 0;margin:auto}.PostPreview-module--year--1-wrE{margin:auto;padding:0 5%}.PostPreview-module--postPreviewWrapper--1ItuR{padding:0 5%}@media only screen and (min-width:1024px){.PostPreview-module--container--JGFew{display:flex;flex:0 0 50%}.PostPreview-module--yearPostsContainer--1PDOV{width:60%}}.Post-module--article--1OWF8{background:#fff;font-family:Arial,Helvetica,sans-serif;font-size:.8rem;padding-top:2rem}.Post-module--grid--239xQ{display:block;width:90%;margin:5% auto;padding:0 2%}.Post-module--header--3bBWj{position:relative;display:block;margin:0 auto;max-width:90%;display:flex;flex-direction:column;justify-content:center}.Post-module--img--h5W4i{width:100%;height:50vh}.Post-module--title--7tlEK{width:100%;font-size:1.9rem;text-transform:capitalize}.Post-module--date--1uCBT{width:100%;font-size:.8rem;font-weight:700}.Post-module--passage--1gLP0{max-width:90%;margin:0 auto 1rem;border-bottom:1px solid rgba(0,0,0,.2)}.Post-module--nav--3gwJ9{display:flex;justify-content:space-between;align-items:center;flex-basis:90%;max-width:90%;margin:0 auto}.Post-module--left--3WkxX{display:flex;align-self:flex-start}.Post-module--right--1ERWj{display:flex;align-self:flex-end}.Post-module--button--39RuZ{background:#fff;position:relative;display:inline-block;color:#242121;text-decoration:none;font-size:.7rem;text-align:center;line-height:2;font-family:Arial,Helvetica,sans-serif;text-transform:uppercase;padding:.4rem 2rem;overflow:hidden;letter-spacing:.1rem;min-width:8rem;border:1px solid #242121;outline:0;transition:transform .3s ease-in-out}.Post-module--button--39RuZ:hover{background-color:#242121;color:#fff}.Post-module--arrow--3aR1_{font-weight:lighter}.Post-module--prev--BHr9s:before{position:relative;display:block;content:"PREVIOUS";font-weight:bolder}.Post-module--next--BnvP9:before{position:relative;display:block;content:"NEXT";font-weight:bolder}@media only screen and (min-width:1024px){.Post-module--header--3bBWj,.Post-module--passage--1gLP0{max-width:60%}.Post-module--title--7tlEK{font-size:2.9rem}.Post-module--nav--3gwJ9{flex-basis:60%;max-width:60%}}@media only screen and (min-width:1920px){.Post-module--article--1OWF8{font-size:1.2rem}}@font-face{font-family:KaTeX_AMS;src:url(/static/KaTeX_AMS-Regular-e78e28b4834954df047e4925e9dbf354.woff2) format("woff2"),url(/static/KaTeX_AMS-Regular-7f06b4e30317f784d61d26686aed0ab2.woff) format("woff"),url(/static/KaTeX_AMS-Regular-aaf4eee9fba9907d61c3935e0b6a54ae.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(/static/KaTeX_Caligraphic-Bold-4ec58befa687e9752c3c91cd9bcf1bcb.woff2) format("woff2"),url(/static/KaTeX_Caligraphic-Bold-1e802ca9dedc4ed4e3c6f645e4316128.woff) format("woff"),url(/static/KaTeX_Caligraphic-Bold-021dd4dc61ee5f5cdf315f43b48c094b.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(/static/KaTeX_Caligraphic-Regular-7edb53b6693d75b8a2232481eea1a52c.woff2) format("woff2"),url(/static/KaTeX_Caligraphic-Regular-d3b46c3a530116933081d9d74e3e9fe8.woff) format("woff"),url(/static/KaTeX_Caligraphic-Regular-d49f2d55ce4f40f982d8ba63d746fbf9.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(/static/KaTeX_Fraktur-Bold-d5b59ec9764e10f4a82369ae29f3ac58.woff2) format("woff2"),url(/static/KaTeX_Fraktur-Bold-c4c8cab7d5be97b2bb283e531c077355.woff) format("woff"),url(/static/KaTeX_Fraktur-Bold-a31e7cba7b7221ebf1a2ae545fb306b2.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(/static/KaTeX_Fraktur-Regular-32a5339eb809f381a7357ba56f82aab3.woff2) format("woff2"),url(/static/KaTeX_Fraktur-Regular-b7d9c46bff5d51da6209e355cc4a235d.woff) format("woff"),url(/static/KaTeX_Fraktur-Regular-a48dad4f58c82e38a10da0ceebb86370.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-Bold-8e1e01c4b1207c0a383d9a2b4f86e637.woff2) format("woff2"),url(/static/KaTeX_Main-Bold-22086eb5d97009c3e99bcc1d16ce6865.woff) format("woff"),url(/static/KaTeX_Main-Bold-9ceff51b3cb7ce6eb4e8efa8163a1472.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-BoldItalic-284a17fe5baf72ff8217d4c7e70c0f82.woff2) format("woff2"),url(/static/KaTeX_Main-BoldItalic-4c57dbc44bfff1fdf08a59cf556fdab3.woff) format("woff"),url(/static/KaTeX_Main-BoldItalic-e8b44b990516dab7937bf240fde8b46a.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-Italic-e533d5a2506cf053cd671b335ec04dde.woff2) format("woff2"),url(/static/KaTeX_Main-Italic-99be0e10c38cd42466e6fe1665ef9536.woff) format("woff"),url(/static/KaTeX_Main-Italic-29c86397e75cdcb3135af8295f1c2e28.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-Regular-5c734d78610fa35282f3379f866707f2.woff2) format("woff2"),url(/static/KaTeX_Main-Regular-b741441f6d71014d0453ca3ebc884dd4.woff) format("woff"),url(/static/KaTeX_Main-Regular-5c94aef490324b0925dbe5f643e8fd04.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(/static/KaTeX_Math-BoldItalic-d747bd1e7a6a43864285edd73dcde253.woff2) format("woff2"),url(/static/KaTeX_Math-BoldItalic-b13731ef4e2bfc3d8d859271e39550fc.woff) format("woff"),url(/static/KaTeX_Math-BoldItalic-9a2834a9ff8ab411153571e0e55ac693.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(/static/KaTeX_Math-Italic-4ad08b826b8065e1eab85324d726538c.woff2) format("woff2"),url(/static/KaTeX_Math-Italic-f0303906c2a67ac63bf1e8ccd638a89e.woff) format("woff"),url(/static/KaTeX_Math-Italic-291e76b8871b84560701bd29f9d1dcc7.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(/static/KaTeX_SansSerif-Bold-6e0830bee40435e72165345e0682fbfc.woff2) format("woff2"),url(/static/KaTeX_SansSerif-Bold-3fb419559955e3ce75619f1a5e8c6c84.woff) format("woff"),url(/static/KaTeX_SansSerif-Bold-7dc027cba9f7b11ec92af4a311372a85.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(/static/KaTeX_SansSerif-Italic-fba01c9c6fb2866a0f95bcacb2c187a5.woff2) format("woff2"),url(/static/KaTeX_SansSerif-Italic-727a9b0d97d72d2fc0228fe4e07fb4d8.woff) format("woff"),url(/static/KaTeX_SansSerif-Italic-4059868e460d2d2e6be18e180d20c43d.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(/static/KaTeX_SansSerif-Regular-d929cd671b19f0cfea55b6200fb47461.woff2) format("woff2"),url(/static/KaTeX_SansSerif-Regular-2555754a67062cac3a0913b715ab982f.woff) format("woff"),url(/static/KaTeX_SansSerif-Regular-5c58d168c0b66d2c32234a6718e74dfb.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(/static/KaTeX_Script-Regular-755e2491f13b5269f0afd5a56f7aa692.woff2) format("woff2"),url(/static/KaTeX_Script-Regular-d524c9a5b62a17f98f4a97af37fea735.woff) format("woff"),url(/static/KaTeX_Script-Regular-d12ea9efb375f9dc331f562e69892638.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(data:font/woff2;base64,d09GMgABAAAAABXYAA4AAAAAMqAAABWBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAhBoIDAmXFxEICrFYphYBNgIkA4FMC2gABCAFjWcHgxwMfxuCKyMRtoO0khFRObkZ/OXxxnDkpMkqiTL8upa1/onYf8by+VAum62LIrOdDjx/hMY+yf2DtvXv7S4LS5SCUQsYWAiIik2bd/adcQFGYtVlehk/Wy86vzPn/ciQIBu2uf1eVLelurcNVyXCYEF4HM7hUMRjVPUIB/D/aOtnRQme5oYHvjOIfdGsoZKgmbWipqjTVSeD9z/AOOz8vy8clvtXyKvCe50hNZHrTEhSl9PMoX8nsiOEqkkSnkz0cK9YpVse88r05j5y21TsUFRUiWPTw//pLNs/I+vteoK+IOqgC/ZMdao0zXhkKRqNzQeynLydJZZ9pAOyA/aGiDv7CL0bxqJD6LhPUUNRprx3RZWiK9OUKYt8DKvf9jMJdbeI524kpefVtnCbIM1SSIF7/LoTfxZAxDLcCBxAPBMnAGDk96HxAwyJgOf+FwH8IIVvv4M3UHzvrAcL9neS1KRZdaYUZ7EAG2aRvFOzEAC5E8FgCLAr8PTXS/kTQBoWJRArWoKZ5prveeIS8YQkWaVqk2qL6q7qvlqmDlRr1BFqnfq8RqC5E/VVDBFDxdA/TE4KsLQS1Kg4IKFKdotVn9HwtvgyBuC/P7PcE4+9bYP1vP/l/Gf8T/TBP08XP1301P7U9pQ7MTnxxO8TP024J4KfVL5vfRT7KOZRtDQR0FsT5kFSEOOgCECV3IjKXVC0nuvOLTJsdwqfwE7z70OwjQIcR0InJ6rDp7SoIU5ARRwn6ek/EN8+hX58iph2aNO8UqmIENr95wUD77nNnPdAFWC3UQ+IOTQgYJtVAwEtxJlXUP5Tr3XIPp6P33yO3rwrlaL4VfRYkhNmoM+cJlXq5m6BdmSA1If1tl4Azni0UlnT9YDPs2KzLDYfwMmQnMwJSQfa4xigWUu+3AYSGgtKu4Xg8KSPlABdRui8T2DTQMG8eS0q5xXEELGC/TiAe2+GTLzuUIUMb3Tdqr7bC8q/jvmV696kaMmVtbyNm+28MxxYXAMHcHmjByJGQFvcKE0AdHUQr1Xl730mOEkDF7K2hoDzf1TwEgCuJSfaTB5tl8VDzx0Dx+G6jzowC2YhyleWRTN9SVCaNS6apxYJS0NQUgdhd1jSNAWkWjfSdV4EclKEL2MotQch8+xt6gUj0hm9M5+u+wYRKtFyUt+NGsQAGwkhn+zCnR4JCRGISpGImnslENLYLFf/qOBdNE/EzCpucWoEqybF03exUp9Ruji7+dd+WDKl7XV8+vaScn5XfMaWo4Lk+N6SsELwGZBYtRZAaKjCKxL5waUJUl/ZWRSTUKNcWSP92cTbvAlFHRsQYarfvQkhp4hiWC2SszOTyVVWgBM2Aglk9ejw9mH7YK0izu8iEgkaI5AAXwB3UAafv6WLdTBzC8Vd5b0B9N9wF1KDLyr43GhQcIygxAT4YRL8MQUBmAOBmIYgzIVgzIMQzHijoRYsqxIDPyUW/k/oUKxRM1dRGApFLNuCChOgxiRoMAXhmAMRmIZIzIUozAMtZqy4CHvQQHx+RtpoaH0xzAvlaeLa7kejA/FGfNKQAGmqgrRYt2Xj2ZlndJxPZ0Kfp0XjkoSkcpxiHG8lTxOGBJWmazVC993mif5LSXdtLmhWlCa3gPIXvP14Rge2VY2OXm8wQXuauu0AdvgBNSShPbPXkMxDOXWE5/wpqESwvKS2uYCmwbselzVTIz2d4syNj8OR0Cc7qDh5vcEMQAmlp05bHYY3lkUn0l4x2w6QOl6tqhYoCcyucA97v+V1/EmcN7s61uM326cwFfbyqKIRcmySYUj2KTtPR5FRvwbBvDBIdovDIdiBSzI/i4oOqzMJytuk23IGjxMI/erGLjVrb9uGm4NnLuFoR4srd6F8YEKtCWrWJ7v5TFrpgbQsKFUncHwqHNvbGivpe4EnQdKEaWVFszPIuidGYpcF5bHVnnkHgV5FcGKfolWseLwIRzJWspGNAtlSz7FMR+LMkZ3n6aK+mjntyYKpTZ4zeRMVb2qrzpEb44bsA70awiJUmvXerQPMJt1rG5BqhVVY1VxaMe/yoNiim0nYGw17oxalaU8Q25IrHYPKOy7oUJPrxbQJmR9smrnrnm05X/YJPrlqO6NipgG7Jng70NkivqOcqKKXpnsYjtYJvdGUHJLcrrxBBeymSCrN+QNSvlCwNFCOTa0mRfNMV7pwUJcpCnp5UwY9PoCjoakYoYggoGKMUBICcKJSjFBGEFA5RqgIAVjRNIwwnSCgSoxQFQKwo2qMUEMQ0AyMMDME4EKzMMJsgoDcGMETArChWoxQRxBQPcbOhrjRtHjbjX9To1mb0oSyoTkNyg2yQEsiXQhaA+nQFkgX3i17QntDBnQEMqAzkAFdgQzobsiEnkAm9AYyoS+QOU1/3H6GIlZRS7HFjvIaRsnw4qGlZVXxgPBfDQAAiT+ocTEOwH0AYJ7gbT9SgBdAGAIP8xOAKL4RxImT8eAxROLozOzHk6V8lVJe2rakyE9LRb9CERMTEWkOCUCKa29NMmlYZIKODptWzgYKWAGf4bJikVSsiw6mNiMTcATUPYlwCcWqEWMLJMmCleHvO4GK+gJZFUin0HFfaopSphzGee17hxMLzDNiWGq9nMZggFph8KkcOCx9gcPGuql9/j3iVgji1osI0qOLyWs6RwoWRcID7+9gtPqU467PwyEqvoRYQQXjtR2uxjsxTlyCMQWSHMvamviOrOt7ThCaT9rdzgJJV+ejLPieJzgZlU9a3SmUIKcWEHVB2qQREiRHrGs7X/uYTqHirs/dAXs7OKHG2gEXY86KyXva65IdiVLEUWpZof9ChPpxn51+Qmz/pm2NYek/czxO6PG3bo+ynM4vj1ogdxGSId17x/g7o6FZC8Ku67CXL5dzWCzPVZrjUixnBad5SAErIhagElCfH3K/oIQD7rMNYEbDoZkucFsLTveiID1DWqwAqMQORIbsm0hkpMwpyOyccKqT7g8dPziFlzAIuY/dWQ7ItrHeFEmfX/1MbwbtaZqH324OMShD7LvwluVgGrgotiFC8DWAjp1qS13+Kq5UrjY1qPx/J+e4SiVcfXg1Rb2PFG/fiXaUNbD/U0sWSpxw/46PXRe8Lus491eWJ3q+dbGKIqYWJHlOX3KHk3ZgaVbNiEEsKpDpeQr1j+e4hNpfdqkZVIhsUdZWOG+Q4hDFdebJbiB7GkOItNTihO/scjD2xOoAL2lnn8Th44+B3KX3QNXHOc4V24H00FWZiP8KumYDD725Denha6BSdqB/D+X2DVvq0nr5b5J7NsZdWNq6YZvTwcd/sXbW2+r8Vq7+Be8TQvbKw9VAts2EMdsIMdm6Teva6lvRHIU0MehYBmQ+DrojTxW9GTBzhatAwk/6UDHNtV7ytThpZ2thaMvCkW6fRvXpz8iqOWovOe9b3/B+o5c5L4nIqg42Ikq2ZnqBKE+HqwSdUhM3u7HDU6RMRuUhabHBSkLjVXXIio+LXPjmrUyQqXMGQhcNptE8Wtt7hfHTmKsGtIRxsph1HdOji4gw2VE3CutjrtVaooxgkEZwfLG+n51MTp06rQbsGlG9rhoN7r5fiy21tZqsVolxYooZM6bXV3jn9EMXkCLL8K5IR0XhhSr2/lMlNKdIj9SzRlI3c3AvY7yP185XFx+n80Ce0xek2WHSWRgzksqMFLGgwhw/qW9KZZqHj/NwCS8H3PudmGcPveiT9PFjLb2oIUasm+Vzps49mijy8c5Spu6F0SMhdGd70mdwQfL4umoAbgDJHd5eegDAdHtlvgKEgCRmF9J7WAoh0sydvzq8M1z8auD2lTxMZR8hIZf6ye9GFICALvBbr7G3XVFnMI4ZeTv+vjhH3+UOriCp3e/tvsH3Lu+myIpghap10Pq/Lw8ndLtFol6u7+53zg8NU7nbl9cj60xrCvVxzRUwN/hEYPkic40IGA59dcZ7Z7Q7Z+/U0oyTf4MR1Zhvh+DeirhtMhrrYrRnaD8d9JNpFSJxvic486MueN4/Clr2gKs7323ZnyQUmQ5s+e6ODiFNeV4c5Q8vzP/E3R6iQILQ04S4QizvPl4Q/9aU5/dwpn9fUeC//7PqsJDAAs6e56e8VRB/vFtO05+UWDgckR74UH3B/5aXcqJHJu85wctO3eXzXR9l+l9FWnCFWIQa5/2JxErO7j2cgsCQ6rDP9teEZmv4SBlmhuo9peiRSWjlXprux8ULCcTogNwoHJmiUmwvWzzDBDbd+eRnLcYskSWJfsNuYdJtiTtPvk2Qr1wdtxozZOUrut9ItPCJ132c9lV52P3ajdWx1ftofbycqbmtBf3LE6xx+z3hhXnX/4z98/pOe0+7P866JJZOmQ1fvGgu14dBz3MtTDYXvfhs9cqvL8Syi7Y6VRbTDjh4KHbb8Z/iLM6co63Ht8V6d9iSHOzWRWzsha9XtpvT8I2XbZ5DcHCHxeRUnS6h6EXlv52DtSXRBnbPvgJSrM3Sip3k31GeLWPwHtIcG/m3cwNrU/eqVqFKK5WSdTcYHdtSu/ufKZ3xjeqN17Xtu9v3Knz1Ve5pn9Q20Hclq1BtP4GVSW3v4sOJD1vIjzrDzFXPndF+bX5j/DV4XVXCJTV4eLzGW+PFo/8f+Z8vpek/seG7xu8g7EcV0CqUqmilK3Voj922Fhqbo95/vf/gPyEM7ipIozfVZbFT0Y06uUzHZ1SxdJo9y55Gx6qY+4QJZn9UMvl7yyvdFHPCN3Qu9GxU+IbhHz+fK/MPSsS3RCcliwOumfw35Og2PCQ+5Hz8RKc8LvDf21TP+UKgjEs8IaxnlouOS5b4vLVF6PLe5O4NzZ04EKSkVU8YCNoHJ4ZTJlDK32/cssfwH78NHs9etvl7Xc+Vn4Df+X/F57VW4wWwTZW5g2rVYEBpKWv9hNQzFJM/nzI3eSyzkdtANCs4gko9fQh/Wumpr7eY/xj+akJEYON4RqFJl2C30WQQZb8UGBvnmuylyUBOjmQknEP/PtOUx3f/6dMsowk/X3Kr/OUA5VmfF24UfV70WQAlG5Qrz8o1Dc0JIxtldZppZ+nk8/ImufKeRrYlMuOdVkPK89HD/8jPKuWDMipgkS7T/GnyuaMQv1afenzrW+HNpT9o+zCAXvP+D0FhI4oMC1ew5NA7C4QWBphqV/w1T4Azp6KSGeJaMhQjYaHvefGdtmBRyXB5+aD96drCer4lGGx55ye7pCFvhtvBOhBXLhyeKZT5DJaXD4tKg8Uyt4INLIdmhisq8/Nr/YbrW+r8OuEnOEzb8TNZ6x/a2ytnrJY/3tOuRCjLv62lPzWt1FqWS5urY6tpv7JSHxl3QejCMEJTNa5MJqpRLlYvCOFt9Pyayjaaum+R+Yzmk65SI5Jxvjl077VK9VRJV7yyz+f0elNLxFTBTH5Uvaoswr1pkztiutpdW67mcvOmCHeS9bWqikilP8QPvfn6o092yxbFKvtWKE9flG1kHIx0VVXtjOYRv9+iU471h7w56jt39jda9q3Q8Csa9RuON/jm6v7u0jEkpU1MlWWrV3GQ6vN27uNZ+vqoOO4Wb0mqcH9MVdFQbnX2hqJS5no7tT/BLVukV25JTKYdQr989dKp6eNLli7FsKRnvMr20fY/DPGNOCqFfYyD+dDk3fHrGlR/L3MssJeiXsEs0T2WkyPBY+8RGvSGD+1cieOSevjQX7wa+OFQalZea1+FfMnmvKzU4bK5Qf7V2ywpqWlEfK1UXBtPpKWmWLZV8/Qbx990bBqsVzyviN+2Sxr6juLIkRi8GMVImKpdcZeG+rdK3q6NhkWwGU7K30sEnyw9SFMIxCZ2v5TER5ERBgkC4ROERCVB0RIRMaRCFk04yIElAiRCVGQkGEkoJaReVDsKcwUXZHs2kIvp7FBhcnk9B8I9fP3NGJGFS+f1Nrv1JFYMJIAgYixXoz93UqTPNtH5DtsyjOE+SApVLEJrdnJSgi5a1cec0WWF9kxj78GCFDVuLEFs0+yb8JQS8LyKProezpZk/MYTkF8CALy/bxfjrfa/G/+/yPEnSwGAhwAzqUxVCdXZ9a7GyYHinILdE/0NuyBewt/N+A476ZyasEFKegGu9XuUkQMtLhsricXkn3EcQPDfjX0+JPmIxB7o2iHDh9RRo5BSM8uCOfMldKYpsGk1uwnf11GitT7pokqry1T8Wowr+9vFHjRzTxw9JTsdzKfNc+MA3CDUC9zYqHvACQKxGKlBAGxlB1RNyiSmAkoMkYYESjQC1wyNpFGnUXys0DhEdpXTak2UEuFVTSwwjZdLzSgyi4RgljnjRfzF15AytmkEcbylkVxxVKNExqTGEZiJKKd9TRSNZLYmZsq9Ui71sWy+f/OQrou+tt2Ot2+N8KMNO6XIN1gVnUQMpqnMbEGzp+NOtwUFnvKGytn3C4oZnk3G7opE6dfsaWpgjTo9m8aOjMWHpWSG7fJ90ev0OhPac48LXVabwe9ibDK31TPElrv8WdFrMBbgbaOoJ4gsko7j8yDNm5nYypjd+Pz4czo+nzWma5lfY2jyXudjhLlleYXPRtAnGe9FZq49adARfVETIsG+Q7Hl2aa2lrCevjS+favxwx/0FV5LtetY5Coc8Q6BXacuw3q0aNKsD0urTjSWkZ5eqngBN8DkLIcGvXN4h5gtU5dQA69jvXFYee710+Eb2MbAhMy8wCs84Mia9aiH7nbDCiRUvvdKs5VpMafboFRDWlU/L48eLp069PV5jy4aTAkd8uuShoUaIj4+O0bzaaLooULpzOnp2hekidILKi5mcLkMg61unXaelG3WyvmQHNn6PyRLNPnFDMfaRld4ogUR8DjIDWrBJ1jiRC9dfIA11WMPalzWVB7tZ+pw2CXE+TpvVip7AXiZgBr54IV6YuxI7uWijj7UC/VB/aIeh2CRiQaQbJ7C5BbpmrOggcpCIIgrfthgYG0DYUnz3SyPgShaLpdQLW85S43wGM5ZlYh6+6ThHxPNvCvxBJLrVXd8VOZ9WehQJLxkP/ETFHEpnJshNE51simjeCIj+zNCQEguSzaLWdyJgPdhHEmkkIM0cpGHDOxGPuyCV1CAQtiLIhSjBKUoQzn6oC8qUIl+6I8BGIhBGIwhGIphyKIK1dz+jha93qrvP32i3sj0tXjrG94flSkYZ3pWrqenp3Owv4tx2YciROJkrXcYF+ZMrc883WjQ9zcxJqpJql11BJyb2PWqQTUqiVsl6s1qqmoN2DZy6LdKcZqV1K2ser1qUI2qCSfv5HS5HKpzdS4oeIUrpZVjiOurRpHvMPvjGNCHMYAY98C8ux0FACauToLjJRxXlVSOWlZVilCPIz3HeIsAsyO3rrxSl9+h2mMgnB3ByUatGyOWXU69AwAA) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAABooAA4AAAAAMnQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAPSAAAAE4AAABgQ2JZAWNtYXAAAA+YAAAA7QAAAhobTaO1Y3Z0IAAAFnwAAAAKAAAADAAAAABmcGdtAAAQiAAABYwAAAuX1RTb8Gdhc3AAABogAAAACAAAAAgAAAAQZ2x5ZgAAAUQAAAyXAAAYrO5FPkxoZWFkAAAOZAAAADYAAAA2E2h062hoZWEAAA8oAAAAHwAAACQGkwLaaG10eAAADpwAAACMAAAAzHYWCaVsb2NhAAAN/AAAAGgAAABoij+Qfm1heHAAAA3cAAAAIAAAACAA0Ax7bmFtZQAAFogAAALBAAAG50jJ4LVwb3N0AAAZTAAAANMAAAGcu8W4hHByZXAAABYUAAAAaAAAAH/i0Eg6eNrtWAV420q21jkzGskiW7IlOYljx3ZiO3HQWAxs4ZZxy11Ibm4vM0O/9rvpMjNT+xiWmZmZmZmZo74Z2c7zMvN6PkU0+c//n3PmjGYklCqSJL0RXYlIiqQ+j1GQcLJctat2sWrnK49erFTQXf5KBZ4lgfTY4Bz8G9knxSX2nBiByXKz5jSrnptQmB3zxTlfwMfefm2Kac98psZS197+k9fB1DwjVH99cO/gfm/UKWHzMCVxrDzHmuJYLseyBdZQApV8rlBvNBt2rFgo1hrVqufA1G3XmaaK2tOfrqFqmhzyDcE756ki66+FW+DW1+qySuaDd3DEZnAONY4Y5YgR4IjQqFY8l0kKC3El+JSqR0wIjlFm8jP8K9lsmBr5yemIONHTHOPNnNX9OYbCMUDiGHG76ub58eZXPparp88o/eRppZ+zpaGwleBGigWpWOBGfU9CjZtgNDgGwC8UCv8avFgzjQg9TdSoEfnJaeEDLzgnvb9tjYCwVudO54f3ylc+loyUfrK3RO/B+13KWX2M99vD+02EyhRhjLdirc5P/OCtUK81mqLVxFGv1cMb7sVKo1Kt+iJKTGHixJvie6K5Cd8TJ/gYM62hhcGoCkAhPp3RDEoNLTMd57egRotXOYBIGVpMHd2hy8AyhR1G9FjOkUHWd4yqwX8yvX/cyT4tWbxMA5jIWpQyw5RlamU5Zf0As4rJs+nEVJoBsxw0xlPWU5/ASplCD2UD430p9oSnWqlxA50uvbu43lLol2ZFeJU3P+EKvoJ0S5CQk3ATrsJE43EW6sPWvmqGjuLP+d9xzPOLq2RZNlfEGttGVXV0m9ESOrgwmGJA3Ol0ggHITu5Y1Dg+KFQm7k4VBgrZC1yonT3bEppZZRLbIeaqTEfk07LOeL/OLBMpS6QTPezxT2CpvvEBRjOTLZmVDCBBOyrB+R9iEWv4RcnjSs0wj3I0L8hWmw1O3aM+11gsDILPgh9BRIW4szX7IAIeizAKcnAen3STE0PQtJKzCx9DHVMGcp3ILcADOILvlooc2Q19GCamaNVKsyncx7MgTFrR8jlFEXa50blpUx6cWjskR9Zu0Ay9z7Tuss72ekprB2Wt9cTCp1SB+b0UahGuk3iaVpUVp+ueM1h+KxYl9bfQFnzld9S2/D48cD7o1ga/pbZA/6OIQwBJwggebVdNuVU1s3Y1bADlZ5fx6PK/iUPE4hreu4yHpQTnq4d8myKVXTGA7bwthiMfrLBFVnbcWzYWdpplc+eCIS/h7oh+0ySO0qFtRqDCD41tQ3QUR38O0RCIQ9yuSHZXgAncOrcAq9pAezrI94QfBmob5o4VcMFxNUd8Fx6ShkU9bnEUDhU0C2GlUXgd5GcmDLRIMyZoc+InVUr3PGU4Y5JhbfOcBmVjYEyWU0WjrG3YpA0TMzP8FLwgpkTOHUvqchlsOVdXn/98eJSRm2PqSNkILocr1EZWtqEs68ljLT7A+RwO+aQ6CjmdcEjzguwLyw2hVxASDIVoTzCGLgKgzW1uM9jTxXLThq/CFcHlHfvwqOc/X63nOvbPdVPNNkS9P8/ILfh1aZCzSVPORvb8qputVwWZrB3vuuM88vWsm+feIY6xwwpebW2OkeBKWLkmsc0WmbNKw8oTqrRUomUxg+0O9nRuykqZX2FPn9RleUjMuaHlX2GL0/h50z99RcccTAtzAI/o3AjbP2+Oc9hNFlaMg7SK2/4Ct91cqcONbNZPo8+HcejxbM71JN9TIFGttMtulRuXB8RwC0d5bQJr6wn8J/zHsOZrmEh48zPNE+ngW/clsBEYDR75vo9FL5u5ZrVmlqKrreBwcJgwAi88fvzFLwL8Kl7VN93PYM2hRFxBIMEGjLBgLwB1Bo7GsuX/GgFEhVD88JVXwvnzekx47OrgLPkpnz1SIpMVkTkVnhZSU9QIFxgyXhmKvCqE5yYocOJigAAVg0fpS2ueuAGUmMHhYk4Wenf86OtfB5rVdIctv+jW4KUP5N2Xf2pYvb1ruaWHnf+W9FK8XkpyS0rLP7wMxcLKU1+HhXW0UavVH04HZADi2AQAF6NRXH4qRqNaJFturtkwvWFNs5yNSBIKNHh8iDbFa8pArwL4KxCbv8nMx1vXtvNrTGq/ion4unk7LpAhaRPXNZPmurxKe7ZVEq0a2+hqlUbVExU3txJzUXJF704TRPnL/SOpJKiU6DTmx82kYUetWC/t2dKTxqg8MZ0KXxMatb3RhGFqViyhmX7/VG96S9p4eH8ibQABBA2NiFWYfMfL73yL+9CJGAOyftxLtV4jyKpR67/o3i9d+p/aBWPTSXPa7fMkFIrIy0JFD+C+vdfiTBr/WKoG/+K+gZvbb3Vqe471K/6ZkmjM/+M6NvWHBEUiIipysh2Vd0naC97yXyIy5I8YmX/GF27+C4261F8qschK/Toh3Szdh+fV0h3XX3LPyV+VV832ZBauF6axyY9fG1v+z62lE7+0UFEs+v9hjtdEjzxjLjdQFyg1/lnihongVjjKz+dBLEpkasIGX1V798tRmwJoKvzy6MQ11e/qiDozolo7Ut8DAIKj6yeHAOU3jA2ogCxGWKxQ//kYjr12GIkMua3JXDa5P4uUgiZvn5Z/uXdHH3YCI7xvNtfpax3Kz5QTbWdjHQCMnbXxjXFGUxv7yhfEKKN9Wx7kyoq1rfX9opAIfl1Ki1W5WFH7LX+25mPP8YUnW5/qSCSFzcd9QJhFvccz8eyePZh0+MXgpQ8KvszMH/XYjKjkkcR1aFD9wuc1aicdcgIm4WE//ZjidNsT30s9KObkWmgIGo6IazXMAIVhZ3lAxrFYaPqOZxHoWX/5qpEYmp6TxD17zqLlWrpCjUcN7R8GxNc6yTj96YefDpWn3TZKnKRNtc9/IahSW5W1FPzPpd+8EbVuBuOcgQVCcWjKjvHwcwKCTXuxYrfm8BrW28sUkZnkAdG+TATBeMEpOQIRQx0bW9h8UAOMZNI6orXqwM0bplfv1BE+NNDPYB3MqktPNwFA791y5FY1eGXwWtY/cAU8/XJz35oDmdRFc2bwsm5eY5xXbmVF6Ntx3+sMhmbNqYuHITPRQhe1uG/WYv06AYyevrsTv/nAKgvRTAmi2sHtF5YWi4vbBUmCn9X65OBlwcvNI7eZeGDNflNQyfSz4LXBK5XbjmxPalpy+5HbFJiFdcxq77m8iuyT5J/dc3nzD97R2nC5tbVTAmbYp3unxPZ+UAq3Seh9fgWO2LkphTg/ubX0S3FsjlP/XOkHwVvoffh+iwSwSpLgQrG26+CIdR1fSnVWc/PB2XCPKNHJaKj4CULijhvGGbHmOM0G3BjHU6dPn0LbZHjnqVN3okL2OUrwqeCTvH1KcQwF8pBWIQ15xRC4OznuTW1cox0fHhjHSSC28iQeJ7gT44bcAmSmHZogsw7oSvCx4NNq8OngY4rhKJCBAd4ykkTEVzxN87hn+JpqI6+Gd1lXGYwD4bzbqeh1ylm7jLVrYQNqK1nJEivLa5HEQ2JMtWoj3HBkV1Qdy934ynrBgFzh4fOH77lwYP4RhVyu8Ah8wQeeECl7pfu80gGwj97tQQPDzdGb/ttlQaKcHhwrbyzjW/KgJB5y2e6768XFu84/vJDPc4i7Li4cnH94cOA/PuuA7L/+YdpG7X4XXppkevpZdwwMD4wO53MjI5Ikd2kbkWrSeq4vOmvMzTTqE+PD2TjIv1mkH1Zs3pRsvJAv2tmwKNhZ0d3zoZm1eadfK/LrQPCSo4/yAG640lBluAG8R+57S/BAsLbWHrof3grBA+VHvunXCX3Di0Gbu/L5MlxDROfnX7nmp++HG+Rbj83u0eAqmUPZ7/hZtWPSGmmbdFio3b9jw/rKb6tWbs9gYh1dLECjWSgq7ehCscbCN2Lyq/GXxfYuYVgYfq0HYJMI8kW7raUzZ5aso0H6zNLSmcgmE8DchI+N5GdynXsr+O6ZdVt4n+sTk4nrj1q/zismyPY6TUBpG5YvFdDmkRt5Jtx4BL6ngwDtPLkheNrS2i1ntI0morlRk7Cr1h3k3/vbmznA37XexWvNamsLsSp86VZbDs3nxV/uVOHSuvDtb1kYz2VukRWVOT2afCtLetpsE4gfs3wCzVnN+x3LZtDotVdPa7rMSFybXk2NvqTOVq8hVjxukTWrmd5V7/vErpOYCWWmZDnrWKhJiLazdqx9SSK6u3x1UkEkmhYTE80IRjJZBT/UJ6suI09lFtPSLNgSbIEXwgtZP7+eEKtW/oNRafFnd8Km6lW3yo/F1u+37weS+C3ytlJ9RR/x7v8AozlAwgAAAQAAADMA0gAFAAAAAAACAAAAEAB3AAAAIAuXAAAAAAAAABYAFgAWABYAPABlAIcAmwC+ANIBSgG/Ab8B7AItAloCmwKyAtsDBANMA5MD0AQOBGkEngTFBQoFcwY+B2oIMAhoCKkI9QlBCVMJZQl3CYkJmQnFCfEKXwrWC2sL7QwgDDQMSAxWAAEAAAABAAC6weBlXw889QALA+gAAAAA2LKZCQAAAADYspkJ/cz+ogUYA1IAAAAIAAIAAAAAAAB42lXKIQjCQBSH8e+9La2zLFgvadgZtZgumwWLSXvPwpqwZC/2ng6rYE/2JAdD3w0nGH78Hx+PxAxAApBAImcz1RWNXIjfrXXNPiOBuvdLHQL9Dfp7UYloxzErKhaDK01WTvDFk4MEWnW08rA+t36iGe7ln9yiqcfVTrzt1oRygx/9/h1k7OADRvspE3jaY2BkYGAO+reIIYql7++Z/2WsEkARVGAMAJ6LBnIAeNpjYGJqYZzAwMrAwNTFtIeBgaEHQjM+YDBkZGJAAg0MDO8FGN68hfED0lxTGBwYFN7/Z1b4b8EQxRzEGKfAwNAfxwzXosDACAASxQ/yAAB42mNgYGCGYhkGRgYgYBQB8hjBfBaGH0DaikEByJICkpoM+gyxDNUMtQwLmI4x3WFmVhBTnKg4WfGi4mUlQSUpJWUlVSU9pcPK3MoX1F9qMWmxaLG9////PwMDUK8GUG80kl4mJL38UL3aSgeUOYB6X2gxgPX+BWp+/P/O/+v/1/zv/9/3P+ev+1+jv7z3f99rvNdwz/me0z32u//vfr/77e7Huwl3Ze5E3HC8pn1N65qmgDHQBxQARjYghrGZgAQTugJQkEEACyuYYiPBeHYOTrzyXAzcZDtdQoxBBsaWhFA8JGjn5YOxANbHSYoAAAB42qxV5ZrjyA4th5phGHxBnpr07ZuUPcxsx8nwNH6fa9Fu+r28+wx+GjnL//bR9shJc/dyQ1SlUklHR1KFlSFWq0lsiV79pKYXX3Fj+b2Eb7o8b9MtylcTrjSzn0fVqFpf12uu57GyrCLd6StHRWnos2OY0i2fK4Y2iH9Z4Nrce/15ZzyK1+Ol9xNPe26eEC8sJB4/tS7xXVndtZaKgVG2wfNQDXfEV+X8KizhLCGAyDPi8YUkhYbkbFxWt2V1O3VTa63LTttazWoh2bTW56oh+Kk1MwCqRwsJ13XIDR0CvmUn9blmNHDRRlFfC0lOBsHlk1Uar3O15UEfUU45fBdX602ktZikC262ZBNtcfp0OcGRi6S2I/tcNzwStfuqMqCmga0ONbHSYcaVtS121hGf6y2fRwwJyIlo/aeaWiPxwE9TKyZppwQ5avojEyqKw5a3Q/aY2U/+eOkFODT0yDilONcZbQyZUq6wyeQC5DZKrjZ11hmEmDjmOl/GLYVbR12aNGVC/Ynxapx4rvZsy/N5yhSVSswbWcfnaQNDIp6MXsp1LHRoeUp2S9hNYefzDNzMlpQQGFhHXJ6OUspT4mmQ5vOsebWSFLWNjr3MU5v6G59PmFeLyavlgdL1oD9V6k+aQs1Eq0kxMxOxk4U805YmReuGxaR8TOGDnbOakMdCUgh5yDbMcyrDtjyNa9trd3COK/gvNRaZ9IC/B+3+Uh1TwEKpUxpsRawe9x3HKWt1yqhCVeKVhGd0SDFP6JDHwW8aUorw38/OOmpahWGeFicbbf6y7V4CTaeR26m2z2dM4Yg8C55FnjNFVeR5U9REXjBFXeRFUzREuqYYEfkvU4yK/LcpxkT+31DAzoc+t8rFpz63y8VnPv/HKJ5q/wWM/wXG/8A3AaNIDxhFXgJGkRoYRV4GRpFNYBQ5B4wi/weMIueBUaQx9LBsNd8g7GxKkcY2knJAspF+Cwz7bfYxSVcMUY+OqYTO7mp5xn7TAq3k89Wd8jhn+UqrqDtn4uSqLRO8VjJz7PF1Q7dKvDdg58SHg2DCEPxovTr7nZKfzmN9t7junEFGN5E/9Y7ByyrK7vp8ywTnHvp8+/dM2YnWYX4HJVFnmxRQj5WWzn6R5z3d0xkla8ifHUz0bcc5cxrx7xqgwoDgrzThsai9mQea6GEOX/d2jykY+OCaDsWKOJV5f7qYfFuhKrnfVuaqF20ob+BoRLkurXUX04dqHkBLYGPw2FeidENzNco2FhJsMhfrVN6gg3cyTQg9p7uooUaELvKCKKOkdFQQLVE0TlJIrqOh6oe8wqNk1CxB4HNh8MrtxkLJ7wsHBE19bsiBfghqHogaueoQZ13dk2BSrYeiLxMYMqpWkoAeas+FZlsJZ7uUN5rYvdj77Tso1FEdPKyMljZ+NEQQbZcmla/ngylul/Kx0RQIa108zA9tUATOaQzgkx31wl710/3WR9o8M3y3faTT0PC9do7A0ixAe9gGZQk4gGm002Fgd6cFNVo90HeH7jp4NPCG/4VW7P1T3Sfws7uApfGE7Km3Z4cYYyFjO/+u5O/pIQH67v6Ue0j5zGA4+0rm8FTANzGLz4/RvzCFck6f4ltYvzR8B+KVsBaDV+rmQPFrj/WAHEEABFA0xj1STOcCsb22OWv7WIMLbv9R8XXVH9Pf7L9wO5p/yojY+p5RRBWHICb24QGIKw5BguZDkaQBKRqQpgEZmhdFlgbkaECeBhRo3hRFGlCiAWUaUKH5VFRpQI0G1GlAg+ZV0aQBLRrQpgGGmLfhae4wmI+qrqsnVY8zw/CsQ1/Mu7AeMLj1ELn1CLnpWMz7MJ0wuOkUuekMuelczIcwXTC46RK56Qq56Vqcy5Oj4Ofp9dq8MMzjq/gu+Kbc7AERbE1geNpj8N7BcCIoYiMjY1/kBsadHAwcDMkFGxnYnDYyMGhBaA4UeicDAwMnMouZwWWjCmNHYMQGh46IjcwpLhvVQLxdHA0MjCwOHckhESAlkUCwkYFHawfj/9YNLL0bmYC6WFNcAJhIJBt42mNAAgAADAABAAB42kzMtYFCYRAE4PntDncPsQYgxiF/ORFWChWgIW4VUAp1kOODbPStDYCI8EDgVRZACzhh0RL/aNIKKbRpjSD6tIEbU/rvZ+4WOaxpDxLiRPt+8v3PfAWh7QDm4kwLROSQlvDIA63QkEdaIyuvtEFCZei/n7lb9lSR9iBvVrTvJ9//yK/eWqOi1tSZIHqe8yvmsUJcE/GhlVKQrwiiVFpL6VvZrlOzbYwhu5q2v/6brl4xpXK9l8uy2cPJmXNmZ1flR2UXmacz06Jukly0u0ma0DU7uyhoZiwXhmMaFUZF38Vp70t8TuNMFzQwes7Lj7G+58enmf3k9I4X61xXw1Xhh6tqwdRVCfXpQNHeSX6gHrhydlVQohLVO9Jl/GObdHZZ17Vaap+96nclyVetk1rfFb4JpbfMtjiOauszumPH1Ybn9HUhutFLPryKiqL7zLrtz9nqxde6YhIit4YLJ2XrYs4V+YxpNprQtORiK55sBTH9unKqxE3M9rWkN9rm+jlnCp1oGg5uSft+lHlf9jsdZypbeqeczb9a7kyHk+N/8B9WKPGBChYLZPAgnMGgJWcXiawLtANKZROuwXBBW4AwgxHMgo18Y2FGAStEv3VO0ds7nws3Fo0OrgMYQXMwllI/Fnwv+BFPkmfxKTjFHVhc18ihJWEoWQV8OCvhOWSo0HEfdMSj3XQ5UfUAlq+DDZkkGSrs3h/OMj59msHnEnVYCktoePF/lfMdanfnK7T+4dSbiW87lT7UNJJjRKK0oS8KE3NhThuw6Gn/QoQbaKnmo6+ixCkSPhPGNSpngl4E1eEdxGGnyOU0YW5ul7YWPA/5FDriUD3CRM4pyqA9dJ40HGLQ91cOfcludNbMJWhsZFvhNZ7lK9zBTHRIHOA2YI8+IuG9rFJwR5aDCe9WwgtWIT3fT7mDqdRP/qbmf7W5WNkAAAB42mzBQQEBUQAA0Zm/AAAAgAicoQh0UQJcdaIMcN73CPy9j8yJswAkEJGnQI0VazbsOBh48DQyYdKUaTNmuZjjzN28BW4WLVm2YtWadRs2bdm2Y9eefQcOHTl24tTZp2a5NmAgimEA2oWHMQS74znCzDj+JyvVM0jtz/VAlFNSSbrvw3m9Wd0uy3gR4nF78Xzefp97N7m+/a49m5bnz33wH+M9NYTJFIUjWMIK1mZJkKFA6ytN4QzmsDArSk7qKbRcTgQZChzCcbRumgrWsPFEcFtwAAABAAH//wAP) format("woff"),url(/static/KaTeX_Size1-Regular-7342d45b052c3a2abc21049959fbab7f.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(data:font/woff2;base64,d09GMgABAAAAABUQAA4AAAAAL6gAABS4AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAg1oIDAmXFxEICq0opA0BNgIkA4EsC1gABCAFjWcHgkIMfxu/KRXsmC94HKBlnAHx/5cDeohagu27Bd+UDRYS4HoJ9Iy0jqKYlRsb40/dVFO9V45+vBidwLEdz2Gm4PgTf4CQaHIvyLYhf9sMFn8t9SMkmfXh+VP/3PsQonVe0CZ1UKRTzaTg5nYAOkkZ9CXO7N/PKXA2NaGeLIYKjGq9HwCyagD/j7Z+VpTgaW544DuD2BfNGioJmlkraoo6XXUyeP/DrhS2ytZ278UMmJp9mQ5irIsgMT+tHJIQUHAu1XIo8YgobOwDQa2sAmBY7l+hdXhviuy9mdpJkvAtnfmt9poLbE7WnYBUTQhM5XCtJCBW5f8/16e992XyIVtKkVNw7IE8KiBj3rxMcvLeG0pKmczCzAdKRWYRZv4CkC+QAs7f5QKxYrX1iBpIoxH/rKqskbpaVdcQO5xIu+77agxhGzkvromsLBKeLtS2DwGUySArwQF0MX0ZwNLktZPf4SIU4cizgJtqXLuOZ1I5KG8AMiHc7GbU7UUjV8m0CsCKVgZhZwEEGWYtwwt04GtJ9jqLC891LASwkEJADJLQgqmYjp30Xfozw1g0llBLouUtq8x+OZbGsrH8ze4JKAhwyI/apFOL6vBxltetYvv/sYDnv2V1/+Vn3zlqheWGPS947n6u+JX+8uSXK780/GL4Pv1b67eWb83qOBDAAMKDxjTUtCgAURmP5baASRROt0gswVkihQyGTgMDND1OI8hxcgol3qWMHEHgKY6T9PQfuvUp/MOnSPIKx1teqfgiVLv/Ylcnm9vMeQ/eAG3Uw8McGggQ4lUDhRbi9RIbPvUOL80Zz8dvPkdv3pV6UfkqejKTE97MJd63pIpX7hY4WKuASohTOJHh9YhWKou7E0h5JoVQLaQZkgqp+ZxmyUHs9Q3QzhK+4A0MNBasdgvB8VWEkwAvwXmfIHEDC/PmtahcGlSZks8SPojvMszJpx4HVYT/k+tWnZUo2PA65leue5OiJUEh8228hGuXJZz20Tkg4o0ekXWAd0StZALR0UHTlfPsHgnu1CCC9OxBxvk/1qUCEWTmhHV+Hq3WJ0YvaoHjcN3bGyQT2j8tZXT3xAwQVrPGxZpoYSwPK4PmEVAu00R0tKh1IykzIuPgYitE1NyAnLXpBeplTSYvemc+XfcNClQa5TGgGzUoAYkl5HyyTuIuCQlFAd6jgupCFYTaKhvUP9ZlxZqgZFZpF6QasDg1nr6Llc1H6WLVNoX9cDRky+v49O3Rdf5WdAfVoqLn3jsqcMeQJKCyBAjVUOUbVAwPmZpg9JWS2S8PyxbLYkkunLxV2tm0QwGa3MxLNCHnFIUlE1W81R0f3mmFO2EjCMFlTzw5v9Y6rNWi8C6ikqAxMglIBcRBGZL8VvfX0eU2lPaqrcYx/oa7kBr0qBjdaDBAQsBIKAQRBoIJCyGEg1DCQxgRQTgRQwSRRGOgFvLlSiz8KnHwd52OxBrH1EQTblFgKzATChbCgJWwYCMcRBEeookI7EQMDiJx4g32IIaEyow61tAYOfQIhR7xXe5TkwgSjIRTQxKkqZzRZN2WjWTdR/KdT0/O6aHVkylJp8p5wzjeSm3MuYxTG6PZDd1XmXuk83EnJ4CY/NpVTZj+Qvj0jA5sq7q94XpDMrSnqco+YLyHGlLQntlrSMUuQzivuIM0VOqml9RqCqRzdzwui6e2PK5OceZ8gkjoUz0xnLze4AWYwqqbWPFIeGNZEkXaK17FUdIvUMumCVYCYiDaF/k7zHwdf9KzTcH9pGEzNIVhMBRTxUrg2yTHNLk0iTwUpcb7GMq8MBh2i0ie3c51kYehqmT3qzMJNtik23KGmBOoIlPQfLM2woBbkmdYhtNuq4oXwIZGSdWjUbM50I0nzkkv9GjAlPqFXDCDb3tbGaXnIRBLkDRh8pjDRK8qsw2WUdeHx9hqz7yDli8hOKu7vBJTPf4AnPJVzU5sOUdITxa978zg9oX+linEq63tTb8PTMoM50/eRDKa2pro9Tcy9RlHezWNTILaaFecNcBrfKPZA9KtCCTrL/Mr3nUFLFsS1bmcTobB7oUl054is8WxlDuoYtGsDr2xV0w7IGsBG2IuvWdbzrv8Qp/UFHn2sE1A8i/0tqVVVVqNBenJ8un1WBSdE6mG5NNxKewoGlT4s0tKLxcPSENQsi5Mx6ZWk2JNTOWVDnqkS8mpomzQQyA/MBGQNYWFgKpTwEZApynsCRh0MjgSMGkKZwIWnRyuBGyawp2AQ6eIJwGXpvAm4NHJ4kvApyn8iXZwHj91Swsh7/60D4qIHZC8OyNgF+RcgwCURAPURENqK3YDvb4JRqIJZqIJVqIJdn0LnEQL3EQLvERrKB//70/086d19LM/b3yqGFvlpA8rfgLIcrBuUAEyLoH+NfQA+A8BSQvCkAJAtKAF0yIPJw0QnYI5NqIz4ARFY4lYlo0wKcUqcWVJkLOF0Y5e4RmbQ1Ub1OHhSS7eDwuOVN1BpFytVEZq1Rq9KzmNhU1xW4MH4gEZ7o9GSIJCyAJU4meBLZBk0S2+ywPpj6ktVIVxXac1kPyQIO1gxWNvhCr7KVtyk8vnQHWWV3g2kKeIyQsMUAeDERJp5s4wV+GS2tMF3EEQFyNIZoSQTZiSZWwCfk2cUxWPorqYCwUjr2AUG1+uMKZgyKobfEISCTwxwCf7CKF1KqndXJA+XfPvtRaoVyrp/gcDxlNef2Xzi8lqnFUyQF4EgnUvGK2plM7Hww/Gq6uf+cz48MaHOQvZgvaEKVlgM8JLbv5tMKyM8f4/qZyErtsfnst0sstfc42e8jEu69X31vdaXIqDD1cV55bSB7xH+rk5L4X7HNLJvgeMIcQx9nB8OY7hdEKOrOzUGIMGLLg0H9oYkBeMOGHBdWsQgheiykSc+oIq0ly6b0CzaJMpqnPPTcfXkylixx/b8lDI9rzVoJepJcMlHnt/FFEsvB2bJPnke+ag4o9vjeJ/pkLI3mOqKFvy1B0GIdcOw8bdcIu76eadj7+W/3z2Z1OVy2csnY8tPymi+P31ODd880Zc1lfKRUgvgOp55lxUIE1mJb67v/SBD8ontiEdLlNLcTmfw2b7UwV6yZv6B73hqYU3vzK6f/lPAqzYzucrXkFX/eSinF/m3b3ke248pi96MTFGjvQD6/wV42SrTq8t+cT4tsomJeO8J7i8PkZRdeQ8pNtuzCkyjr/Pq7NCmh6pZU9TW6iFGdkpDOcDScxatAcCLPw6rdfS+Lr7s4Qzr5w+6+//OQsB6cT7xPTbxf/Mo4hFtRCX81vWHFpGD0JIpxU+n7iQB+r9QIzyRD3S14XwasgmhJ7P86IJUKeAzQ4q8gJ3MEh0NKCAvcarK94SkPd33NHdDTbDaZetOteOw95e9dNPzE0cp5LZwfqBmGKuuuaQx2SFq/R94a/h0YlL+KZD+hoNPKBJYrZtmIrfCRGqn7LwgTqJVx8HjiG9pe24PeB8IFp1j/8hGQdk8+M5iLHNsRA6B8fiVYwe2PgOAGtBzWGQUarRGMAlrdxKMVFH6kDueB2o01QI9VD44L9MP7HsDp3vePyti3EsHPJJ8m9aPr3y7oE8dsloGwLV/wCHaZmY3aRFWx11QuZdGg8Ac655PpDXGKT3IATkuI7wSCZAiPQupNkcqBbyCmOo5IQDBpzPfcnebwFTq6XjIw6AcdeYxltz2lCZFpQTrQJCiAH2CZLP8V3U0Ryx/i53wC12zmR84QP9G5441nku/f6b5+Ua95dnwn0M+8nnD49eFsaISsdPsHVHHfvn4Sc8TR4jHqtQEGzxx68RhbK/GK9oqI5q8xPGb7SO1m7o0W+v8GULq4wyx7ffWWI0GKTw/ePmf1sIkeg/zxnwu854+NujgoPUMVbHtz+y0hsyeYOlYBiesCWe/xD/Y8Zb5vgUitOn+kSOdUrwKW6HFoww1w5xr04NTls9xG2uHVEYilu2dGzuTYm+tMl7cN9omdKnVNjGtP6b71Lmh+BWbAaWJYAY6zqzHNWrz27uHTGeIAHLMmJxM1SZn+/6t3WMTcGLxnWqclWKt7/5tTJVW5h36zLP5+QfLuiyyRW2rhdr/JnSBv7yrTxtYWXqr9+8rVD6lBKv+7QrtaJytYx8Lw8kZB5f9ueertHO+Py4FU4JPsFtfnVFZarrtNvLs43ku4LHNaV3D2Qyu+n//80wL7+XzdzJXj7D/N//dDefdE3jyJUOfbVJuB+ILq8If/uhUK1W2wtnuvyx8+PLkuTnsluEf2pvjQr76Uw93+fLJvYn0vmvJNucpq2dL029lSqdHlLiOH+/GY1lkf5Hli1uTRuwbECXoYZiGssQlFuXRVPz/QuF/0Mgz7x1xtzYmD7/U1PJHzbH8EKbesLInI/kNBG2KZ9OMhBG1UC+OqRZyBdpVlur+xb3ckT13JO+uR6N5ioR1UUHzduYWShJJCSrfuW73jLJMKWB77N2hkbDmv89Yxykketzkl/aGfeH/sECzbJR6T0/+6KGV/0VvfNFoIHf/3dcmdZtDX39Z0vy47DZsQ8bNPOCDTXGqoS57sp/RCZP7ywh4vXwoO7guDKrZYP5spZTPxIahQb7hxGrgje32WYS0wxDtm3kxU8zE/rkmMI/DwvqZvxPU53ZbCbF2va6pzC11AQxCV8kJZZGFSdk19i3ct6tYRnZnHSJb2bMgvi17qz+DkEs5Y6WJ5lLohoS8qpqErJ/H55JvUtVR/zmKXNEPm/qrqMjQmZqG/Wc7ew3mRUBf6Zf5y9zN5MIIbgrIXb+jIKu4OXDQ2aL3kKsfHy2qnmgvMAkzbq9SveKPvLHlJDcFSG1q6wfRuo/1osYR3iKUXfBFP6dNtwXZqQ8M3au7rjB9EFTiG1xyLi15HKE/hWdiBoFHdr3wiMuK7dJMcT8nghdZ43JJ1eqRtYWpbZvU9SXohoz32OEc5Z9Tubl1ySSlX99vbcoL2S4ffFp0UjJay8zzn2WcwLzHt6TBr25YsLMITzTtcK0X6s5SwLFRx+mJbEPUdoQXVK8fHVhp3ti/N8+2dbq7W0d+vlCUx8KtjF5rsmvx3w0CU+e5qxb5zUP/9QHpQf3MfAj7yoDx7eMDc1tXCiV/yoRnTpp79v6l893akZPiKQ3pKo9WarI8yM77+7OicTrTAJHTp02Sj6XqYfh3IUzZ5Rnzp67gGF8zFsnv07suXOOosP106BhPxSt2TcuamTGxTVTts55LyR5lO1UkPHTknXb13rtlO1z/Xk7PUk1J43zRk/t7LEnoql9R/nSgql3d29XaCIiNcMl7fEDE7fti+mIGzH2wF719JIJ+cHFjmyHy2x3rFez+d9pYVKxP5qbw+z0dH3A/lQU+WqZnOhWWjVspV2nI5SIGPm0qd/3K57Vqlm7qXT4/sVz+x9RL7MRH8xe2SlpjtPsGlguyy9TNfwOdPJR++Vz25aw/rrOzjfCxt5kl8xuiswnzOxZ/NS72W90e/nS1WvGsNQIrjenLyF1dR3aKhjf9xfzX5l9777/3nt5ZE4XoSmPJ5WuV2h6adYpppQ+jlL1qaa32jLms3nh6LCOjmHCnU6N6ei7JpFg6Oj0ywovh0f8UCjzd3YYBJHp3aMmTecdAbVFzHStoByImTDeNn6CuA3vc+r1BS2YOH3V/FXTMbGlgLmJI/7N/OgD/Dilri+PAWFqcfr+8JgFtANA2vOJ9A47A6M6ysDPCdXjWZ4loM6403JKgKLQeChEkxCFUaI0G9XE7DyDNFlFkFqYw0EYNqbo/bPjaiDQ4Pzp1XtkDjayo5+/MNI5ncuRxBwqCLuYQIkJs5qBb5Sj43xeRqLpdRiPyZSXFvXskZhgimQId7jW2oKs3u5Y01Bnyzw2Spl7Z7nm20lbwDMCAUCAWXM1sjZVr/tiGfM/AHx/apME7vKZ7tlu0ctcJQAxKEBEKZoooZH3ChpeTGOFE4YwDk9AY/OyBk/K1Icz24hWJg5e8j1+h5jWpaZbMBEYWgvzf/dTFdxnurZvMPsC1TK3F2mp6EgajzS2lzXwXjM7jTrYharxe06dLPTHKDvAz/0Hr43eROIBaMQASZTWXwGnA3QNakwEIMg2IAwwEmUzocrKGgQyVBkUIjQbDKzob7DQYb7BQYFNU/JVhoJ4sN9QIpT8MKVahKJxmGhkJf12k7tZg8BI1xkUSnrEYJBPLxosomm3wSGUiZqSXxsKOojJMJRI5vZNqV4TzXj/LAavtdn0k61FfsZlasKuNXMm9UdBVcXXqOIQVVhIyHjp1YEW6Mhfby9gk6HfLIu9TA/dfEfkiy6Nk1AHpEx+W6vUmk2bJ/FlRoqKTj+3pTLRnHDEpjcFCoqmby18O629RctVNo02KXovh03MsV9en7WJzWQeX/UijqFpTGa9/ecB2hMxx5uiFBxmyxfrN/GtX9TLbnWewheTn02eg1/q10HXkL0dIK+Ozbi0/gYN+i+1uVMruBkvKx/33cC0YkcWJQ9SbBpocinW8hlOxaAw5F10bgw80IY8Z0GYgxmsHI4x34kqYpUvZBIxxl4BcdGpx4sjHg99vR3kpJPe8+3OfA05Y9PwktxJSV6MxJVekTqwmUZ+PykQ+ZmQjhkUs0ji0awsmnNW5faMVbEZPnTiOmoFSYE8olLN/pe004avJjSjIk6FdhMK57kohrJqEowmXVPxAAzgwEkHhzXSu+UY1n04luISObVLzA8HFHj4QycDSFyDkjUdusA1+pJTQYJSkmdQmC1bsLHQJ2Q+9ZIJ5Ko7GimgLOVqiu4EFJiUu4rOaFOCWSQSWuztsqFXx1xEF241TljRZV3HrUGPElcgpxn6uk9sxkuy8x/CeepyZzdF+B368fnV7nS/T4nRfugHjNEEXOPb11a8adkut8fx+vw0tHT0DIyCBAsROscbsi5OZ5YzeeMep1syrmPYgIG/wCgrbHG7XU7Y0p2j5ibytsxxqi7VrXh28Di9arqapWTvkJbnTaH0y3I6QXWpbjWZpO6Rl5+fq+bdVT5KLuD96voAIcsbTpIfs48+KgA+OwDEwtHFl7kIQLKPZ5AbsJGFVfUnMxfWEzCAREcuiWeBsGzQv7YeizfMngOQx14g3Y9dFqCFATcgFwAAAA==) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAABkkAA4AAAAAL4wAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAOlAAAAE4AAABgRWJbumNtYXAAAA7kAAAAyQAAAdqK1xeEY3Z0IAAAFaQAAAAKAAAADAAAAABmcGdtAAAPsAAABYwAAAuX1RTb8Gdhc3AAABkcAAAACAAAAAgAAAAQZ2x5ZgAAAUQAAAwCAAAWjK6904RoZWFkAAANwAAAADYAAAA2FFN06WhoZWEAAA50AAAAHwAAACQJfAGCaG10eAAADfgAAAB5AAAArH3JAgZsb2NhAAANaAAAAFgAAABYadFve21heHAAAA1IAAAAIAAAACAAyAxmbmFtZQAAFbAAAAK/AAAG50rK5LZwb3N0AAAYcAAAAKkAAAFCunBaJXByZXAAABU8AAAAaAAAAH/i0Eg6eNrlWAVg21gS1fwvsGXLtmxBwLEMiexwYll2aZOmFGjKzHhQ5i6Wl5nhmJnTHDMzM/My826s3khO2vSY73Y34tHov5k3k/l/zBAmzzDMF4nKUEZgfMM8CwzpaLZkS85aciZ/6+Z8nqjle/PwXgaYk+VzSSd7mIkz/FCQQEczKELGNLOmXShFS5amKgIv8JRXFT2qa6STj7/49sZCYfF34ryUSL4z5fOZv5fKRym/7NlbP/LLX3wMrGGesqFU7h7nmjkHDs5xFj4VYhAnUz4XXoM4CcSRXJxYoWhZmqa7CETIpE27WCrGinYhS7IIn/FJ0iiSFBIg+HvT50u9M5kIsnt9rIv1q59/zPnaMOuD0FPwrjkHD8yBffc0Jj2sCejTI4glIRbPuFjoDVMqut4wAj9XI9dQKmvlfZSiphbgf0BFoolP56iIX/8SLf0Cfi3g1+B9LVtqBo9f3nkS2RIE6+l1FuqVRlFCqOcHj7lMOmsyWbNo5XWNIY/oEQTYBxAOBHlKrilfVyWy/I+5QFikTzfiCJHyucyTo0gUXCQbA4RH5M47T7KzraeetvjXot65iJRBvXmo1+AhIV8uSWY7Mb1roVjCrZsUXBLdA521dFXh3eCFiaLixT0EQdd0xT1UHc+4aSrJ8JIUHDJYACCckN4isqy4JS1wBIAFdXXzZF8gxFOfafSGUURB32bxYvDlCbwFEu41TB8tH+LZ7v1y0zceCVSFl1hUqPJRa0m4OvBw/cSXhyjMmVitET4kcTSs53vFh5u6rw0BLJ9WTSnfdRAgdG1300OB3rweppw0zuMB9Lh+LFvyFYtVZczyinvomVK5uklU6CKlIrof9c6lUrZCUOXURs/lwpLU1bYgxoFgN9t+Sv3JmmUB4GIL2rokKcSzbJAtzBeBQLCtubE94N/bGvO71IA4v4DvWHZrmOM0o9SvPXS3MKPUXMVyQYljw0rPSuHuh7T+kqFxfMjvpyzRF1hB+JGU7zESMZbt7I0n5aavPyJYC3TCUj/DwKlniU3voyyjoZ8+Fv2keTSb1RU+49qbTQs8xixtcvDDZxrgMS5ADOPIxMfpoxOPGAYJkFV9i6W3AM34fenw9OnhtM+fQfYYsoneSR5g2nFUXXbzxcprHmdW3k0NpEXTdRzayyLcMojjISGkqwAdcm5mtmV1R9CcO/+cDsoTQjlf/bLL5rR3xu217WeL50/pIfcHguEUT+rUKjcrfP5ItLlVEmJni3KKysBIjNgMO95n+PM+j8T+Aadx3Cqy6dSpf8Xrct9/zmtmgtPFfo6+n2lA65Ke15plqSkbbSvJKTk27sl0bcvYKRUNZNOxS0UnIh6qoU4ATt8HqqvNksheI57QnC8tKRYH/ewHym8ov7FyuymeCISLxcXMONws4kYruH8eicqpP0V+dt8ZNHgI0QAeH/fkYo8HRBPewH5wHHrJ6eK2I/pkRM95Fa6YSukJomOoK1tDSmd0TQDFSpaK3mZhRLikNwG5QWOyBTQLsoUplKwkKydJyTDNCWhhbvdXO51vOT/1wTcIQPmh78Bb01cM3LRIVXJ0yqTym8tvwlBl0pf2gAjTbpjoPAH0JLnMGExzoUZEnSFRCJQv4wlbfhMQIVq/sbaVf8PLgRCBsNncHf3QTmDFF+bCjrAbv13lg3QEK1Lt2JwCed2dTDIZdIJ6SeSWm1gNlh96t0zKv44KcpBw9mvD0aQ/Wp2rL3xzsfPaIM8ejrJPD5YETvkoaYmqWV800dk0pdwGAjXhVFp0WRt5HX0PN5/pQixbcVlTBDeNNY+faKyLloqY27pSqXhY405nM26EjhXDbMFVe7NN2FiNFLLsePPKSzW9zTJShtVF6+J60qZUpOEoR5KpVC5Rvf5oUmtoaZ3a2k0StXqyXNscolQByXrm+FMkSqoXL7xkgVY1rbMulaxqDrHUR0Twr1r5lRtfXv5J2Tkyffek7hkd8VSSIa4P3Cc9Hw7hGmT/Ilsh/6If3P+GBBL57/NX9c/yTl3ehY+O8v5RRvzA0I0u9/Rf5/6FFDgYeW7E/F/PFa/OLGBezBzEXNm1ZePSvsQf5Uqs0gtgJbZKUVfwV6JHK8t5nhcyAjkrjNBFSq4Wytzlm57HARsKWV4IEcHCBxz1TKTbOuY0tLUld0wX/UubWq2sRX1/lvuOQbOtzdiJagtbW60z0fMJNTHC1be09QR5XpmrAaHV0HbEX+3K2WDV9DUSGRenb0O7OXn6ogWzOqfyLXD08lumFfzwpwRe5/zcnDRrwaLpnT18i3Pry2+ZUSGSvsM4uorTtPl5faq+zJJC8sXNl/bVX5c4vorjIy/ui1TmQdag7/dmD6XSZXnLEGCEUR6LTKnSNugaa8SVRIh1tjvbqJRQ6oDCZ0jQiIcIfI6AsyuWqOXZ657dxdbWKQLr5zS2uoo+8zuBMn8OaXTlDN74XnQQc7RRKdWqhsTDjXAbhOuUOBBnMpHidWHinEOBXhwzaoLPHmRvJjWJmECFZ35Hq2oop4r0NM4w04Y4YW8+rKzP3T0WwUBj5E05gukxGnb5tNDLIuLTCsEbdg9sCHEAQOPpWhZA/O0b+mftvMoHwNam4xQAqq4/SochsqT0qhV1i5yjzkRW1jWZhY/CJ8QbvleTO7lbdHqcGays6Sj9Anwx8Jlzt1R46PZ46DjdQRRd//HjCFo4mnJyBC+ekIx1EGO9Ao1MILVROV6xamDWjvFWBbKzb9p2boux9JWT1qtoP70u4lrlzHB6xqyCT8BHXasinDPRmRBYOXhdv8UFF3VvvaxuERyFLzCjneYpXFNwZzrNFHaavwTjvkqf2cJUukRod7XOdIkpOSNHwLC8HpH/7l8Yy3J7Vssb6ukW68+OhDope8RyflV+G/9dbDfdkXZj7xVArRrUUnnUKtmxaMljT1Cpu16OxVTNo4ruft8ranm/GAzBUG6dpg0NQVgMB2pf8VgI3g37Zwb8YVFw5m38bbHozHHmC4GwMhP2I8ZStMTtnXXECHrWpk2EiRUIGW2fEYNiUHaLERgaet8QgVAgIsAHhoc/AEL53IgowHtgCOAdcFIQZQmcXmd2yBlwekFiGIqr3m7uXZiddcwUZgAr28zuNkMGilk6ro2shBzdqK9UuFKRO13J3CZzXOdQtAtoGOC/ktd2Ztw8Jq9ItE0OnNj60x0D5tSbX/nF+t2ZIefuQXy45dWwLGC1a++99KLJiXl9j706WpeI7tzw4lc1tbzx8LnOnXau3rKyqXYfwfILofxLfnzzG/fv/vCFJ2o4ruobt1YeLpkFrL532xtWr3/1NRe9PkSI2Nr+pq279r0Z5MHe8nDOIvlsLp+tCzIMN87fRmYi08ssYcJTg4P9kye1tRoJGbi/5XhMzqCEuH6nwMxk5VTStk0Td/QaH1QV/faaKSikUnKFFNz+GgcPkRbzfSMGBzG4IcryEMMNpIs2HXPudO537nfvN1/yDnKt+8BvW4PsVAe5v0ZI+SaSZf0556lPJIJA6gmUfwSE+OihH81e9+xLSHbsYbNMGtx3YgsS1t2bOIufdqabmc9sdvlZu7i355x8k/F38IOJUckMFeeuUqngVu5sRaB4HWYRTGRQYHQvYWxUoJpp6mlGVbxBK3n0t1ImFvS9+ZLGZds+/elPNx53fuU4x/lcUm2ZJ9ZUscdp3A/Lt34ayKiwegf/hS9y4BwqRM6/LToleuuFEeuv5xNI6+Pschz9M2x8dflDwB6bUrB27XvVNbH6zDFyKIivnJExWfPIL/gvfZF3LgJiinMw/0JzRJNhyLjKuhlX9nOsekL+ieoKox+oqsu7Szq+RpZVZUzRtjNp784ueD9n2YV/oCLDZ9lqT3fLdhrRayVDsNQtwIXjdSEOtqiWYEi1eoRu3/JPlG7nNe4n+C3QWtmQBNi6NO6vqfHHl24FQTLkWoqo4+fi4p/MQXJqjBw1TrQ4yyuKqqLjqQYza08h5hS2WCjYE0Z9oPXopzdBCgbn2E4x4Ts955SvLF9FDpCDaLAmK0rvmvMO3XDpDYfOW9OrKIaAxNSeLXQjiH/Qwmwe/X2Yq/w+3GlbqoXH5srf368Hrh5qod7Y3OPquO/+AMfzgJUAAAABAAAAKwC9AAUAAAAAAAIAAAAQAHcAAAAgC5cAAAAAAAAAFgAWABYAFgBKAIAAnwCzANQA6AFhAdUB1QIAAk8CewLKAwYDRQOqA+AEQgT+BhQGyQb+BzIHggfUB+cH+ggMCB8IUQiBCPkJiQovCsQLEAskCzgLRgABAAAAAQAAf0Tz9V8PPPUACwPoAAAAANiymQkAAAAA2LKZCfwT/KIHvAVQAAAACAACAAAAAAAAeNpVyjEOAUEUxvH/zOyqJ9HolbbSvClcQYkD0NM5jNYRHEa5nT0Dgu9JRqL45f/y8nFnDhCWoJu44iLTNKOEK71qao4njs43aXg/0gDwHMukeVFce8b038cOaxbYqGDfe/MvZnrJv245yLq9Uaq6DR04dvABg04iLgAAAHjaY2BkYGAN+LOIIYrN4o/wvxr2PUARVKANAJIcBgUAeNpjYGK2Z5zAwMrAwNTFtIeBgaEHQjM+YDBkZGJAAg0MDO8FGN68hfED0lxTGBwYFN7/Z1b4b8EQxRrAHKfAwNAfxwzXosDACAD6LQ+wAAB42mNgYGCGYhkGRgYQuALkMYL5LAw7gLQWgwKQxQUkNRn0GWIZqhlqGRYwHWO6w8ysJKgkpaSndFiZW/2lFpMWixbb+////zMwANVqANVGI6llUuIHqtVWOqDMof5CiwGs9i9Q8eP/d/5f/7/mf///vv85f93/Gv3lvcd099fdV3cj74resLymfE3pmqKANtBFJABGNiCGsZmABBO6ApCXIYCFFUyxkWA8OwcnXnkuBm4GcoGwIIMojC0CoXhI0M7LB2MBAO5wM9cAAAB42qxV5ZrjyA4th5phGHxBnpr07ZuUPcxsx8nwNH6fa9Fu+r28+wx+GjnL//bR9shJc/dyQ1SlUklHR1KFlSFWq0lsiV79pKYXX3Fj+b2Eb7o8b9MtylcTrjSzn0fVqFpf12uu57GyrCLd6StHRWnos2OY0i2fK4Y2iH9Z4Nrce/15ZzyK1+Ol9xNPe26eEC8sJB4/tS7xXVndtZaKgVG2wfNQDXfEV+X8KizhLCGAyDPi8YUkhYbkbFxWt2V1O3VTa63LTttazWoh2bTW56oh+Kk1MwCqRwsJ13XIDR0CvmUn9blmNHDRRlFfC0lOBsHlk1Uar3O15UEfUU45fBdX602ktZikC262ZBNtcfp0OcGRi6S2I/tcNzwStfuqMqCmga0ONbHSYcaVtS121hGf6y2fRwwJyIlo/aeaWiPxwE9TKyZppwQ5avojEyqKw5a3Q/aY2U/+eOkFODT0yDilONcZbQyZUq6wyeQC5DZKrjZ11hmEmDjmOl/GLYVbR12aNGVC/Ynxapx4rvZsy/N5yhSVSswbWcfnaQNDIp6MXsp1LHRoeUp2S9hNYefzDNzMlpQQGFhHXJ6OUspT4mmQ5vOsebWSFLWNjr3MU5v6G59PmFeLyavlgdL1oD9V6k+aQs1Eq0kxMxOxk4U805YmReuGxaR8TOGDnbOakMdCUgh5yDbMcyrDtjyNa9trd3COK/gvNRaZ9IC/B+3+Uh1TwEKpUxpsRawe9x3HKWt1yqhCVeKVhGd0SDFP6JDHwW8aUorw38/OOmpahWGeFicbbf6y7V4CTaeR26m2z2dM4Yg8C55FnjNFVeR5U9REXjBFXeRFUzREuqYYEfkvU4yK/LcpxkT+31DAzoc+t8rFpz63y8VnPv/HKJ5q/wWM/wXG/8A3AaNIDxhFXgJGkRoYRV4GRpFNYBQ5B4wi/weMIueBUaQx9LBsNd8g7GxKkcY2knJAspF+Cwz7bfYxSVcMUY+OqYTO7mp5xn7TAq3k89Wd8jhn+UqrqDtn4uSqLRO8VjJz7PF1Q7dKvDdg58SHg2DCEPxovTr7nZKfzmN9t7junEFGN5E/9Y7ByyrK7vp8ywTnHvp8+/dM2YnWYX4HJVFnmxRQj5WWzn6R5z3d0xkla8ifHUz0bcc5cxrx7xqgwoDgrzThsai9mQea6GEOX/d2jykY+OCaDsWKOJV5f7qYfFuhKrnfVuaqF20ob+BoRLkurXUX04dqHkBLYGPw2FeidENzNco2FhJsMhfrVN6gg3cyTQg9p7uooUaELvKCKKOkdFQQLVE0TlJIrqOh6oe8wqNk1CxB4HNh8MrtxkLJ7wsHBE19bsiBfghqHogaueoQZ13dk2BSrYeiLxMYMqpWkoAeas+FZlsJZ7uUN5rYvdj77Tso1FEdPKyMljZ+NEQQbZcmla/ngylul/Kx0RQIa108zA9tUATOaQzgkx31wl710/3WR9o8M3y3faTT0PC9do7A0ixAe9gGZQk4gGm002Fgd6cFNVo90HeH7jp4NPCG/4VW7P1T3Sfws7uApfGE7Km3Z4cYYyFjO/+u5O/pIQH67v6Ue0j5zGA4+0rm8FTANzGLz4/RvzCFck6f4ltYvzR8B+KVsBaDV+rmQPFrj/WAHEEABFA0xj1STOcCsb22OWv7WIMLbv9R8XXVH9Pf7L9wO5p/yojY+p5RRBWHICb24QGIKw5BguZDkaQBKRqQpgEZmhdFlgbkaECeBhRo3hRFGlCiAWUaUKH5VFRpQI0G1GlAg+ZV0aQBLRrQpgGGmLfhae4wmI+qrqsnVY8zw/CsQ1/Mu7AeMLj1ELn1CLnpWMz7MJ0wuOkUuekMuelczIcwXTC46RK56Qq56Vqcy5Oj4Ofp9dq8MMzjq/gu+Kbc7AERbE1geNpj8N7BcCIoYiMjY1/kBsadHAwcDMkFGxnYnDYyMGhBaA4UeicDAwMnMouZwWWjCmNHYMQGh46IjcwpLhvVQLxdHA0MjCwOHckhESAlkUCwkYFHawfj/9YNLL0bmYC6WFNcAJhIJBt42mNAAgAADAABAAB42kzMtYFCYRAE4PntDncPsQYgxiF/ORFWChWgIW4VUAp1kOODbPStDYCI8EDgVRZACzhh0RL/aNIKKbRpjSD6tIEbU/rvZ+4WOaxpDxLiRPt+8v3PfAWh7QDm4kwLROSQlvDIA63QkEdaIyuvtEFCZei/n7lb9lSR9iBvVrTvJ9//yK/eWqOK5ciBGPrO/grdljxtWA4zM99SHY8y7sRUdg9+/SodpuUyvZIftKSyGtamk1p6m7yjOAy/t+IwCmmBG9MpaD8xXCTs02qRKO8pOfp0Rf5G66kuaDbRbc6H6/qAT073zYjjPe50M10vlYVdKusOU6xCGqMHjNYN5YXSEdeNKQsKVag+vXJK/8Vj0tuJfr+vcm3TCz1Qkjz17reOfiO8lJK+rlyLfa9vbEp73HDd4zZdNURbOueHrSjPO0hNc/1zvzy3fV0zSSEzCReNyLpFm2uyKdP+6gZtV1xckzeuCT7dthypSInZvZZ0T5tMn2VM7iSalmZ3SdsxL7W2GguCJqlNZRvVmOzqyMH20sbrfzCPEhWGqGHQQQoLwlskeCffGKFc39FyKJKHsABG47gFCPtIBLPgRN6+VFYdVvB+6Rzh053zN6mtC0c711kkgtpg5KJfF3wg+ASnkmcwEhxjDyyuXWTQkrAkWQWs+9ZSZ5eh3InHQK94tB67/CbrCCxvmYHLJMlQ7vn0h7P0f3+azmcCfXcp5NCw4n8h3wHUTc9TePcfp/448fKGpR9yHiX78IRp3LnITaxxc+qBhU93GyJsQYuaX92KEidP6qlUmkfKfUHngvpuD+Jww8jkm7i5NTdpXcFtl0/uROzUq9iQ7zYqx33ovPHIwQc923IE5R53shdzCRo9eYzUNc7kLbUHM9EucRa7DluMwZO6lasSHMjVIHF7q2AFK5ee3U05wLboN/5G8wPUoVjhAHjabME3AYMAAADB//Teu4Vs2ZNghOIFE7QVT6AGDHDHCAC6lA9D3oCMGLNmw4kffwIiEkc0tI6dUDglp6Zy5tyFS1eu3bh1596DR0+evXj15t2HT1/zviW5NkAAhoIAWrPNF7SL74G7w/zRq97J/3EmstRVksnvfNvtt8/7pi0iTEPxMMA49AQZCtSu0hKuoIWuu4hLOH5LBBkKnMJ5M6YUYISpAMYdQXoAAAAAAQAB//8ADw==) format("woff"),url(/static/KaTeX_Size2-Regular-eb130dcc661de766c999c60ba1525a88.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(data:font/woff2;base64,d09GMgABAAAAAA6QAA4AAAAAH9QAAA45AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgyoIDAmXFxEICo9sjCIBNgIkA2wLOAAEIAWNZweBOgx/G9wcIwM1cpLygPzVAU9E7KH/ABI8lwixYgQOkSq8jpPrfIt+4YeKd9P56rNV5+O9xBGSzPrP02b+uW+EYQSGMMgSd4iYL4SY1YWskdbJrkcqZtn2i0mSijvEP97uv200Hg4kwcQSizVLLZDiH/4fbf2sKMHT3PDAN4PYl8GyBv6dBM3sl6KmqKerTga3zKY7tgOEqz3DTVGHRt8H4VF90pT5vzklMOrLQnIlxAtxAe3QyeRNbf83V2X//+mhWpUlkFkET2BJARlTXZ3ql0pNBhDTi9A9C4QKUJEjOABSwPIUuxX2hDplTsizbUgklYt9bLlTT3iLsamrNEC+uGfJ8m2AsfvpMASARdjPAewP3ZheRnExdKOGgY90vP8BPs3Aia0LaEDSF+WSomvGhPu440nAoSkO3dJJCAA31HFxE7hD09rkcdXnkUDHwYIk2QpNYhf24Bb2R/Y8x6V4UpXMdz6KvoD8JFmM0ceR1UuZb3/0w/iHee357QcOHTz9h/YfvD9oL3z1gvx0gR4LwqyURJAlEdsum/UEOJi8gNMEEbNZNklmzHUZCpjNTIKKaWkW/EpdFlDgKU2z9OYflu/eID58SpQckPVWTtQHEiy6/5LNWnNoC+c9eAOyyQCYSgwQSSpPAow6Er/egk+fhizImh5Odz4nb971I2JgK3kashMV4aaKt6w6L++OyArKOGdQkVtEC7/26UR9pHNAViXmJqW6cpjKoOwXUHLODso5G7hNxzkHOGoq+OiOhKCthOAR0aPzPkNlgKd58zqqQh11sNWLcR4oVzncxGe+FKlP+n9kOdeiqXT4tJ3Klut2crLsRcNugrLLltTN+5oCMenWgB44IDom+XJMwGMHq0+gBioRJgETpalQdPiPt1oyKmgomSizTMx8ksTBtGCaxpsebjBvDH+yLOeVKRsQfBRN+9RKR1hl4ADPVpIOaECIz6qwbqJkZxQB6aTVIWIuQBVZ+pIGZb5fJO/M55s+oLGyXsFCNwlYCJUSql7Pg7DBY0aL4z1qiwesFDooT9U/3po+tcKion5GiFPAnqrzzV6qfDvJl9E6+xEDW9V2erO7TXd+Gfa+Y1ixon3H+n0+VEWsOQPBIlZ1gdrToW0TXGylSqYCL4V9RIqXmXiDqliyowAWtKGDP6NqjtaC8SjOaosLX7LCTtkEErgYCNj/AuxcqugVewmrR01RPCI7KKMKVP3WV5exbDexn6kx07lccMtdygGDFRu3Ag5WCoGTGLiIAzfxsIME8JAIsWSCOJIgnsz+bKqBvoaRA79GLvzd1AlcQstWYiIeY5KYQTIxSCEOUomHNBIgnUTIIBNkkgRZZHbyGrRQQn5kQS81toDwqOpQBnkl7oUpIPmZ/EmgkNJcvqiwbs2uyNpOs5zzOVDkoAfTNoWTKmBrmu7kLKYWYxOboNJLPbRY+ZgHoEJNAZTVx06pwPYvdC/O5KmtVS8cNwMlVKu5xXlA+jcKlLI51wbKiMshHRZ8a+WszLavqNEceITFqz4yt7l1SgvnM+RxKANtnb4ZqCDYhg/4ILo7Zt067gtcavsKwmiVWWqkVMB7pCsQM5f4FRu20092uprkvi+RVj05RhOS1KfS59ms6PEEs1dcE9lX93dhKkcGp+5Ig25657pbroWicr2hziT4ZLNuzRmSZrAAIT0HLFq41irLqYLKEaKzUckK4FOedJiRGMW+nttAW0UOVKEwiCSElGftWsKoHgrJo6SZUCf85dakhLIgMX0SHlOj1ryDTT5KCKCni+Fv8+r213ZVzDIsfeN6QfZqbUiRc9xyAx01k2FnNtTR1OB219lOUpubWgDjViKhfoyt7TTQx6a6fOOIiizW3zSiMvdJMVFcDtRXzCPg1VBATm0uY5RkISwztVJvTWBZy6hKnN0dC+N/Yl7+RAbENcyFra057/Fsn610W+EII0Bt2d6W+7G1TGN78tbFM2PAJdE5lUksmYxPR13nqAJuOqW9vGtEOYDux2F7amo061MrpDJ6RgUynW4nonc0wCYT+wjQz8hwgACDJmyKQwTYycjQT4CACXuBwwQIMjIcIcCoCRvjGAHGGRlOEGDShM1wigDTjAxnCDBrwiLOEWCekeECoRbEEmYUaJeLpptJbPCYAiHjxtliGsTUGD1IgRjIgZhWZuIEakIctEAc9EAcjEAcNgkJ2AYSsAskYB9ILHMgfl95dvfpMVmn+XKCyaVtnW9V7kO+bxAoGoUVHYuVWKbeA0y08H2oTYzT8zAYtkfLaQOE7O7E84lxTsktDXQYGSc9QZT2Ljf/U1IEhR9WODkUNmTnfUNvTm3RUvClk/6X61JWETb+/zy7JPBMYHX+yhOX1hXFce/gG5ObCPufX/h3liFH1uhXwbdCketoybX+nX7TyvK9xjUj///a/7WxEtqlQQ4pCIVX5IhzbXHr2+FnaWldWXWshja/CTyzi7SQSsqukCE7t7aGr7tt7NmQs0bmtLutu/61czu4Pv7c7bHA51IcCBvnbk9l/d9/zS0jT9/i/v92Vt6nGUb65mbg2ltHw9jcsYodeW/lKlbx3T8NDjvRGUWRgZ+kr64iXJH255pKz5AQsj6NiO24Tvl28PqX1v3ur/5ZdWbG1vB1L3oM+TebWnktGJx9RQm73ZEP5cjMy7LnuumEpe3M7eCflGXHZmCzdUNZDt6txIf9//evRJxbw1ttx+WI/45F3glffOnQ2rfOpaKVewxjzekMBkNLqPpWHeGvjRWGOGSoIeTS5F2gQglpWCymUpCmX0L/2cDE8+HJSYTviTjXpkIRSvmXpl6kJdf1+XTH6s13pLFCpECxG4Xer3etOeaLvY96pdz/PcAFEn3b+0v9BdVi/4Xni4MFVd7H3b/tSwxw/P2//cvPG5dr66OfT3vt/fvF+7/dcfXV0nkWK8eIVeLg+ReIAwXVPwurdV76sKoncZ8o2DeUV2SessreSY/p1lWSBw/uTRi0f+Yf+zjGp/hOFa3nbcA8rdX9C9Jr/6oTa393nRKVraf68pwUZHL6bY8tS+oP6m9GJq63clDExul1Gu/nK2bc/nAgYXM6M7Tb1tUiQ9doVnpnwy1pxzlmuLznvSyXtqhDZjRCn/trvOb3/i8TAlbdxo4VH5vqsE/6TNBZlRZLy8JFfdnJG/P6JZI/+4zd1vYWBZaibvy9iDH75FRHxU+e2XRRKr0ioVUVLG9MZl68aOscVmFF/dYvOCnQvTifrsmir+mGm5o6LBPxaIBVHbZ1Xrw4mfmGRd8pm0Rz6VyRvjroXgadZ1X7fA2n9x76uqLypzOe20Dn4uHZn9amXeTGjp7i/0nOT3JP3Xmqn8jrFX53Oc8tNM01cV6vKM8e5mYTS67IOceSWVn9SI9pb9rojvU/lt/+RX8bd1g4P+XekoPKI2OP9Ijh9KvdlVvnE8cuGRc7Of/70z56dG75+XkufULXnmDgPjtVKW3zn/T37lDPxZr9z1zin082RlXxJ6KU8pcqX5bDybDO+3ux1joTzMlOxFZV54o0efCZ6kRb6kUCyYL4dYl7PrG92/lOp/0hXSNNeqv5rUbRrPBWk9miuz+0Z0YUTf/bSEgwv9W08tvNGqPLDdtDyuv4WqPr3W7sFbHQbSsFX6/IBADlfzf3vHBf9PuUCHdz/LcjPRHcPTdEnsCKch+3MZrM4JkZBjELYxwZySyDMZnfrwkxFms3aKocsRghSUXWhqBbhiTlpwIBIGDj6D2PTltrvpAU7m0AePqxa+X2Zb8d+b5LuFu4D4AEBvDwCI+XYUy4I58Yff84IHT9xPoWXuXUC3j1YC/jP3bllG6gPDq+QlhRr7APcUlzL6UqE+6Ift/6AQHfjgw7yb2Ns1g7vvSUkODAvQ1TlAfMkrCgSac3YJ8Ym7qLTM9cF12psyxWwqCMWQQFgxaDCRMWh1TzFg+7KywBGq7dWkyxNPLhLssCTz2zta7BsD2KA/FmALfRZzOL4MyqxWBh91u15rTlz+JlJGoJPC19a3FmaTnxPmVZlIw7t9ZnZNvgD51n0PY3RLhkrahdqS6f3bb/uEdUcubxLxWGmoC1j0dapIb77Hj1JlPP94H24q203P7GLc+CF7khCjQeuYw1UdZ4p7nR2Rm/nTsmlpzlxisFRBVEgYTPVSyHnrQbL1mVHEzGC5s9g3irPAu/Bk5kSbzaYEPL5V8DzhJ3yeG/8BSuLN2gGqGgV6l/oGaIXP6YlnCm0zzo2OIkdyr88EYHX0tnOoD30bdaUfk70fmjlfqNk2wV62lf0U2OznCxJeIJ9oANzQ54ublFkGHl0cVBHmtHrbSJPS7IjkhjEUDl1JA32V08/BhWNZbGciFTDmO0XnVR87A/7NhKj+ha79PFyksdKLCtIp1mH1LbjGa1aGTzyUSBlO2Q681Bp4Zbb1Ew9EI3NNydfjR3F7EWkgrjTv0rIypsTyDBzlCu/ydJdtyj6fRkum3wamPditDCi4iWacBM75BSx28pA3zUL2jC1Db5RZQeJWcuFoh2vKqHkVOnH249oFEK0jRyuEMGD5qxQINNmuVftaIOtBjUG8veti4DiOh+Bo8YSttiaq4H2LFpsaSYFGVrQEVjnYUZnVjjXtSbh/hRhihXK9yhPccjau9ppD9Vwfnmd2kpqnNl3ukWGn1f8kqJrcb/lihUMZJS0pbWdYen8QxxxONOCCSSiSQyk0wKqaSZLtBEtzvjDt3Z5/a+ni8qDPsj4sQ08HrhNi4SlzGynUKFMEV6FYrFfFzh5Yo3tRd/HkoW0cGJSU9ZrXlbEE8LyGnHlC76A2Be3/0eLU8aruqMzYafER8WKMP3L4VvqAcL5vtjInW997agHv9uo5fDH7BYXYGwkAcAAAA=) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAABHYAA4AAAAAH7gAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAHnAAAAE4AAABgRbpbgGNtYXAAAAfsAAAAogAAAar/FJbOY3Z0IAAADoQAAAAKAAAADAAAAABmcGdtAAAIkAAABYwAAAuX1RTb8Gdhc3AAABHQAAAACAAAAAgAAAAQZ2x5ZgAAAUQAAAVKAAAHzrxbewZoZWFkAAAG6AAAADYAAAA2EIN07WhoZWEAAAd8AAAAHwAAACQGBgH2aG10eAAAByAAAABbAAAAbD0F+5psb2NhAAAGsAAAADgAAAA4GmscjW1heHAAAAaQAAAAHwAAACAArwv5bmFtZQAADpAAAALCAAAG50zL6Ldwb3N0AAARVAAAAHoAAAC6UaNkMnByZXAAAA4cAAAAaAAAAH/i0Eg6eNqtVWOcJMkTzcjMyiw1Sj3asdZo7uxgrcFitP7btm3bONu2bX86W2uruvYiu/vD2RHlehUvX0T8ogglaULILTQgjEiiXyg4EDpzSsbJOJ0ZpzX9j4+l0zQobk7DuQTIveEAvVI7jTQQcb5DYeYU8GVrZ0cnYR25bMGFfKGQSQW+FNRJem5Vil4pGnlDV3TbDClnQL6rgTcK6/or52182gpHmeDVvTBGe1Z942vDtBvGequ5YNy+rXhV9PXo+iMk+ttWmyBrC7LGkbUOWX2OrO1JyOYzmapUFfEUHQUhZWtLRy5fIHBG9A09nkBWyCvW6DZkTSTkjG5oOsxq4Dc6R9ro9OKNw1/7+uriDdHpSMv1GUPwI8VVCAfYw8gVIJdBkMtrUdLypJDPpFNSMIFpkmK1lQDGvkC1pO2A+GNjdO2G6BEuwwHX5NQw2pntWm704+HwjJ3hXm6pyPtRBcfIEiNDKbLTHLQ6mWA/xO6+OxwwPti3v75PIWdX1lCFyHg5y6K1pbMDOkgnzaHyVFUKUqTKZQ8nzYTk0SMbomsb/5a0Y4JD6waY2/j38BNW0uLM2slGh+F3uh2nBg/37gzPGI6+jAxWOADVlbUwUGvJNTvNuYxjQSzafbf2ub59x/bpTyHyJ7jqzyByJSKbFRJUwTtwY1Sd0bP5fKHknqtOhUwVlgR7QLlgVB1lnEpZlUrh5vkBntSujgH9jGiIf+g7rgZo9kcW2wCU63Nn5WOAprXfmGwQ1Gyr/aDPSw8SH1/JbEkNZ+wLSfUNB/+DtW0mDVcLMfH7A0E3OLDAXPHjdsmZrzPe3L14xIQF4PQE/x6TIpGklLv+8g/4s6Pt0Y6eYPG3JlPBgRmTv78s6Il2zhy402H0A8t9l1OaVNX4aSUDSzEDHaoabjbfTStiPJSBjk2IIpXLimDVjr00W8mMWz4VCipfmDf0n2q2Fk984NuuAJTsfKq9WjLg2pzJCxMUnwj32x9IxJOCS07/UQMUYtmq9kkzff/yOryp+Uecar9oQMnf7a/qjXZE18S/MT7B4iJmou76Gcs3xaOrox29Vf3fnSi4KYUhGMDw7xz6teTK+fUNTTWG+eHjHfpV53fDgqPKIyHNaiczTjxUaXJUyURboaDxjC9lS1tri8ax7NyEz1x2GXwWnXOt2MNZ9N/o/4xzuoGNTZk6Ogae94uFCz1P5Q3oR7Tj6FbSjhFlqd87y+nIpMtJy6TxuqrUKNjcyltbpLDMj/i//Eqmq9se+uH6OdMKx+8LmPn10/5or7eHfry+a7p6QD/SzJq0KQkd9PZaXa6SzVprzgaQHaU7ZD+0lmYJe7keeB09h9a+XBAvdr+xIDi0iX7kSPRyPfC29Bz65PsgCMgXw34WYhfWI3udp9ixj7KlTuvo7CwUvGx5QlX5ROKwgFPoQ9AkHa4JGRscuhdCKmxhQ/EBzgI7HAROgWWtCUJqeuw73w5nM/1TmmlKfd9N3FDV24dd34182sunVbOzDxZHB0uzat9jlTmySqFePkdaHQsW95VmiNH8BrEyGG1fH0gVat9jfeT1YoFC5cDtiy4Pf20040RC1A/CfvoHRKUQ5WqIKuQ8t6Q8CBj1PS/wVfbZDza/SK1kzHkeza1O0Bd3ObSf9vOEG9OLVxSvEsWrilcacSfBab9i/wCu8YuVmWuX534OI2cZDtxyiTE0o1J8vwEjvgCG71j0xc2bN4MeDjQYdCFdIOgCuihGaSrBixcVL3KKFxYvgAShBA2mko9V/rBa+Q87K5cJMrh/rGzkbeOAKPuYwpXzWcaody8Bug6YdwAAeNpjYGRgYJBmCGBgYgACMCnAUA4kpbingwQAFRABtAAAAAAWABYAFgAWAFEAhwC0AMkA+gEPAZACAwIDAiwCawKUAtMDCwMeAzEDRANXA4MDsQPFA9kD5wABAAAAAQAAd4gR/V8PPPUACwPoAAAAANiymQoAAAAA2LKZCvpY/EoFpwWqAAAACAACAAAAAAAAeNpj+MVgxAAEjL4MDEA2A9MDhotArMQiwmDOJMDwHUhbAGlupncMTUDcDFLDuuT/H9YlDIxADRFAHMv8giGfyZ3hGxBzQ2iw+jogjmPUYWAAYYYUBgYASjgYwQB42mNgZGBgXfXHiyGKdcmviP9vWJcDRVCBNACq/gb/AHjaY2BiWs04gYGVgYGpi2kPAwNDD4RmfMBgyMjEgAQaGBjeCzC8eQvjB6S5pjA4MCi8/8+s8N+CIYp1FfM2BQaG/jhmuBYFBkYALwQQzQAAeNpjYGBghmIZBkYGEFgC5DGC+SwMHUBajkEAKMLHoMCgyaDPEMtQzVDLsIDpGNMdZmYlKWVu9Zfv////z8AAlNcAykcjyTMB5TnUX7z/C1Tw+P+d/9f/r/nf/7/vf85f979Gf3nvfr/LdUNPQBpoGwHAyAbEMDYTkGBCVwDyAgSwsIIpNgbiATsHJ155LgZuBmoAQQjFQ4IWXj4YCwD1UyhaAAB42qxV5ZrjyA4th5phGHxBnpr07ZuUPcxsx8nwNH6fa9Fu+r28+wx+GjnL//bR9shJc/dyQ1SlUklHR1KFlSFWq0lsiV79pKYXX3Fj+b2Eb7o8b9MtylcTrjSzn0fVqFpf12uu57GyrCLd6StHRWnos2OY0i2fK4Y2iH9Z4Nrce/15ZzyK1+Ol9xNPe26eEC8sJB4/tS7xXVndtZaKgVG2wfNQDXfEV+X8KizhLCGAyDPi8YUkhYbkbFxWt2V1O3VTa63LTttazWoh2bTW56oh+Kk1MwCqRwsJ13XIDR0CvmUn9blmNHDRRlFfC0lOBsHlk1Uar3O15UEfUU45fBdX602ktZikC262ZBNtcfp0OcGRi6S2I/tcNzwStfuqMqCmga0ONbHSYcaVtS121hGf6y2fRwwJyIlo/aeaWiPxwE9TKyZppwQ5avojEyqKw5a3Q/aY2U/+eOkFODT0yDilONcZbQyZUq6wyeQC5DZKrjZ11hmEmDjmOl/GLYVbR12aNGVC/Ynxapx4rvZsy/N5yhSVSswbWcfnaQNDIp6MXsp1LHRoeUp2S9hNYefzDNzMlpQQGFhHXJ6OUspT4mmQ5vOsebWSFLWNjr3MU5v6G59PmFeLyavlgdL1oD9V6k+aQs1Eq0kxMxOxk4U805YmReuGxaR8TOGDnbOakMdCUgh5yDbMcyrDtjyNa9trd3COK/gvNRaZ9IC/B+3+Uh1TwEKpUxpsRawe9x3HKWt1yqhCVeKVhGd0SDFP6JDHwW8aUorw38/OOmpahWGeFicbbf6y7V4CTaeR26m2z2dM4Yg8C55FnjNFVeR5U9REXjBFXeRFUzREuqYYEfkvU4yK/LcpxkT+31DAzoc+t8rFpz63y8VnPv/HKJ5q/wWM/wXG/8A3AaNIDxhFXgJGkRoYRV4GRpFNYBQ5B4wi/weMIueBUaQx9LBsNd8g7GxKkcY2knJAspF+Cwz7bfYxSVcMUY+OqYTO7mp5xn7TAq3k89Wd8jhn+UqrqDtn4uSqLRO8VjJz7PF1Q7dKvDdg58SHg2DCEPxovTr7nZKfzmN9t7junEFGN5E/9Y7ByyrK7vp8ywTnHvp8+/dM2YnWYX4HJVFnmxRQj5WWzn6R5z3d0xkla8ifHUz0bcc5cxrx7xqgwoDgrzThsai9mQea6GEOX/d2jykY+OCaDsWKOJV5f7qYfFuhKrnfVuaqF20ob+BoRLkurXUX04dqHkBLYGPw2FeidENzNco2FhJsMhfrVN6gg3cyTQg9p7uooUaELvKCKKOkdFQQLVE0TlJIrqOh6oe8wqNk1CxB4HNh8MrtxkLJ7wsHBE19bsiBfghqHogaueoQZ13dk2BSrYeiLxMYMqpWkoAeas+FZlsJZ7uUN5rYvdj77Tso1FEdPKyMljZ+NEQQbZcmla/ngylul/Kx0RQIa108zA9tUATOaQzgkx31wl710/3WR9o8M3y3faTT0PC9do7A0ixAe9gGZQk4gGm002Fgd6cFNVo90HeH7jp4NPCG/4VW7P1T3Sfws7uApfGE7Km3Z4cYYyFjO/+u5O/pIQH67v6Ue0j5zGA4+0rm8FTANzGLz4/RvzCFck6f4ltYvzR8B+KVsBaDV+rmQPFrj/WAHEEABFA0xj1STOcCsb22OWv7WIMLbv9R8XXVH9Pf7L9wO5p/yojY+p5RRBWHICb24QGIKw5BguZDkaQBKRqQpgEZmhdFlgbkaECeBhRo3hRFGlCiAWUaUKH5VFRpQI0G1GlAg+ZV0aQBLRrQpgGGmLfhae4wmI+qrqsnVY8zw/CsQ1/Mu7AeMLj1ELn1CLnpWMz7MJ0wuOkUuekMuelczIcwXTC46RK56Qq56Vqcy5Oj4Ofp9dq8MMzjq/gu+Kbc7AERbE1geNpj8N7BcCIoYiMjY1/kBsadHAwcDMkFGxnYnDYyMGhBaA4UeicDAwMnMouZwWWjCmNHYMQGh46IjcwpLhvVQLxdHA0MjCwOHckhESAlkUCwkYFHawfj/9YNLL0bmYC6WFNcAJhIJBt42mNAAgAADAABAAB42kzMtYFCYRAE4PntDncPsQYgxiF/ORFWChWgIW4VUAp1kOODbPStDYCI8EDgVRZACzhh0RL/aNIKKbRpjSD6tIEbU/rvZ+4WOaxpDxLiRPt+8v3PfAWh7QDm4kwLROSQlvDIA63QkEdaIyuvtEFCZei/n7lb9lSR9iBvVrTvJ9//yK/eWqPCnsSBIPo+91fMR0nKUpAPSowJOUNCIBLFGL+ZtYx0tZSmu1D11984cB7cSc67XDbbfXl9897s7LJ8rdw8C3SUNqiTJKfNTtJO6IK9mxc0TR0XKcc0LFIT/Spud9/FJzTKbEH91M548TqyN3x3P3VvfHzN81Vuq8GyCINlNWfqmIR6tKNobiWfULdcebcsKDGJ6R7oMv60TTo6q+vaLGzInuyLkeTzxpda3xY+C2U3zKY4jmoXMrpmz9WaZ/R+Ibq0C969iomim8z5zc/p8jHUtmISIncpF17KVsWMKwoZ03Q4pknJxUY83ghi+nHltmkbMftZS3ZtXW4fcibtxNKgf0U29KIshLLXavm0cmXwxrv8veXWZDA+/AffsESJV1RwmCNDAOEIKRpydpDIOkVTUVs24QIMr9oChClSwSw4lW8szFCxQfRH5za6H84nwo1EY9W1j1TQDIyF1I8E3wi+w73kObwJPsY1WFxXyGElYSBZBYKelfCsGUY77oEOeDT3Xb6ougXL18NpJkmG0d39y1nGX5+m+pyh1mWwgEUQ/yc5X2C2dz5H4z9OfT/xeauye5rd5BiRKJ32RToxr3Nag0VPHy9EuISVaj74KkacIuEzYfxe5VTQo6Ba34FBW0UuZ6pz89u0leCZ5pN2xFo9xFjOCUrV7jqP9xxi0G+v3IbRrZ19mkuwWMt2wls8yFe4nZlYTezjSnFAD5HwQVYpuCXLI9V3KxEEG03PP6bcwkTqx/9S8x3ziVjpAAB42m1JxQHCQBCcucMdvhSBu2sXuLtXQC30BM1gyT6zMgoFYz53JGE1UQCEgoYXPkRQRQ119DGkwhMvatrwoJ0OOumimx566aPfeduv4vFG3OBUPOm+rrbT2eSwG/+TZCqeFy4IN4SbBuc6eWGj73S7beGOcPcL1/sicgAAAAEAAf//AA8=) format("woff"),url(data:font/ttf;base64,AAEAAAAOAIAAAwBgT1MvMkW6W4AAAAncAAAAYGNtYXD/FJbOAAAKPAAAAapjdnQgAAAAAAAAGAAAAAAMZnBnbdUU2/AAAAvoAAALl2dhc3AAAAAQAAAfsAAAAAhnbHlmvFt7BgAAAOwAAAfOaGVhZBCDdO0AAAkUAAAANmhoZWEGBgH2AAAJuAAAACRobXR4PQX7mgAACUwAAABsbG9jYRprHI0AAAjcAAAAOG1heHAArwv5AAAIvAAAACBuYW1lTMvotwAAGAwAAAbncG9zdFGjZDIAAB70AAAAunByZXDi0Eg6AAAXgAAAAH8AAgAyAAAAyAIVAAMABwAItQYEAQACMCszETMRJzMRIzKWZDIyAhX96zIBsQABANH8SwK9BaoAHgAGsxECATArARQHIycmJwADJjU0NxIBNjc3MxYVFAcGAhEQExIXFgK9Bh8EHjn+yi8HBy8BNjkeBB8GC8O9QFzkC/xUAwYEGD0BVQI8UHZ0UgI7AVU9GAQGAwQMyv2+/nX+w/8A/pTtDAAAAQAi/EsCDgWqABsABrMUBAEwKyUQATQ2MzMXFhcAExYVFAcCAQYHByMiJjU2NwABrP52CA4PBB45ATYvBwcv/so5HgQPDwcvOwEg+wMZAYoIBAQYPf6r/cVSdHVR/cT+qz0YBAQIL00BgAAAAQA3/EsD3AWqABUABrMJAAEwKxMiJjU0NzYANzYzMhYHBgMGAAcABwZRCw8BAwNuAgUQDBEBBo8f/sFb/t0EB/xLEgoEAgkJJQMMEgsS/oFS/Kzx/PUECwAAAQD3/EsCBAWqAAcABrMBAAEwKxMRIRUjETMV9wENz8/8SwlfPvcdPgAAAQA4/EsD3AWqABcABrMOAgEwKwEUBiMiJyYBJgAnAjU0NjMWFxYBFgAXEgPcEAoPBwT+3Vv+wR+UEAwNBgQBI1sBPx+V/GYLEAsEAwvxA1RSAYwIDA4CCQT89fH8rFL+cQABAAv8SwEYBaoABwAGswMBATArEzUhESE1MxELAQ3+888FbD72oT4I4wABAIL8SwJqBaoATwAGsyEBATArAQcjJyYmJyYmAwInJiYnJicmNDY2NzY3Njc2ExI2NzY3NzMXFRQHFAcGBwYHBgYDAgYHBgYHDgIHBxcWFhcWFhMUFRYXFhUWFxYXFhUWFQJqBh4OYHoSBQEBAQEMYkUMAQECBAg/MTYNAQEBAQUlxRAeBgIKJBpfFAQBAQEBBQ9lTwMMBwIJEVVuEAUBAQEEARRfGiQKAvxRBgYofUsVOwERAUIKToElBwQDFAgDBCE7RVMKAUIBETwVmVUHBg8QAgIEEhRJXhQ4/u/+8DwVRXgqAgYEAQMJKn1IFTz+8TBLzREDAl5JFBIEAgIQAAABAIP8SwJqBaoARwAGsyYCATArEjQ2OwIXFhYXFhYTExcWFxYXFhYVFAYGBwYHBgcHAwIGBwYGBwcjIiY9AjQ2NzY3Njc2Ejc2NzY3Njc3JyYnJgInJicmJ4MFDAUOD155EgYBAQECEWglGAcDAQQFOipDDwIBAQEGEnleDw4QBgQHBAKWGQECAQ00FyUpMBQUuxsBAgEZlg4CBYYeBgYoe0oXPf7w/sAOdlYcCwQGDQoHBAMdL0ldDv6//vA9F0p7KAYECgcGCQYDAQFSjBECdBBPQR0eIBkJCmGjEQJzEYxSBgQAAAH//AI0BacDBAATAAazCgQBMCsDBiQ3NwUEMxQHByIkIyIFBCMnJgQKAWq6ugFrAWsBBAQF/TwEA/6b/p0DBAQCWwNVKyxUVQETE4ZDQxMTAAABAAECYgWiAu0AJQAGswcAATArEyc0Njc2NzYzMhcWFxYXFjMyNzYzFxQHBgcGIicmJyYnJiMiBwYLCmIUh3IzOTsMTX9aOi03o/YVAwp1qo8MWgxNgVo5Ljej9hUCYiEDIAUrDwgBCCUaCAdQByEFIzUMAQEHJhoIB1AHAAAB+lgCNAADAwQAEwAGswoEATArAQYkNzcFBDMUBwciJCMiBQQjJyb6WAoBarq6AWsBawEEBAT9OwQD/pv+nQMEBAJbA1UrLFRVARMThkNDExMAAfpdAmL//gLtACUABrMHAAEwKwEnNDY3Njc2MzIXFhcWFxYzMjc2MxcUBwYHBiInJicmJyYjIgcG+mcKYhSHcjM5OwxNf1o6LTej9hUDCnWqjwxaDE2BWjkuN6P2FQJiIQMgBSsPCAEIJRoIB1AHIQUjNQwBAQcmGggHUAcAAQBv/EoD/AWqAB0ABrMbEwEwKwEmAic0BwYGBwcmJyc3NxM0ADc2MzIWFxQABwYjIgGoAtsBIAcRBAUGBw1MTdEB/AIGDAYMAf3UBAMVDPxMAQQCAQM0CxwGBwUIDXp5/DgDCGgFCgoHCPbGBAkAAAEA9vxLAjsFqgAFAAazAQABMCsTESEVIRH2AUX++fxLCV8+9t8AAQAL/EsBUAWqAAUABrMDAQEwKxM1IREjEQsBRT4FbD72oQkhAAABAPb8SwI7BaoABQAGswEAATArExEzESEV9j4BB/xLCV/23z4AAAEAC/xLAVAFqgAFAAazAwEBMCsBETMRITUBEj7+u/yJCSH2oT4AAQB+/EoCjgWqABYABrMSBQEwKzc1ExI3NjMyFhUVAwIUExMVFAYiJyYDfuvqAgsQDRHo6OjoEhgPAuryEQJKAkoEDxINCP28/b4G/b79vQkOEQ8EAkoAAAEAXvxLAm8FqgAXAAazDAABMCsTIjU1ExI0AwI1NDc2MzIXFhMTFQMCBwZ9Hujo6OkBCRQRCwLq6+vrAQj8Sx4JAkMCQgYCQgJEDQICFg8E/bb9thH9tf20AQ8AAgAAAAABLABkAAMABwAItQUEAQACMCsxNTMVMzUzFWRkZGRkZGQAAAIAAAAAASwAZAADAAcACLUFBAEAAjArMTUzFTM1MxVkZGRkZGRkAAABAAAAAABkAGQAAwAGswEAATArMTUzFWRkZAAAAAABAAAAGwBQAAIAAAAAAAIAAAAQAHcAAAAaC5cAAAAAAAAAFgAWABYAFgBRAIcAtADJAPoBDwGQAgMCAwIsAmsClALTAwsDHgMxA0QDVwODA7EDxQPZA+cAAQAAAAEAAHeIEf1fDzz1AAsD6AAAAADYspkKAAAAANiymQr6WPxKBacFqgAAAAgAAgAAAAAAAAD6ADIAAAAAAU0AAAD6AAAC4ADRAuAAIgQUADcCEAD3BBQAOAIQAAsC7gCCAu4AgwD6AAAFpP/8BaQAAQAA+lgAAPpdA+gAbwJHAPYCRwALAkcA9gJHAAsC7gB+Au4AXgEsAAABLAAAAGQAAAABAAAFqvxKAFoFpPpY/+wFpwABAAAAAAAAAAAAAAAAAAAAGwACAqsBkAAFAAACigK8AAAAjAKKArwAAAHgADEBAgAAAAAAAAAAAAAAAIAAAO8QAOztAAAAAAAAAABQZkVkAEAAIO//AyD/OABaBaoDtiAAAI9eAwAAAAAAAAAAACAAAQAAAAMAAAADAAAAHAABAAAAAACkAAMAAQAAABwABACIAAAAHgAQAAMADgAgACkALwBdAHsAfQCgAsYC3AMDIhojCyfp7////wAAACAAKAAvAFsAewB9AKACxgLcAwIiGiMIJ+jv/f///+P/3P/X/6z/j/+O/2z9R/0y/Q3d990K2C4QGwABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBgAAAQAAAAAAAAABAgAAAAIAAAAAAAAAAAAAAAAAAAABAAADAAAAAAAAAAQFAAAAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcICQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ4AAAAAAAAAAAAAsAAsILAAVVhFWSAgS7gADlFLsAZTWliwNBuwKFlgZiCKVViwAiVhuQgACABjYyNiGyEhsABZsABDI0SyAAEAQ2BCLbABLLAgYGYtsAIsIGQgsMBQsAQmWrIoAQpDRWNFUltYISMhG4pYILBQUFghsEBZGyCwOFBYIbA4WVkgsQEKQ0VjRWFksChQWCGxAQpDRWNFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwAStZWSOwAFBYZVlZLbADLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbAELCMhIyEgZLEFYkIgsAYjQrEBCkNFY7EBCkOwAGBFY7ADKiEgsAZDIIogirABK7EwBSWwBCZRWGBQG2FSWVgjWSEgsEBTWLABKxshsEBZI7AAUFhlWS2wBSywB0MrsgACAENgQi2wBiywByNCIyCwACNCYbACYmawAWOwAWCwBSotsAcsICBFILALQ2O4BABiILAAUFiwQGBZZrABY2BEsAFgLbAILLIHCwBDRUIqIbIAAQBDYEItsAkssABDI0SyAAEAQ2BCLbAKLCAgRSCwASsjsABDsAQlYCBFiiNhIGQgsCBQWCGwABuwMFBYsCAbsEBZWSOwAFBYZVmwAyUjYUREsAFgLbALLCAgRSCwASsjsABDsAQlYCBFiiNhIGSwJFBYsAAbsEBZI7AAUFhlWbADJSNhRESwAWAtsAwsILAAI0KyCwoDRVghGyMhWSohLbANLLECAkWwZGFELbAOLLABYCAgsAxDSrAAUFggsAwjQlmwDUNKsABSWCCwDSNCWS2wDywgsBBiZrABYyC4BABjiiNhsA5DYCCKYCCwDiNCIy2wECxLVFixBGREWSSwDWUjeC2wESxLUVhLU1ixBGREWRshWSSwE2UjeC2wEiyxAA9DVVixDw9DsAFhQrAPK1mwAEOwAiVCsQwCJUKxDQIlQrABFiMgsAMlUFixAQBDYLAEJUKKiiCKI2GwDiohI7ABYSCKI2GwDiohG7EBAENgsAIlQrACJWGwDiohWbAMQ0ewDUNHYLACYiCwAFBYsEBgWWawAWMgsAtDY7gEAGIgsABQWLBAYFlmsAFjYLEAABMjRLABQ7AAPrIBAQFDYEItsBMsALEAAkVUWLAPI0IgRbALI0KwCiOwAGBCIGCwAWG1EBABAA4AQkKKYLESBiuwdSsbIlktsBQssQATKy2wFSyxARMrLbAWLLECEystsBcssQMTKy2wGCyxBBMrLbAZLLEFEystsBossQYTKy2wGyyxBxMrLbAcLLEIEystsB0ssQkTKy2wKSwgLrABXS2wKiwgLrABcS2wKywgLrABci2wHiwAsA0rsQACRVRYsA8jQiBFsAsjQrAKI7AAYEIgYLABYbUQEAEADgBCQopgsRIGK7B1KxsiWS2wHyyxAB4rLbAgLLEBHistsCEssQIeKy2wIiyxAx4rLbAjLLEEHistsCQssQUeKy2wJSyxBh4rLbAmLLEHHistsCcssQgeKy2wKCyxCR4rLbAsLCA8sAFgLbAtLCBgsBBgIEMjsAFgQ7ACJWGwAWCwLCohLbAuLLAtK7AtKi2wLywgIEcgILALQ2O4BABiILAAUFiwQGBZZrABY2AjYTgjIIpVWCBHICCwC0NjuAQAYiCwAFBYsEBgWWawAWNgI2E4GyFZLbAwLACxAAJFVFiwARawLyqxBQEVRVgwWRsiWS2wMSwAsA0rsQACRVRYsAEWsC8qsQUBFUVYMFkbIlktsDIsIDWwAWAtsDMsALABRWO4BABiILAAUFiwQGBZZrABY7ABK7ALQ2O4BABiILAAUFiwQGBZZrABY7ABK7AAFrQAAAAAAEQ+IzixMgEVKi2wNCwgPCBHILALQ2O4BABiILAAUFiwQGBZZrABY2CwAENhOC2wNSwuFzwtsDYsIDwgRyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsABDYbABQ2M4LbA3LLECABYlIC4gR7AAI0KwAiVJiopHI0cjYSBYYhshWbABI0KyNgEBFRQqLbA4LLAAFrAEJbAEJUcjRyNhsAlDK2WKLiMgIDyKOC2wOSywABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyCwCEMgiiNHI0cjYSNGYLAEQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwAmIgsABQWLBAYFlmsAFjYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsAJiILAAUFiwQGBZZrABY2AjILABKyOwBENgsAErsAUlYbAFJbACYiCwAFBYsEBgWWawAWOwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbA6LLAAFiAgILAFJiAuRyNHI2EjPDgtsDsssAAWILAII0IgICBGI0ewASsjYTgtsDwssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbkIAAgAY2MjIFhiGyFZY7gEAGIgsABQWLBAYFlmsAFjYCMuIyAgPIo4IyFZLbA9LLAAFiCwCEMgLkcjRyNhIGCwIGBmsAJiILAAUFiwQGBZZrABYyMgIDyKOC2wPiwjIC5GsAIlRlJYIDxZLrEuARQrLbA/LCMgLkawAiVGUFggPFkusS4BFCstsEAsIyAuRrACJUZSWCA8WSMgLkawAiVGUFggPFkusS4BFCstsEEssDgrIyAuRrACJUZSWCA8WS6xLgEUKy2wQiywOSuKICA8sAQjQoo4IyAuRrACJUZSWCA8WS6xLgEUK7AEQy6wListsEMssAAWsAQlsAQmIC5HI0cjYbAJQysjIDwgLiM4sS4BFCstsEQssQgEJUKwABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyBHsARDsAJiILAAUFiwQGBZZrABY2AgsAErIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbACYiCwAFBYsEBgWWawAWNhsAIlRmE4IyA8IzgbISAgRiNHsAErI2E4IVmxLgEUKy2wRSywOCsusS4BFCstsEYssDkrISMgIDywBCNCIzixLgEUK7AEQy6wListsEcssAAVIEewACNCsgABARUUEy6wNCotsEgssAAVIEewACNCsgABARUUEy6wNCotsEkssQABFBOwNSotsEossDcqLbBLLLAAFkUjIC4gRoojYTixLgEUKy2wTCywCCNCsEsrLbBNLLIAAEQrLbBOLLIAAUQrLbBPLLIBAEQrLbBQLLIBAUQrLbBRLLIAAEUrLbBSLLIAAUUrLbBTLLIBAEUrLbBULLIBAUUrLbBVLLIAAEErLbBWLLIAAUErLbBXLLIBAEErLbBYLLIBAUErLbBZLLIAAEMrLbBaLLIAAUMrLbBbLLIBAEMrLbBcLLIBAUMrLbBdLLIAAEYrLbBeLLIAAUYrLbBfLLIBAEYrLbBgLLIBAUYrLbBhLLIAAEIrLbBiLLIAAUIrLbBjLLIBAEIrLbBkLLIBAUIrLbBlLLA6Ky6xLgEUKy2wZiywOiuwPistsGcssDorsD8rLbBoLLAAFrA6K7BAKy2waSywOysusS4BFCstsGossDsrsD4rLbBrLLA7K7A/Ky2wbCywOyuwQCstsG0ssDwrLrEuARQrLbBuLLA8K7A+Ky2wbyywPCuwPystsHAssDwrsEArLbBxLLA9Ky6xLgEUKy2wciywPSuwPistsHMssD0rsD8rLbB0LLA9K7BAKy2wdSyzCQQCA0VYIRsjIVlCK7AIZbADJFB4sQUBFUVYMFktAABLuADIUlixAQGOWbABuQgACABjcLEABkKxAAAqsQAGQrEACCqxAAZCsQAIKrEABkK5AAAACSqxAAZCuQAAAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbEADCq4Af+FsASNsQIARLEFZEQAAAAAAAAAAAAAAAAAAAAAFgEOAAEAAAAAAAAAUQAAAAEAAAAAAAEACwBRAAEAAAAAAAIABwBcAAEAAAAAAAMAIwBjAAEAAAAAAAQAEwCGAAEAAAAAAAUADQCZAAEAAAAAAAYAEwCGAAEAAAAAAA0BMwCmAAEAAAAAAA4AGgHZAAEAAAAAABAACwBRAAEAAAAAABEABwBcAAMAAQQJAAAAogHzAAMAAQQJAAEAFgKVAAMAAQQJAAIADgKrAAMAAQQJAAMARgK5AAMAAQQJAAQAJgL/AAMAAQQJAAUAGgMlAAMAAQQJAAYAJgL/AAMAAQQJAA0CZgM/AAMAAQQJAA4ANAWlAAMAAQQJABAAFgKVAAMAAQQJABEADgKrQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgRGVzaWduIFNjaWVuY2UsIEluYy4KQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggS2hhbiBBY2FkZW15S2FUZVhfU2l6ZTNSZWd1bGFyRm9udEZvcmdlIDIuMCA6IEthVGVYX1NpemUzLVJlZ3VsYXJLYVRlWF9TaXplMy1SZWd1bGFyVmVyc2lvbiAwLjAuNENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBEZXNpZ24gU2NpZW5jZSwgSW5jLiAoPHd3dy5tYXRoamF4Lm9yZz4pCkNvcHlyaWdodCAoYykgMjAxNC0yMDE4IEtoYW4gQWNhZGVteSAoPHd3dy5raGFuYWNhZGVteS5vcmc+KSwKd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgS2FUZVhfU2l6ZTMuCgpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuClRoaXMgbGljZW5zZSBhdmFpbGFibGUgd2l0aCBhIEZBUSBhdDoKaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkxodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTABDAG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMgAwADAAOQAtADIAMAAxADAAIABEAGUAcwBpAGcAbgAgAFMAYwBpAGUAbgBjAGUALAAgAEkAbgBjAC4ACgBDAG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMgAwADEANAAtADIAMAAxADgAIABLAGgAYQBuACAAQQBjAGEAZABlAG0AeQBLAGEAVABlAFgAXwBTAGkAegBlADMAUgBlAGcAdQBsAGEAcgBGAG8AbgB0AEYAbwByAGcAZQAgADIALgAwACAAOgAgAEsAYQBUAGUAWABfAFMAaQB6AGUAMwAtAFIAZQBnAHUAbABhAHIASwBhAFQAZQBYAF8AUwBpAHoAZQAzAC0AUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMAAuADAALgA0AEMAbwBwAHkAcgBpAGcAaAB0ACAAKABjACkAIAAyADAAMAA5AC0AMgAwADEAMAAsACAARABlAHMAaQBnAG4AIABTAGMAaQBlAG4AYwBlACwAIABJAG4AYwAuACAAKAA8AHcAdwB3AC4AbQBhAHQAaABqAGEAeAAuAG8AcgBnAD4AKQAKAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABjACkAIAAyADAAMQA0AC0AMgAwADEAOAAgAEsAaABhAG4AIABBAGMAYQBkAGUAbQB5ACAAKAA8AHcAdwB3AC4AawBoAGEAbgBhAGMAYQBkAGUAbQB5AC4AbwByAGcAPgApACwACgB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIABLAGEAVABlAFgAXwBTAGkAegBlADMALgAKAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoACgBoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAAACAAAAAAAA/4MAMgAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAABAAIAAwALAAwAEgA+AD8AQABeAGABAgDYANkBAwEEAKUBBQEGAQcBCAEJAQoBCwEMAQ0HdW5pMDBBMAd1bmkwMzAyCXRpbGRlY29tYgd1bmkyMzA4B3VuaTIzMDkHdW5pMjMwQQd1bmkyMzBCB3VuaTI3RTgHdW5pMjdFOQd1bmlFRkZEB3VuaUVGRkUHdW5pRUZGRgAAAAEAAf//AA8=) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(data:font/woff2;base64,d09GMgABAAAAABOkAA4AAAAAK0AAABNOAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAg0oIDAmXFxEICqMImjABNgIkA4FYC24ABCAFjWcHg0gMfxuEJbMRNmwcgDjwu2D+6wRuyIS/gdU5iWtyulgw1Wzdm4nbqVapRINEcSR3Ou/GgoE733BULv21sA8bIcnsEW7WzCZZEoIEOCqalqtTDopWhZYqUHGs4qf6ZtZ7NT/Twv+jrZ8VJXiQGx5iWcS+DJY1VBI0s1bUFPV01cngVUcFD/Q73zdmcjIxSRp1R6mQuqY2Q3PpXct3/8NACcBVDgNl1BRz2TixNGB2CIESq80X+h8AtjD81++n/yVcVoQ7+wJ7jMqdeqSP4xsj61wH5+VF+WCE4xjTj+CUkas6+T+bZvtndscw1e1Rkg430HEPABVQ03x9afbt7EhsWEsBSSGSbNb5SNLLkxTGkqGSHUAumqtC2LmpU1RpihTl2ZClJQ/Ezlpd+I5tG84u1F66ORIjod0Lr+8CCMPhhcABkLPJ0wBw7vHB8XuwBQLHHe8A+E+Cv/+Bz9Ox10ehivwvMVraAv3Zp+yPMsAFwwych2S7FhpMStIBeNng4rBw55eZTcYCBVmeFYZsttWN5FXyNcNkJplE032mx3L++B5/CPy31AFGZLnAnQ4w4vCma6p//x5+6PjvxPyX4Cdf+8y9LnC+mRONJ4pOqL85NKP8evPXDeT630oXj/2XXGvrEJCACoyapRMBQK/eOZaD64jC+UgreAGOcSVsgtStHUGggkNTa+BHughmAcE0ztLjP6DpfAx9+JBwnJD7Vlbqgq8Qb//yxQSauc2c90AfUGujHhBUYgBBLlcBghbi+Rew+UOfm1DteD5+9TF5867rvaTjNnmq3pzwRM/zvGVVrFK7IDemkgjg1sCKCs9XaKXu7NYGpS6hQC4MlFHuAle65LvowLhCA4L+0vjaAwwaC9bbheD0IsFZhFp03mewDLCYN69F5eqooph0uguB0aMEs/SJr0Xq5L/F9ajWYSJsfpnKC9e+ysmyF1UPCQxXKyUax2wOFLrQA7ENUF/RiiZA3k4LqVdgA5Zwy4ACaVkjav6HLWqxKFNVZpxcGYUX4ukVm6BxPO+tDcLa1o8r2bw2hgG1sF407kyVFqbKQrI5L0Q+ocpAyKe5tSMZl0Skz7C8jEHDEVRUo6+pFzeY+uSd+XzeB9RU0qsnWo0CGsBSQqVHQ8RCfD6jTrIupsbPuVqEZJNvXX/YoulMFRoVdaOXaCxaQOLxm1TZdpRPou7sW0DH45fp8evcjPOHZdiqngra2re+VtWAVUQbuUbnEI9V9cLU08B9E4yfQbVeGjZW6M6W3JGltzovEXcIQCJbdK3MqDRFTZFwHV8148FXrAAGG4ECKnpM+LoOGFirQOrfJLQWNUa0iNKA0agCVj+lvXWwA6vYjf7rR+msDXciB5ZRwXAhYKRiBOI4gXjOQAJnIZFzkMQpJHMFpHAeUrlQmYcG4Ne08uHXKoD14zqNNdShJEtnaUymABmcQCZnwMRZWM45yOIUsrkCcjgPuVzwzQQNlFBYXZBKDc03Q39gz2JucAvGAoVB4TKwAmkqV5St3bL9WPMoofP5J2X1zzPjPiuWlUvGcbqca2hspmmu/NQidENhbQdeDd5IKYAhvWFBGeJ+wHnh1N2xrVqU6PMBB2o0VTgEauUfFHAyONAEXLh4YSqCn+6mkmL/lAacB0xN+xt62J09tam1SjPnM2ixdyVo3Hs+4AGIg3VYx+mOoAvLzmJS03nyOyke0IBJGdYiWl6MbvDTq+7Sd3K5GePUK+TNsByjCV7qTOihTYrclCDq0o4otrfvQlQWBqN2IREv07oRlJ1QXaK31JoEm23SbjmD1wTiOirmaovGwEBbShejBOftVhcrD5urZFyLPi+x3dwawvx8QUkfxOEc5LIRQmu24lbpNuAtSpqQNHJXUFYQrYEy6QtBIA3UmHeQ3BsIzuYZ6m7bw4ffmKcaNmHlmsDacVB+InN7K543KZeryfNlWIEByWxdJ6+SmjyolkRdiPdW7uxFhyr0xkj3XA2e4FpbA8XRyZdNa7m6zhOqYDXAgk3VNjGRqXWFpsYdtC1+xToqD7msY1v8X0ybH+lPO5g7N7blvMMHfVYyqLeGZwDeMOhtwpo6dWaNcePWme1hQ/T3JPocy93SFHqpPnIG5yg1g1tDy/NB3Ng00KQzVYbK+miPGVrsqlZ6KoA6Zm0coV0isA6O0OkA1LMujuCXCCzAEYIOQDXr5gg9EoH1coQ+B6CW9XOEAYnABjnCkAPQwIY5wohEYKMcIeQA1LAwR4hIBBbleGbMvFhi52AslVmsWNY4q4SJLMQBq4LJVCk6TNmlMG2XmplAR5jtLYM5uwzm7TJYsMtgZW85rLLLYbVdDmvs8klrzQ8JLHnrya85J/OxRWZ5x4YHlXkKAQGXgBbO0qVvxrM4AfsoAJ2G8w4SABYBgU44rS8AeGGkO7LsahqRRgcxvLg/tPTJRAb0dERSDD9OgF/AnAnOKCa2MDE8lEWeRC7Sb/gRYH/sJ2AGrROCFMaoWg082nM73cRYJyFW7bjfoboJXpIxVmm9cmW98w2FNIQUKKe7DVP+h+snhVuSqd4ERAPaGqUh5RaUTWhujkpeQKMYJPk27eh1muiA3BDxJjYYmZGgetSDWBqlUNKnwlNt+NYzp8Ici86LZCj7ZkPqyrqueDo8vOEgeznafFOvy5MxDQj1ycp5wGk+ByiLa5XfS29m2rzu+rTy7zrTEnUAJNnEd5j4RGloxslQ3WfCDrUhRV3VSQs1RavDEZ6wauv7ToRU/uISkGLAkuns12pXNH0PsqrmdvXP8i+73qVpljvIzP9FDSxhdZ1WAQk5g5T29tZ5pISdgjJrSs+xWmjzNv8Uq8Vuh4t1nT4JCEVKNIuzkFLjCI5T8wwpBVbrJ2QYzCVWLjdd0R1juaeMpUc3q5ERbYgncMwvTDbLD0Ii0kRRb5rxSNYzavk02qzLeKMXxm4elHRAqPHpWosCje5lGeMUdMXNw2RN3KZcUbJQyhAeZLnjxO28s8CHjDaXSma12amXT6fIyZF1Pj8xw+vDeHqlya4jJ5gGhjqP2qzwKMsYgmdvUqDM3s935xpcKI/PcBJY3NqqUVqf+ud6OezXN5vgiqgMWhkd9axPFm7o0ZLQBK0gs674U2Qlnig5QBqOT9lk5Yh/+gWENNSQmRSUb1REBKc2S08dpRDTRJW2xMC3KyGSoqkensNnKCYkqQ0zl0gZ4zBOlCMc11AlQ0+gyjqhiO5xDX8NrcFNGeI7degfbbaG3UZQ+6eXhpw3R7UxjVBR2NzMFdcwojhR1+Q/MpZEODKH91WnRr8JwMhME7VBzh9mNI8qtyB0N8UxuLF2CdWbmsDgNHXi/yvr20CZ9htelV6dUB4/LVbgGKhZVr2uTkDcS7qHN0I0sxSHMq44h7d5GugXMo929eCDF7L1rOmKJ0PvlnLqPWUovEoCZJge9DkWd6XEwow6vpJ1xdfZp8NNlD+KoBdAiAGGeP0S82iD7sjNe5gXlB21A/htO8A49Ojf29eP/nt352VKOl2QfvjYL6OeVWtzcjckdFagJO4dwcCr8UJQbJhvYraLjnJUp2TYO94fjDvljGbvhgY675GlTb++eU2SrEIGaX3BVsM5kkonTm+fSh//AOJjDu9fIGb95aXM6Y+rUGWYNhRGQOeJOpV0TpiKFLpvrwP9S6V5ga+CGQmby+rHrV7VQPL5cGF64Wa9r397VZ7Oj5ks5ViO05MMnV0KYRhTX+7mQgkuPC959HDe7FQb/3t/RlCnEi5RdvWt/pZr5E89hVdu75tqbm/LvmXr6h9MdCnz+yOs9/ZfKESuu0RQUYE+J2ULolT8yOCOEflMf17yeeDnHdTdoUsbzbooxnESZ8RARqM5dKm62wdeXU9ynj9hqjcQa84q1uqDOnW23zzdH1aeyp9yKs9v6p7whpp/VeSHvA0bSfx+0PDk9W2WiJG++/1H0ypSCp+GqZI4OwTy8eCHIx+PfDKIwpyJcgg0a5/TFt/0uVeczN9e1MH787L3Pa6PC1QZWGgw13MgZB5+1Fkvfem+rCzBK47nN6cEE4z2/NyHcHMnBvaxkgvu8ihthx9fD3F1Hu3L/EHk3qqUMlPR32HaD42/722+25/l/HeYeslL6V+eQ5rViruoIvOrSzNzjSpCtH0tj+06RJb8f7LlSt/lMD5He1vKohmvycw1BTajvR4VqbXK5KX6U69k48X9OVJHYFeQYa97U37xP80Rck2GnGyVCmqlarSTf5d9yjEJp30+sR702bU8SslqlyyTxE33WYhdqhONzyOLY/1nUseDm5mgzgDrz+knht5L38+47WiT6goka7K8X/og7YqX1t6z7zqK+9eLOlGDt/G76QcZ15JqqXaB7pM+Sl59e+OFf/50NIHWCJvmPiVRYPqO/vRN395U8jSl9w+k1Uget8IvTitOBYViIKAA+hCt7A/0R9gpOsC4l6klMLBSIVdk6IrTBCjK1HzKKXX5eoOLzxG9XRtFUgoXsGJx1l5k9uQ7JJkk/vAPLz556QVptVmv0oTAGVJVXvbH/OYPXnntyLaKrj735/41O9vrdjkjdJ7/Y1HJojSBsk58/aeopY+d+TiBTOTx3prxd+g28c+fCDX/tDVouu0af8tV+UFuUHg8Fe2yI38Pg3tgv6ioWrIaW4KRIBiyUx3SRlsFzWnrFFa2FH/nVyFV7tsl6XS3ndbUtr1sno7z/zwksijxOOhe2Deob1VuUiHzwNpklcYLjyQgPZVnQsb4PtG5svHWHac33SYZggYdBJdWR/QOTQSxDM6jYknWHgO1RMYh2HSFqCrZn9D66Zkf7QrcFRh/23e175pw/vrJLy7dC3uuFVTb6Dl79Ae+OTir3/IRLpD3iyQh7bT7935+wOalTGnZoj5Vovyt3zszhI69y/xvdO7NVwmSSbvshRxW4sG+rV2k36qTZovAxrJ7mD7jK32o59ekXyuds+Evm+o+Dpq2tpy6vSlWvoVnJFZnxAk0Svoda+gTXZ5G4y3OkJZek5bC2cTT1zbiEPvOtpqCOm3I+dumQN3m+K9LJCPS+Ia8M17dQ/iF2IzR9gyb9m8jOol+5BOU3ra/D/Zo13d34WPKNUP8jj2vOolOT5Ubbt1AIXpu52PnUCA7ANDYBmlUDDHuwzf1LR2f9xHKIhBrwUMagjNHS5QIUk0kg5ZVWohUIk/1EjFiwSiyOsFSX1FL7iyMieeQQGiakWWUKdiqBkvbmpqQ8Zw08FIEyYEUiCVIFSsN2MILzj7CGceLeNm4SYD3tbvEah/Rlh3gReZ3AIDPH7xKGV718EXH0hRz9FMA4IEAkGAAw0Xoz0PpvqXf639GaVOXo1DUj61wtMQkwD/b7IzkJHiiRlRHRgHHZMOFQEhFRWhpL20NCMDhi7Z5E/M7zEfbUT0E3HAHZhpNkIF04m/cIboGKyEDQFxRZDbiDsrC3eAlPJjByjAfZ8O5fdPxRCbPboQvLv2eOgj6QnLMAA5A1GD1Ej2moDtHst5Jqq+gp1PigsYg0KkSLoIInS4BBQy6DJhEXBYMTnc5UMNVrbTAVaMdbnc1kBS+aJUEWDqfkX5WOOlm3JdwEeKiy1wCGnKPy0BD9ITLQna05HKQFGe10sFVkzGm0tWAI72tVRq4bo3/tEA2kveVitQfIG7t7K4+7Rz7i3rqYkubY4JHbpkIzX3fwlEtoUCsd+S7PyQcP2mGvscFbuGq8VjJnS1WuURGSRROjfJUV7S01fJcEoeaF2+eEBSUfbae+gbkp0Ib+j5c+4o83RWlno7FQ2OMOmtW9mrxOqdTjagb4JqKq7/Ze2Bydan3t7V5vZjW+Px+3u/1fafrKLb6LZe8OqdtlifGTRGn5N+I1Q+tidWdcmhNibK7kvoDDvBrZjoe3ML2Bl/RNwS15i3YaJVJ4yasIcsVkUdWxMqqWGFU22SsrE7MamQ9x8yPjcV0RGlzyHjDrbNQst7AxsE8ugVkQmxZ9UhIVGbO2qhFSMDZZq8RfpM2VXHoEmuvtNaMkFUazJuzJqJXJUxMiLGofEtKyEw6FC4XBZruds0qI1jzBSvLzWXpMOZlZV6IUaHM+strW8wKWWPClJANLJVeTyrkmb2eyMQ0WltoXlu0NgtCzaRiRjaZWW0ovU6dEiW7aKuyNiGzzbmFGo9WJvREqH01qfabbEyvP9mqhIyiZwwTMRxbDdF+a01UASOrZGLktV4+snYLyGuzbvexAHN9N4ONbpRqDQWfLQtZR2ayoThhM62yUUxIZKFaZ+LcNUooHYRdLzS94imsFnGcXmB0jEV8asbMj/8V2jXwEeUInE9w6WBFkq7+dT8pEEEFehUqVRk2Ggh8Dl8ggyzchhxSVDxIKm2s43o+CMEIiuEESdEMy6nUGq1ObzCazPHPTVqt3hp5avuygW9yJhr7nSApC4oSD4hXeDv0vCKKJLJd8F8oEDZRJOzCIZzCJdzCI4pFtagRtXZdPBBKdyaIQrreeqtgrctszkWsYhO7dSxraADWifpXa4CWD17v6t2NeH7fIn7mbPa1G2jNboB82Dl/lycAQFi6M1D3LsczO3sXq87sdSHKsyue5HcAsrF8JNCLo6d77t2gyn8cl3b2vN2kLM9F6wAA) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAABgoAA4AAAAAKwgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAANiAAAAE4AAABgRuZdBmNtYXAAAA3YAAAAugAAAcoB+528Y3Z0IAAAFIgAAAAKAAAADAAAAABmcGdtAAAOlAAABYwAAAuX1RTb8Gdhc3AAABggAAAACAAAAAgAAAAQZ2x5ZgAAAUQAAArKAAARUELbjX5oZWFkAAAMoAAAADYAAAA2EIN07WhoZWEAAA1oAAAAHwAAACQHMgKeaG10eAAADNgAAACPAAAA2JZiEF1sb2NhAAAMMAAAAG4AAABueip1+m1heHAAAAwQAAAAHwAAACAAygwAbmFtZQAAFJQAAALAAAAG507M7Lhwb3N0AAAXVAAAAMoAAAHIC8Bi1nByZXAAABQgAAAAaAAAAH/i0Eg6eNqtWAV4G9fS3Zm7e1crraQFyUySbCu1QxaGoRhDmL7Gf5lCZW6dr244KTMzM7eBnx5zmZmZG7a1eXN3peDj9/Zq0aNzZs7Mzr2WhFJKkqTfYlRikir5nuIySDi0NW2mzWTaTKSuPjqVwmjhqxQ8JoH0TV89buKvStUSfyKEMLRViqiJeLI5KZkG5PK5dLosonKGpmFb5WRpWMCTzkR4otJG0+ShNUeceuoRa/paOQc2GL5h/8PWw7d1NnBuf+r8xlldeKPwurPa+c2nxBUjrhbiqhVcQFx2Jp1OlZeVSwZwNcETiXg2k8/ZlmkwTDbHbF+QyOAJZ2KSc1XhpnnvIUuXHnKvyf+kEZtjb1npWIMZ+Fn0BSiHldiB7bASyl+ISsQ2rK9e/hWxRYgtINgglyqLRniUSypPxJuzmVw2J8kX+6tsgL6HUTN0C0Cexn+vmzrIoG5YIutWQFwFFkkAQfJ+POGphAeSwDNj0YSZjkIQMl991VcfeKZ9w1vtuzBHyTKIbpw5EadUHhEOCHmlZCY5zNRtFeVpAJZuaNj3MABfo1u6vGGJSqwBugosUgEJUemrh+FFbuYql42ZsWzaVCDj/PErflH7hvb2QBNZXkpeXkWWs8hyqBu1mqBs0jCZODYnB8uZ7CjMZcZgPkcJzudtg47uVbo8GqVsc5WGaYijWlbuDtMQRzGiUcKPWT0HtlFoyHx293jkwOgSZRzfbfsYAqpGy4LYkLIY97dNr6jjAIE5nZNHDqionxMA8HdUxcqr/H1NXBs9t+O/dLgYLjPqaib2thACU7giKwpDRBlaeifW1JlwGVykt+1zwuTKygA3dU2unpMZO0FzepxFWu+CKcnGukh8Qa93f1Z3rCoSkjVd2kWLaaTF4GIeRmIpENOig/ikymqQxylY8WEibDFUr0Q8acySRM1FLQ1Skj6XMi1gRAY2nx/jDAGU0JETUAVE4GzCkSEFABmvPDjfGQlbnPF0spvC12ZHk9khbelkdLYGoM6frCL/P0P1l9UevipSpTunOg921M6+ahAqqmKQGjjoqtm1Hc5Dzil6VWTBzFyzn5tBVa4deNQyDZbAUu3ceVXx1vKK1njVvHM1WApLtKNuGSJzUmD7j9imnsAmShWkgN+thsZ0Si5PiSwn4k1NiiyKUbx08By8rCN7VOUy19BpdQbR3gKaygDwg4WvMj+WxQ45/PBD6iPkEpC6iAeph7C8NIywa11st8jFSKfyuaZcWqhLTF5FCSJXtERc5QpPiMt8xi1BPKyxfMLgjvm9U5v3aR66FsrHy6CACgnjmQPfumpUqmNu56xUY8uAgWudT8fJKENAbjTWHngDy6Kmt6Y1WbZnRsi+vk4BzdZy5jB6XFvJS89HaH6LnraQIlsuwzYp+A8psu2EHYoo/r+piK26imy5DQ/a3v8fUWSb01h+0JC/psjotn9UkYbav6uIdGJfHeunt6RG9EkmvJby5HdZecTtk9lMElmGq2oyny+zLXgDCqAE1QAUXmIsqhtdSxoMo6prIsw9pn+0/wIW8KvqhoVMQ5wDa3ALjmuIVV13DRTuKtwjFbvo2cSm7NpFYyYEYaHzjtdDL5eKHe9kYbdrx0uYCixsd7td4IS/gpYmPAi2Q0KAbbi8fS+sklUWBrQ7V/bNDZxAvZOwEoWTWae82J0Jgy6WSBUi49FIMVvN2VzecmdFdgD3/+EXYdHzWvdDBVh0CixXfWDJizmTQ857BcPhN8YadABAK/3da6wC3tB8IHi2b4Lb8EipknjCSDxKnMe9WshmjbzQPlVG+kfNCNwEVnUwxxggyLh/IBoEGTQAYP5zHoLBTAaIH+vcvdL1voe8v0h476FCaR5nzUy0MVGJFFC5ZZWXsU5u2uBTnSsPbZAFcivFYdb/8kF/YRnj4NNgHT6/EYalLQQAvWHDi87cwuoNIdKyvnAyHkQq1Qqe3eZwu8zeoZMoGhQR1ZuBEBHBQkGk4H4uUc09l9U3MPnMADE5BxbaNju/KzH99DKchhO+yrQqEsDvtm/Cg/4xpXC/f1QpiqCHIvCUCkkiAqpx0dwtOycuPKG4ikDRDKvkDfWX3VNjKjgs7+XZOYfyXOjRmL818xW2w2kvbGxhxSz3f+4kvSyPLZyL15NOe9b5WOh2thbOVdUZWydKwo4OV+AciZXsYmaarGbgnMLdkovTQzhL9qxwsgC10KOqWyfOoJikwrnQLdhKFW66bwt0z5AHz9iylT9BSCrBde/FpJaYCKOHMJbs+ZaQhXNX4Xn+xJatxAS9lJNn2RIpQVZR159y0TpFQxOnSJQG3RSzlPHWFfhbTmJOPMYAGQCMlgyKPOlXpfYPsiWiFLmcvecYYDWXyoHhTT+ijCJxH3yjrb90SLNKvt1fWAhb5JVShlhrdu2sHrdaWqaI1VWCF7mTSMfmTLGlki+wDMft41IHDh87J8R9iw/IqQAy4Fz3qbFGB9APniuerXBr550vtJvOmz5Mk5UpS44+Sfvi0ZHu47e/1EFdpSHEAbX9nj1P//IjJrTpX4TPSn733QjutvYqVqvwkPair/gsTwRu7GrlRMcyLQbQ5jPaFqkc+pdwPuP6WYf410AtykCC/LBRHz/0mlkyB9vLAmyBnLfC3F0PrpYEKAUsgxejewFZ2v3hZWcMAO/iOhT6CjzKasOOt5oW/rtKmogLRDcWD/sRNM3A8smjPf12954tBt7ee9Jc7ZsnRgnff9xQ8t2yJeF9YSE+K7K55zwp2pOQqDRDety7lVLJAcMLbq+8iTj3zvCKUtqcrbul7ZGRfyHN/qegAiWhSv8i2EL5bCyp0rRH1ZEqnl85KjLaszRyO/1SR09aETBsUfuTjgkL3zQoFvaJc89v59w2ReXfezRg7cU8MKLpB1nMx/0X4KfsHqmKWMsVoU5ITlAdMaY2J2kStmzbtIUj+ClwJD/0msrXXp7J1eDEiUed9Sb4Nd3Xfx1wZDhjEq7CJfcrvuANNzqvOFcXFuCP+GMwTCwX9jXg//FX3XWQ7SOWfNa2KIaUWKREo5Qp1ftPhV24aTP6qIljKOJU/LQJbCOi4+YfLXwX32NBGeiBtm1aIVlo0QzbZPgeoR9H6NcRehmhB7weSy07J+WBBBIa2naUocpXG/ZUOGCaU2GHI0HcvImo9L4GAvyJ/e4n5WHNiFisECvELTrEmCkB/i+taT/FkyWNkBWBLMeTnhwmvlelutGHQpCCVDBcuFnyviFn8BApQN/Q0K22fIxKLGZSZeH/yjrMDoedn6lVKk7UZToV/hAKSbD98+2t8EfpLHee0ASTmsy6NZhyI3DXi26V0iFhcV9X77GLmCWbCICGpZ2+brgVkNXwKzwRWtY+RgNOlclBnT6hLMKR8DcR/puEL2Y3XSb8ZDaT9gqsPCpKy6t0kQO/IgeWn9Hb5eNmWJXrh83sGTPCQBhVV4MT2peFEhz5sNYDKoIchd8U9B9houu3DYTL8m7n8cYO1130ZIWLGDQqY0VMwPDsw4ZWEBccRLDlVqxSAAvfG6NhIhOeE8ObxCBWjL7iHCBk8GDdKVQIJQYFBC8LbSqGHjY77EnjX3N6rNIIyogWTHTVCUcbPXUCh1bGrHIKo8hyPemzY75KZGNRP9x51lmShBJtMFA6uvgbh+L9xtGWTUfTtB/tbf+4HUhiO5pGic21EX/7M1+qRNkAAHjaY2BkYGAwYwhnYGIAAjApwFAOJKW4p4MEABiYAdYAAAAAFgAWABYAFgBMAIMAqwDAAOkA/gGEAgUCBQIzAo4CvAMXA04DYgN1A4gDmwPPA/oELgRkBI8EwgTWBOYE+QULBRsFLgVpBbwF8QYZBlAGpAbfBxIHQQduB4cHowfTB/8IMAhjCHIIhgiaCKgAAAABAAAAAQAAdWBqS18PPPUACwPoAAAAANiymQoAAAAA2LKZCviR+x4HbgbWAAAACAACAAAAAAAAeNpFxiEMglAUQNH7/oOR6DZxbiSTyWY02TObm8FAJmGfAbPJas8Gm713isXgHEF8f0x/OLuXjjmArIEOdMTDTKIPC7eSdCix5jQeHSRF/0wKHLyP5qwtpasldTXxr7qTacDYevd1J1kGYE18tZK9VlyGhveNMkrNOZhtlLmrJ7e+Na9/GzMDjw18AXIuNDMAeNpjYGRgYLv2W44hij3xx8T/L9jzgCKowAwApaQG1QB42mNgYmZlnMDAysDA1MW0h4GBoQdCMz5gMGRkYkACDQwM7wUY3ryF8QPSXFMYHBgU3v9nVvhvwRDFdo3lkQIDQ38cM1yLAgMjAPoPEIIAAHjaY2BgYIZiGQZGBhA4AuQxgvksDCuAtBqDApDFBiQ1GfQZYhmqGWoZFjAdY7rDzKwkpcytvFZ5u/rLB4wPQ97///+fgQGoTgOoLhpJHRNQHYfybKC6Fw8YHga8/wtU+Pj/nf/X/6/53/+/73/OX/e/Rn95736/y3Wn+k7RDScFHbl7AmZAVxAJGNmAGMZmAhJM6ApAXoQAFlYwxcZAPGDn4MQrz8XAzUANIAiheEjQwssHYwEASs00MAAAeNqsVeWa48gOLYeaYRh8QZ6a9O2blD3MbMfJ8DR+n2vRbvq9vPsMfho5y//20fbISXP3ckNUpVJJR0dShZUhVqtJbIle/aSmF19xY/m9hG+6PG/TLcpXE640s59H1ahaX9drruexsqwi3ekrR0Vp6LNjmNItnyuGNoh/WeDa3Hv9eWc8itfjpfcTT3tunhAvLCQeP7Uu8V1Z3bWWioFRtsHzUA13xFfl/Cos4SwhgMgz4vGFJIWG5GxcVrdldTt1U2uty07bWs1qIdm01ueqIfipNTMAqkcLCdd1yA0dAr5lJ/W5ZjRw0UZRXwtJTgbB5ZNVGq9zteVBH1FOOXwXV+tNpLWYpAtutmQTbXH6dDnBkYuktiP7XDc8ErX7qjKgpoGtDjWx0mHGlbUtdtYRn+stn0cMCciJaP2nmloj8cBPUysmaacEOWr6IxMqisOWt0P2mNlP/njpBTg09Mg4pTjXGW0MmVKusMnkAuQ2Sq42ddYZhJg45jpfxi2FW0ddmjRlQv2J8WqceK72bMvzecoUlUrMG1nH52kDQyKejF7KdSx0aHlKdkvYTWHn8wzczJaUEBhYR1yejlLKU+JpkObzrHm1khS1jY69zFOb+hufT5hXi8mr5YHS9aA/VepPmkLNRKtJMTMTsZOFPNOWJkXrhsWkfEzhg52zmpDHQlIIecg2zHMqw7Y8jWvba3dwjiv4LzUWmfSAvwft/lIdU8BCqVMabEWsHvcdxylrdcqoQlXilYRndEgxT+iQx8FvGlKK8N/PzjpqWoVhnhYnG23+su1eAk2nkdupts9nTOGIPAueRZ4zRVXkeVPURF4wRV3kRVM0RLqmGBH5L1OMivy3KcZE/t9QwM6HPrfKxac+t8vFZz7/xyieav8FjP8Fxv/ANwGjSA8YRV4CRpEaGEVeBkaRTWAUOQeMIv8HjCLngVGkMfSwbDXfIOxsSpHGNpJyQLKRfgsM+232MUlXDFGPjqmEzu5qecZ+0wKt5PPVnfI4Z/lKq6g7Z+Lkqi0TvFYyc+zxdUO3Srw3YOfEh4NgwhD8aL06+52Sn85jfbe47pxBRjeRP/WOwcsqyu76fMsE5x76fPv3TNmJ1mF+ByVRZ5sUUI+Vls5+kec93dMZJWvInx1M9G3HOXMa8e8aoMKA4K804bGovZkHmuhhDl/3do8pGPjgmg7FijiVeX+6mHxboSq531bmqhdtKG/gaES5Lq11F9OHah5AS2Bj8NhXonRDczXKNhYSbDIX61TeoIN3Mk0IPae7qKFGhC7ygiijpHRUEC1RNE5SSK6joeqHvMKjZNQsQeBzYfDK7cZCye8LBwRNfW7IgX4Iah6IGrnqEGdd3ZNgUq2Hoi8TGDKqVpKAHmrPhWZbCWe7lDea2L3Y++07KNRRHTysjJY2fjREEG2XJpWv54MpbpfysdEUCGtdPMwPbVAEzmkM4JMd9cJe9dP91kfaPDN8t32k09DwvXaOwNIsQHvYBmUJOIBptNNhYHenBTVaPdB3h+46eDTwhv+FVuz9U90n8LO7gKXxhOypt2eHGGMhYzv/ruTv6SEB+u7+lHtI+cxgOPtK5vBUwDcxi8+P0b8whXJOn+JbWL80fAfilbAWg1fq5kDxa4/1gBxBAARQNMY9UkznArG9tjlr+1iDC27/UfF11R/T3+y/cDuaf8qI2PqeUUQVhyAm9uEBiCsOQYLmQ5GkASkakKYBGZoXRZYG5GhAngYUaN4URRpQogFlGlCh+VRUaUCNBtRpQIPmVdGkAS0a0KYBhpi34WnuMJiPqq6rJ1WPM8PwrENfzLuwHjC49RC59Qi56VjM+zCdMLjpFLnpDLnpXMyHMF0wuOkSuekKuelanMuTo+Dn6fXavDDM46v4Lvim3OwBEWxNYHjaY/DewXAiKGIjI2Nf5AbGnRwMHAzJBRsZ2Jw2MjBoQWgOFHonAwMDJzKLmcFlowpjR2DEBoeOiI3MKS4b1UC8XRwNDIwsDh3JIREgJZFAsJGBR2sH4//WDSy9G5mAulhTXACYSCQbeNpjQAIAAAwAAQAAeNpMzLWBQmEQBOD57Q53D7EGIMYhfzkRVgoVoCFuFVAKdZDjg2z0rQ2AiPBA4FUWQAs4YdES/2jSCim0aY0g+rSBG1P672fuFjmsaQ8S4kT7fvL9z3wFoe0A5uJMC0TkkJbwyAOt0JBHWiMrr7RBQmXov5+5W/ZUkfYgb1a07yff/8iv3lqjiiXXYSDYZ3/F3B45CtQyMzPftrTObKyA47IU/Po3UZaZyqB2u0HQTHuZqcSOfkd/qFQoTOZKhWKBVtiaSkLHkeEk4pA2k0gFT8XFkYF4grZjndBipMvc6G3rE764PDZ9HjniSquus7Vm4taaWYWppAo0RQ8UuRvJC9QZZ9Y0Eyqoghp5ZZbhi9Ok3zOdTkc1tIuruqukee7Ph6Z+Y6wJpYfM0BwGHeNiOmLLWZvLNFgQ7ekGP1yKCoKT2Njhz+PmtevojEmIuok4sWJrJWXOyMVMx5s7tJ9yMhTvDAUh3S65qIpKwu69pNva1PVVncnPRNPa4iFpNxXEzqVT+byNMpM6q6ypD6ac31/bef0PltFEih4yGFQQw4HwGxH+yFhCQa5J5DwqykNYAcN6bSJfx4gEs+BI3qEwmx4rBO8mFzFylzwh3LZotE9dRCSoDEZD/NuCTwRf4FL6DPqCR3AEltQW6tDSsCZdCZwfM+HZdyg/4ynQKxm5xykfVJ2B5W1hfCdJh/LPyCf3Mvz4bvqcGXT8pdCAhpP8qoxdqJs1z+HPD+7648bajUo/0jxsDhGI0vh5kd8x6/epDRY93Z0QYQ9a3PzqqShJCoSPhbGPnMeCrgV1xJf5hKGiLmPk983etLUEl30/+Rmxd29iR8Z9pF77MHnnUUIIenbKRSj/+Jm92EvQaMtjhNe4krdwD/ZE+8ZFHHrsMIVAeCdXKjgvl0UknUa+nWAlj2Td7XIe++Lf+YrnPxKAWPF42myKwwECABSG35dt23XL3dIg2fYEzdJOtUw89/hLFPKr11VK8q9qn+WTUopRTOKQhjSlJV3po5C7PFCikhtqNGjRoceAERNmLFixYceBExduPHjx4SdAkBBhIkSJESdBkhRpMmTJaS/bRaHQLvx+uVDSnxfr8WS02wy/yruluDYAIIYBIDZSmLqA7f03ejw1isl3Hrx4/4/Nh4WV7X95Dhw5cebClRt3Hrx482H53+27aefxrt57Dt+heA4cOXH+NhNWthvTfGCxAAAAAQAB//8ADw==) format("woff"),url(/static/KaTeX_Size4-Regular-ad7672524b64b730dfd176140a8945cb.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(/static/KaTeX_Typewriter-Regular-6cc31ea5c223c88705a13727a71417fa.woff2) format("woff2"),url(/static/KaTeX_Typewriter-Regular-3fe216d2a5f736c560cde71984554b64.woff) format("woff"),url(/static/KaTeX_Typewriter-Regular-257023560753aeb0b89b7e434d3da17f.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.10.2"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer,.katex .sizing{display:inline-block}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} \ No newline at end of file diff --git a/sw.js b/sw.js new file mode 100644 index 0000000..05d9f91 --- /dev/null +++ b/sw.js @@ -0,0 +1,102 @@ +/** + * Welcome to your Workbox-powered service worker! + * + * You'll need to register this file in your web app and you should + * disable HTTP caching for this file too. + * See https://goo.gl/nhQhGp + * + * The rest of the code is auto-generated. Please don't update this file + * directly; instead, make changes to your Workbox build configuration + * and re-run your build process. + * See https://goo.gl/2aRDsh + */ + +importScripts("workbox-v3.6.3/workbox-sw.js"); +workbox.setConfig({modulePathPrefix: "workbox-v3.6.3"}); + +workbox.core.setCacheNameDetails({prefix: "gatsby-plugin-offline"}); + +workbox.skipWaiting(); +workbox.clientsClaim(); + +/** + * The workboxSW.precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ +self.__precacheManifest = [ + { + "url": "webpack-runtime-9be14465698ce64a689a.js" + }, + { + "url": "framework-737c3e16d462c41141c7.js" + }, + { + "url": "app-94413d7bd23b40a803ee.js" + }, + { + "url": "component---node-modules-gatsby-plugin-offline-app-shell-js-a80c80a072a2dec4a792.js" + }, + { + "url": "offline-plugin-app-shell-fallback/index.html", + "revision": "c0cb3d0a4ac74a226e023e219b536985" + }, + { + "url": "manifest.webmanifest", + "revision": "f8f3214ac2f106f23f9ada9113f4dd60" + } +].concat(self.__precacheManifest || []); +workbox.precaching.suppressWarnings(); +workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); + +workbox.routing.registerRoute(/(\.js$|\.css$|static\/)/, workbox.strategies.cacheFirst(), 'GET'); +workbox.routing.registerRoute(/^https?:.*\page-data\/.*\/page-data\.json/, workbox.strategies.networkFirst(), 'GET'); +workbox.routing.registerRoute(/^https?:.*\.(png|jpg|jpeg|webp|svg|gif|tiff|js|woff|woff2|json|css)$/, workbox.strategies.staleWhileRevalidate(), 'GET'); +workbox.routing.registerRoute(/^https?:\/\/fonts\.googleapis\.com\/css/, workbox.strategies.staleWhileRevalidate(), 'GET'); + +/* global importScripts, workbox, idbKeyval */ + +importScripts(`idb-keyval-iife.min.js`) + +const { NavigationRoute } = workbox.routing + +const navigationRoute = new NavigationRoute(async ({ event }) => { + let { pathname } = new URL(event.request.url) + pathname = pathname.replace(new RegExp(`^`), ``) + + // Check for resources + the app bundle + // The latter may not exist if the SW is updating to a new version + const resources = await idbKeyval.get(`resources:${pathname}`) + if (!resources || !(await caches.match(`/app-94413d7bd23b40a803ee.js`))) { + return await fetch(event.request) + } + + for (const resource of resources) { + // As soon as we detect a failed resource, fetch the entire page from + // network - that way we won't risk being in an inconsistent state with + // some parts of the page failing. + if (!(await caches.match(resource))) { + return await fetch(event.request) + } + } + + const offlineShell = `/offline-plugin-app-shell-fallback/index.html` + return await caches.match(offlineShell) +}) + +workbox.routing.registerRoute(navigationRoute) + +const messageApi = { + setPathResources(event, { path, resources }) { + event.waitUntil(idbKeyval.set(`resources:${path}`, resources)) + }, + + clearPathResources(event) { + event.waitUntil(idbKeyval.clear()) + }, +} + +self.addEventListener(`message`, event => { + const { gatsbyApi } = event.data + if (gatsbyApi) messageApi[gatsbyApi](event, event.data) +}) diff --git a/webpack-runtime-9be14465698ce64a689a.js b/webpack-runtime-9be14465698ce64a689a.js new file mode 100644 index 0000000..f41cdc8 --- /dev/null +++ b/webpack-runtime-9be14465698ce64a689a.js @@ -0,0 +1,2 @@ +!function(e){function t(t){for(var r,o,s=t[0],d=t[1],f=t[2],p=0,l=[];p} + * + * @private + */ + static fromRequest(request) { + return babelHelpers.asyncToGenerator(function* () { + const requestInit = { headers: {} }; + + // Set the body if present. + if (request.method !== 'GET') { + // Use blob to support non-text request bodies, + // and clone first in case the caller still needs the request. + requestInit.body = yield request.clone().blob(); + } + + // Convert the headers from an iterable to an object. + for (const [key, value] of request.headers.entries()) { + requestInit.headers[key] = value; + } + + // Add all other serializable request properties + for (const prop of serializableProperties) { + if (request[prop] !== undefined) { + requestInit[prop] = request[prop]; + } + } + + return new StorableRequest({ url: request.url, requestInit }); + })(); + } + + /** + * Accepts a URL and RequestInit dictionary that can be used to create a + * new Request object. A timestamp is also generated so consumers can + * reference when the object was created. + * + * @param {Object} param1 + * @param {string} param1.url + * @param {Object} param1.requestInit + * See: https://fetch.spec.whatwg.org/#requestinit + * @param {number} param1.timestamp The time the request was created, + * defaulting to the current time if not specified. + * + * @private + */ + constructor({ url, requestInit, timestamp = Date.now() }) { + this.url = url; + this.requestInit = requestInit; + + // "Private" + this._timestamp = timestamp; + } + + /** + * Gets the private _timestamp property. + * + * @return {number} + * + * @private + */ + get timestamp() { + return this._timestamp; + } + + /** + * Coverts this instance to a plain Object. + * + * @return {Object} + * + * @private + */ + toObject() { + return { + url: this.url, + timestamp: this.timestamp, + requestInit: this.requestInit + }; + } + + /** + * Converts this instance to a Request. + * + * @return {Request} + * + * @private + */ + toRequest() { + return new Request(this.url, this.requestInit); + } + + /** + * Creates and returns a deep clone of the instance. + * + * @return {StorableRequest} + * + * @private + */ + clone() { + const requestInit = Object.assign({}, this.requestInit); + requestInit.headers = Object.assign({}, this.requestInit.headers); + if (this.requestInit.body) { + requestInit.body = this.requestInit.body.slice(); + } + + return new StorableRequest({ + url: this.url, + timestamp: this.timestamp, + requestInit + }); + } + } + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const DB_NAME = 'workbox-background-sync'; + const OBJECT_STORE_NAME = 'requests'; + const INDEXED_PROP = 'queueName'; + const TAG_PREFIX = 'workbox-background-sync'; + const MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * A class to manage storing requests from a Queue in IndexedbDB, + * indexed by their queue name for easier access. + * + * @private + */ + class QueueStore { + /** + * Associates this instance with a Queue instance, so entries added can be + * identified by their queue name. + * + * @param {Queue} queue + * + * @private + */ + constructor(queue) { + this._queue = queue; + this._db = new DBWrapper_mjs.DBWrapper(DB_NAME, 1, { + onupgradeneeded: evt => evt.target.result.createObjectStore(OBJECT_STORE_NAME, { autoIncrement: true }).createIndex(INDEXED_PROP, INDEXED_PROP, { unique: false }) + }); + } + + /** + * Takes a StorableRequest instance, converts it to an object and adds it + * as an entry in the object store. + * + * @param {StorableRequest} storableRequest + * + * @private + */ + addEntry(storableRequest) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this._db.add(OBJECT_STORE_NAME, { + queueName: _this._queue.name, + storableRequest: storableRequest.toObject() + }); + })(); + } + + /** + * Gets the oldest entry in the object store, removes it, and returns the + * value as a StorableRequest instance. If no entry exists, it returns + * undefined. + * + * @return {StorableRequest|undefined} + * + * @private + */ + getAndRemoveOldestEntry() { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + const [entry] = yield _this2._db.getAllMatching(OBJECT_STORE_NAME, { + index: INDEXED_PROP, + query: IDBKeyRange.only(_this2._queue.name), + count: 1, + includeKeys: true + }); + + if (entry) { + yield _this2._db.delete(OBJECT_STORE_NAME, entry.primaryKey); + return new StorableRequest(entry.value.storableRequest); + } + })(); + } + } + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const queueNames = new Set(); + + /** + * A class to manage storing failed requests in IndexedDB and retrying them + * later. All parts of the storing and replaying process are observable via + * callbacks. + * + * @memberof workbox.backgroundSync + */ + class Queue { + /** + * Creates an instance of Queue with the given options + * + * @param {string} name The unique name for this queue. This name must be + * unique as it's used to register sync events and store requests + * in IndexedDB specific to this instance. An error will be thrown if + * a duplicate name is detected. + * @param {Object} [options] + * @param {Object} [options.callbacks] Callbacks to observe the lifecycle of + * queued requests. Use these to respond to or modify the requests + * during the replay process. + * @param {function(StorableRequest):undefined} + * [options.callbacks.requestWillEnqueue] + * Invoked immediately before the request is stored to IndexedDB. Use + * this callback to modify request data at store time. + * @param {function(StorableRequest):undefined} + * [options.callbacks.requestWillReplay] + * Invoked immediately before the request is re-fetched. Use this + * callback to modify request data at fetch time. + * @param {function(Array):undefined} + * [options.callbacks.queueDidReplay] + * Invoked after all requests in the queue have successfully replayed. + * @param {number} [options.maxRetentionTime = 7 days] The amount of time (in + * minutes) a request may be retried. After this amount of time has + * passed, the request will be deleted from the queue. + */ + constructor(name, { + callbacks = {}, + maxRetentionTime = MAX_RETENTION_TIME + } = {}) { + // Ensure the store name is not already being used + if (queueNames.has(name)) { + throw new WorkboxError_mjs.WorkboxError('duplicate-queue-name', { name }); + } else { + queueNames.add(name); + } + + this._name = name; + this._callbacks = callbacks; + this._maxRetentionTime = maxRetentionTime; + this._queueStore = new QueueStore(this); + + this._addSyncListener(); + } + + /** + * @return {string} + */ + get name() { + return this._name; + } + + /** + * Stores the passed request into IndexedDB. The database used is + * `workbox-background-sync` and the object store name is the same as + * the name this instance was created with (to guarantee it's unique). + * + * @param {Request} request The request object to store. + */ + addRequest(request) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-background-sync', + className: 'Queue', + funcName: 'addRequest', + paramName: 'request' + }); + } + + const storableRequest = yield StorableRequest.fromRequest(request.clone()); + yield _this._runCallback('requestWillEnqueue', storableRequest); + yield _this._queueStore.addEntry(storableRequest); + yield _this._registerSync(); + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}' has been + added to background sync queue '${_this._name}'.`); + } + })(); + } + + /** + * Retrieves all stored requests in IndexedDB and retries them. If the + * queue contained requests that were successfully replayed, the + * `queueDidReplay` callback is invoked (which implies the queue is + * now empty). If any of the requests fail, a new sync registration is + * created to retry again later. + */ + replayRequests() { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + const now = Date.now(); + const replayedRequests = []; + const failedRequests = []; + + let storableRequest; + while (storableRequest = yield _this2._queueStore.getAndRemoveOldestEntry()) { + // Make a copy so the unmodified request can be stored + // in the event of a replay failure. + const storableRequestClone = storableRequest.clone(); + + // Ignore requests older than maxRetentionTime. + const maxRetentionTimeInMs = _this2._maxRetentionTime * 60 * 1000; + if (now - storableRequest.timestamp > maxRetentionTimeInMs) { + continue; + } + + yield _this2._runCallback('requestWillReplay', storableRequest); + + const replay = { request: storableRequest.toRequest() }; + + try { + // Clone the request before fetching so callbacks get an unused one. + replay.response = yield fetch(replay.request.clone()); + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}' + has been replayed`); + } + } catch (err) { + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}' + failed to replay`); + } + replay.error = err; + failedRequests.push(storableRequestClone); + } + + replayedRequests.push(replay); + } + + yield _this2._runCallback('queueDidReplay', replayedRequests); + + // If any requests failed, put the failed requests back in the queue + // and rethrow the failed requests count. + if (failedRequests.length) { + yield Promise.all(failedRequests.map(function (storableRequest) { + return _this2._queueStore.addEntry(storableRequest); + })); + + throw new WorkboxError_mjs.WorkboxError('queue-replay-failed', { name: _this2._name, count: failedRequests.length }); + } + })(); + } + + /** + * Runs the passed callback if it exists. + * + * @private + * @param {string} name The name of the callback on this._callbacks. + * @param {...*} args The arguments to invoke the callback with. + */ + _runCallback(name, ...args) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + if (typeof _this3._callbacks[name] === 'function') { + yield _this3._callbacks[name].apply(null, args); + } + })(); + } + + /** + * In sync-supporting browsers, this adds a listener for the sync event. + * In non-sync-supporting browsers, this will retry the queue on service + * worker startup. + * + * @private + */ + _addSyncListener() { + if ('sync' in registration) { + self.addEventListener('sync', event => { + if (event.tag === `${TAG_PREFIX}:${this._name}`) { + { + logger_mjs.logger.log(`Background sync for tag '${event.tag}' + has been received, starting replay now`); + } + event.waitUntil(this.replayRequests()); + } + }); + } else { + { + logger_mjs.logger.log(`Background sync replaying without background sync event`); + } + // If the browser doesn't support background sync, retry + // every time the service worker starts up as a fallback. + this.replayRequests(); + } + } + + /** + * Registers a sync event with a tag unique to this instance. + * + * @private + */ + _registerSync() { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + if ('sync' in registration) { + try { + yield registration.sync.register(`${TAG_PREFIX}:${_this4._name}`); + } catch (err) { + // This means the registration failed for some reason, possibly due to + // the user disabling it. + { + logger_mjs.logger.warn(`Unable to register sync event for '${_this4._name}'.`, err); + } + } + } + })(); + } + + /** + * Returns the set of queue names. This is primarily used to reset the list + * of queue names in tests. + * + * @return {Set} + * + * @private + */ + static get _queueNames() { + return queueNames; + } + } + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * A class implementing the `fetchDidFail` lifecycle callback. This makes it + * easier to add failed requests to a background sync Queue. + * + * @memberof workbox.backgroundSync + */ + class Plugin { + /** + * @param {...*} queueArgs Args to forward to the composed Queue instance. + * See the [Queue]{@link workbox.backgroundSync.Queue} documentation for + * parameter details. + */ + constructor(...queueArgs) { + this._queue = new Queue(...queueArgs); + this.fetchDidFail = this.fetchDidFail.bind(this); + } + + /** + * @param {Object} options + * @param {Request} options.request + * @private + */ + fetchDidFail({ request }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this._queue.addRequest(request); + })(); + } + } + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var publicAPI = /*#__PURE__*/Object.freeze({ + Queue: Queue, + Plugin: Plugin + }); + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + return publicAPI; + +}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-background-sync.dev.js.map diff --git a/workbox-v3.6.3/workbox-background-sync.dev.js.map b/workbox-v3.6.3/workbox-background-sync.dev.js.map new file mode 100644 index 0000000..ef88572 --- /dev/null +++ b/workbox-v3.6.3/workbox-background-sync.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-background-sync/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.backgroundSync = (function (DBWrapper_mjs,WorkboxError_mjs,logger_mjs,assert_mjs,getFriendlyURL_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:background-sync:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const serializableProperties = ['method', 'referrer', 'referrerPolicy', 'mode', 'credentials', 'cache', 'redirect', 'integrity', 'keepalive'];\n\n /**\n * A class to make it easier to serialize and de-serialize requests so they\n * can be stored in IndexedDB.\n *\n * @private\n */\n class StorableRequest {\n /**\n * Converts a Request object to a plain object that can be structured\n * cloned or JSON-stringified.\n *\n * @param {Request} request\n * @return {Promise}\n *\n * @private\n */\n static fromRequest(request) {\n return babelHelpers.asyncToGenerator(function* () {\n const requestInit = { headers: {} };\n\n // Set the body if present.\n if (request.method !== 'GET') {\n // Use blob to support non-text request bodies,\n // and clone first in case the caller still needs the request.\n requestInit.body = yield request.clone().blob();\n }\n\n // Convert the headers from an iterable to an object.\n for (const [key, value] of request.headers.entries()) {\n requestInit.headers[key] = value;\n }\n\n // Add all other serializable request properties\n for (const prop of serializableProperties) {\n if (request[prop] !== undefined) {\n requestInit[prop] = request[prop];\n }\n }\n\n return new StorableRequest({ url: request.url, requestInit });\n })();\n }\n\n /**\n * Accepts a URL and RequestInit dictionary that can be used to create a\n * new Request object. A timestamp is also generated so consumers can\n * reference when the object was created.\n *\n * @param {Object} param1\n * @param {string} param1.url\n * @param {Object} param1.requestInit\n * See: https://fetch.spec.whatwg.org/#requestinit\n * @param {number} param1.timestamp The time the request was created,\n * defaulting to the current time if not specified.\n *\n * @private\n */\n constructor({ url, requestInit, timestamp = Date.now() }) {\n this.url = url;\n this.requestInit = requestInit;\n\n // \"Private\"\n this._timestamp = timestamp;\n }\n\n /**\n * Gets the private _timestamp property.\n *\n * @return {number}\n *\n * @private\n */\n get timestamp() {\n return this._timestamp;\n }\n\n /**\n * Coverts this instance to a plain Object.\n *\n * @return {Object}\n *\n * @private\n */\n toObject() {\n return {\n url: this.url,\n timestamp: this.timestamp,\n requestInit: this.requestInit\n };\n }\n\n /**\n * Converts this instance to a Request.\n *\n * @return {Request}\n *\n * @private\n */\n toRequest() {\n return new Request(this.url, this.requestInit);\n }\n\n /**\n * Creates and returns a deep clone of the instance.\n *\n * @return {StorableRequest}\n *\n * @private\n */\n clone() {\n const requestInit = Object.assign({}, this.requestInit);\n requestInit.headers = Object.assign({}, this.requestInit.headers);\n if (this.requestInit.body) {\n requestInit.body = this.requestInit.body.slice();\n }\n\n return new StorableRequest({\n url: this.url,\n timestamp: this.timestamp,\n requestInit\n });\n }\n }\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const DB_NAME = 'workbox-background-sync';\n const OBJECT_STORE_NAME = 'requests';\n const INDEXED_PROP = 'queueName';\n const TAG_PREFIX = 'workbox-background-sync';\n const MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * A class to manage storing requests from a Queue in IndexedbDB,\n * indexed by their queue name for easier access.\n *\n * @private\n */\n class QueueStore {\n /**\n * Associates this instance with a Queue instance, so entries added can be\n * identified by their queue name.\n *\n * @param {Queue} queue\n *\n * @private\n */\n constructor(queue) {\n this._queue = queue;\n this._db = new DBWrapper_mjs.DBWrapper(DB_NAME, 1, {\n onupgradeneeded: evt => evt.target.result.createObjectStore(OBJECT_STORE_NAME, { autoIncrement: true }).createIndex(INDEXED_PROP, INDEXED_PROP, { unique: false })\n });\n }\n\n /**\n * Takes a StorableRequest instance, converts it to an object and adds it\n * as an entry in the object store.\n *\n * @param {StorableRequest} storableRequest\n *\n * @private\n */\n addEntry(storableRequest) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this._db.add(OBJECT_STORE_NAME, {\n queueName: _this._queue.name,\n storableRequest: storableRequest.toObject()\n });\n })();\n }\n\n /**\n * Gets the oldest entry in the object store, removes it, and returns the\n * value as a StorableRequest instance. If no entry exists, it returns\n * undefined.\n *\n * @return {StorableRequest|undefined}\n *\n * @private\n */\n getAndRemoveOldestEntry() {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const [entry] = yield _this2._db.getAllMatching(OBJECT_STORE_NAME, {\n index: INDEXED_PROP,\n query: IDBKeyRange.only(_this2._queue.name),\n count: 1,\n includeKeys: true\n });\n\n if (entry) {\n yield _this2._db.delete(OBJECT_STORE_NAME, entry.primaryKey);\n return new StorableRequest(entry.value.storableRequest);\n }\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const queueNames = new Set();\n\n /**\n * A class to manage storing failed requests in IndexedDB and retrying them\n * later. All parts of the storing and replaying process are observable via\n * callbacks.\n *\n * @memberof workbox.backgroundSync\n */\n class Queue {\n /**\n * Creates an instance of Queue with the given options\n *\n * @param {string} name The unique name for this queue. This name must be\n * unique as it's used to register sync events and store requests\n * in IndexedDB specific to this instance. An error will be thrown if\n * a duplicate name is detected.\n * @param {Object} [options]\n * @param {Object} [options.callbacks] Callbacks to observe the lifecycle of\n * queued requests. Use these to respond to or modify the requests\n * during the replay process.\n * @param {function(StorableRequest):undefined}\n * [options.callbacks.requestWillEnqueue]\n * Invoked immediately before the request is stored to IndexedDB. Use\n * this callback to modify request data at store time.\n * @param {function(StorableRequest):undefined}\n * [options.callbacks.requestWillReplay]\n * Invoked immediately before the request is re-fetched. Use this\n * callback to modify request data at fetch time.\n * @param {function(Array):undefined}\n * [options.callbacks.queueDidReplay]\n * Invoked after all requests in the queue have successfully replayed.\n * @param {number} [options.maxRetentionTime = 7 days] The amount of time (in\n * minutes) a request may be retried. After this amount of time has\n * passed, the request will be deleted from the queue.\n */\n constructor(name, {\n callbacks = {},\n maxRetentionTime = MAX_RETENTION_TIME\n } = {}) {\n // Ensure the store name is not already being used\n if (queueNames.has(name)) {\n throw new WorkboxError_mjs.WorkboxError('duplicate-queue-name', { name });\n } else {\n queueNames.add(name);\n }\n\n this._name = name;\n this._callbacks = callbacks;\n this._maxRetentionTime = maxRetentionTime;\n this._queueStore = new QueueStore(this);\n\n this._addSyncListener();\n }\n\n /**\n * @return {string}\n */\n get name() {\n return this._name;\n }\n\n /**\n * Stores the passed request into IndexedDB. The database used is\n * `workbox-background-sync` and the object store name is the same as\n * the name this instance was created with (to guarantee it's unique).\n *\n * @param {Request} request The request object to store.\n */\n addRequest(request) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'addRequest',\n paramName: 'request'\n });\n }\n\n const storableRequest = yield StorableRequest.fromRequest(request.clone());\n yield _this._runCallback('requestWillEnqueue', storableRequest);\n yield _this._queueStore.addEntry(storableRequest);\n yield _this._registerSync();\n {\n logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}' has been\n added to background sync queue '${_this._name}'.`);\n }\n })();\n }\n\n /**\n * Retrieves all stored requests in IndexedDB and retries them. If the\n * queue contained requests that were successfully replayed, the\n * `queueDidReplay` callback is invoked (which implies the queue is\n * now empty). If any of the requests fail, a new sync registration is\n * created to retry again later.\n */\n replayRequests() {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const now = Date.now();\n const replayedRequests = [];\n const failedRequests = [];\n\n let storableRequest;\n while (storableRequest = yield _this2._queueStore.getAndRemoveOldestEntry()) {\n // Make a copy so the unmodified request can be stored\n // in the event of a replay failure.\n const storableRequestClone = storableRequest.clone();\n\n // Ignore requests older than maxRetentionTime.\n const maxRetentionTimeInMs = _this2._maxRetentionTime * 60 * 1000;\n if (now - storableRequest.timestamp > maxRetentionTimeInMs) {\n continue;\n }\n\n yield _this2._runCallback('requestWillReplay', storableRequest);\n\n const replay = { request: storableRequest.toRequest() };\n\n try {\n // Clone the request before fetching so callbacks get an unused one.\n replay.response = yield fetch(replay.request.clone());\n {\n logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}'\n has been replayed`);\n }\n } catch (err) {\n {\n logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(storableRequest.url)}'\n failed to replay`);\n }\n replay.error = err;\n failedRequests.push(storableRequestClone);\n }\n\n replayedRequests.push(replay);\n }\n\n yield _this2._runCallback('queueDidReplay', replayedRequests);\n\n // If any requests failed, put the failed requests back in the queue\n // and rethrow the failed requests count.\n if (failedRequests.length) {\n yield Promise.all(failedRequests.map(function (storableRequest) {\n return _this2._queueStore.addEntry(storableRequest);\n }));\n\n throw new WorkboxError_mjs.WorkboxError('queue-replay-failed', { name: _this2._name, count: failedRequests.length });\n }\n })();\n }\n\n /**\n * Runs the passed callback if it exists.\n *\n * @private\n * @param {string} name The name of the callback on this._callbacks.\n * @param {...*} args The arguments to invoke the callback with.\n */\n _runCallback(name, ...args) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (typeof _this3._callbacks[name] === 'function') {\n yield _this3._callbacks[name].apply(null, args);\n }\n })();\n }\n\n /**\n * In sync-supporting browsers, this adds a listener for the sync event.\n * In non-sync-supporting browsers, this will retry the queue on service\n * worker startup.\n *\n * @private\n */\n _addSyncListener() {\n if ('sync' in registration) {\n self.addEventListener('sync', event => {\n if (event.tag === `${TAG_PREFIX}:${this._name}`) {\n {\n logger_mjs.logger.log(`Background sync for tag '${event.tag}'\n has been received, starting replay now`);\n }\n event.waitUntil(this.replayRequests());\n }\n });\n } else {\n {\n logger_mjs.logger.log(`Background sync replaying without background sync event`);\n }\n // If the browser doesn't support background sync, retry\n // every time the service worker starts up as a fallback.\n this.replayRequests();\n }\n }\n\n /**\n * Registers a sync event with a tag unique to this instance.\n *\n * @private\n */\n _registerSync() {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if ('sync' in registration) {\n try {\n yield registration.sync.register(`${TAG_PREFIX}:${_this4._name}`);\n } catch (err) {\n // This means the registration failed for some reason, possibly due to\n // the user disabling it.\n {\n logger_mjs.logger.warn(`Unable to register sync event for '${_this4._name}'.`, err);\n }\n }\n }\n })();\n }\n\n /**\n * Returns the set of queue names. This is primarily used to reset the list\n * of queue names in tests.\n *\n * @return {Set}\n *\n * @private\n */\n static get _queueNames() {\n return queueNames;\n }\n }\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * A class implementing the `fetchDidFail` lifecycle callback. This makes it\n * easier to add failed requests to a background sync Queue.\n *\n * @memberof workbox.backgroundSync\n */\n class Plugin {\n /**\n * @param {...*} queueArgs Args to forward to the composed Queue instance.\n * See the [Queue]{@link workbox.backgroundSync.Queue} documentation for\n * parameter details.\n */\n constructor(...queueArgs) {\n this._queue = new Queue(...queueArgs);\n this.fetchDidFail = this.fetchDidFail.bind(this);\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @private\n */\n fetchDidFail({ request }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this._queue.addRequest(request);\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var publicAPI = /*#__PURE__*/Object.freeze({\n Queue: Queue,\n Plugin: Plugin\n });\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n return publicAPI;\n\n}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-background-sync.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-background-sync.prod.js b/workbox-v3.6.3/workbox-background-sync.prod.js new file mode 100644 index 0000000..6278012 --- /dev/null +++ b/workbox-v3.6.3/workbox-background-sync.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.backgroundSync=function(e,t){"use strict";try{self.workbox.v["workbox:background-sync:3.6.3"]=1}catch(e){}const r=["method","referrer","referrerPolicy","mode","credentials","cache","redirect","integrity","keepalive"];class s{static fromRequest(e){return babelHelpers.asyncToGenerator(function*(){const t={headers:{}};"GET"!==e.method&&(t.body=yield e.clone().blob());for(const[r,s]of e.headers.entries())t.headers[r]=s;for(const s of r)void 0!==e[s]&&(t[s]=e[s]);return new s({url:e.url,requestInit:t})})()}constructor({url:e,requestInit:t,timestamp:r=Date.now()}){this.url=e,this.requestInit=t,this.e=r}get timestamp(){return this.e}toObject(){return{url:this.url,timestamp:this.timestamp,requestInit:this.requestInit}}toRequest(){return new Request(this.url,this.requestInit)}clone(){const e=Object.assign({},this.requestInit);return e.headers=Object.assign({},this.requestInit.headers),this.requestInit.body&&(e.body=this.requestInit.body.slice()),new s({url:this.url,timestamp:this.timestamp,requestInit:e})}}const i="workbox-background-sync",n="requests",u="queueName",c="workbox-background-sync",o=10080;class l{constructor(t){this.t=t,this.r=new e.DBWrapper(i,1,{onupgradeneeded:e=>e.target.result.createObjectStore(n,{autoIncrement:!0}).createIndex(u,u,{unique:!1})})}addEntry(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.add(n,{queueName:t.t.name,storableRequest:e.toObject()})})()}getAndRemoveOldestEntry(){var e=this;return babelHelpers.asyncToGenerator(function*(){const[t]=yield e.r.getAllMatching(n,{index:u,query:IDBKeyRange.only(e.t.name),count:1,includeKeys:!0});if(t)return yield e.r.delete(n,t.primaryKey),new s(t.value.storableRequest)})()}}const a=new Set;class h{constructor(e,{callbacks:r={},maxRetentionTime:s=o}={}){if(a.has(e))throw new t.WorkboxError("duplicate-queue-name",{name:e});a.add(e),this.s=e,this.i=r,this.n=s,this.u=new l(this),this.c()}get name(){return this.s}addRequest(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield s.fromRequest(e.clone());yield t.o("requestWillEnqueue",r),yield t.u.addEntry(r),yield t.l()})()}replayRequests(){var e=this;return babelHelpers.asyncToGenerator(function*(){const r=Date.now(),s=[],i=[];let n;for(;n=yield e.u.getAndRemoveOldestEntry();){const t=n.clone(),u=60*e.n*1e3;if(r-n.timestamp>u)continue;yield e.o("requestWillReplay",n);const c={request:n.toRequest()};try{c.response=yield fetch(c.request.clone())}catch(e){c.error=e,i.push(t)}s.push(c)}if(yield e.o("queueDidReplay",s),i.length)throw yield Promise.all(i.map(function(t){return e.u.addEntry(t)})),new t.WorkboxError("queue-replay-failed",{name:e.s,count:i.length})})()}o(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){"function"==typeof r.i[e]&&(yield r.i[e].apply(null,t))})()}c(){"sync"in registration?self.addEventListener("sync",e=>{e.tag===`${c}:${this.s}`&&e.waitUntil(this.replayRequests())}):this.replayRequests()}l(){var e=this;return babelHelpers.asyncToGenerator(function*(){if("sync"in registration)try{yield registration.sync.register(`${c}:${e.s}`)}catch(e){}})()}static get a(){return a}}return Object.freeze({Queue:h,Plugin:class{constructor(...e){this.t=new h(...e),this.fetchDidFail=this.fetchDidFail.bind(this)}fetchDidFail({request:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.t.addRequest(e)})()}}})}(workbox.core._private,workbox.core._private); + +//# sourceMappingURL=workbox-background-sync.prod.js.map diff --git a/workbox-v3.6.3/workbox-background-sync.prod.js.map b/workbox-v3.6.3/workbox-background-sync.prod.js.map new file mode 100644 index 0000000..6e08bb9 --- /dev/null +++ b/workbox-v3.6.3/workbox-background-sync.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-background-sync/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.backgroundSync=function(e,t){\"use strict\";try{self.workbox.v[\"workbox:background-sync:3.6.3\"]=1}catch(e){}const r=[\"method\",\"referrer\",\"referrerPolicy\",\"mode\",\"credentials\",\"cache\",\"redirect\",\"integrity\",\"keepalive\"];class s{static fromRequest(e){return babelHelpers.asyncToGenerator(function*(){const t={headers:{}};\"GET\"!==e.method&&(t.body=yield e.clone().blob());for(const[r,s]of e.headers.entries())t.headers[r]=s;for(const s of r)void 0!==e[s]&&(t[s]=e[s]);return new s({url:e.url,requestInit:t})})()}constructor({url:e,requestInit:t,timestamp:r=Date.now()}){this.url=e,this.requestInit=t,this.e=r}get timestamp(){return this.e}toObject(){return{url:this.url,timestamp:this.timestamp,requestInit:this.requestInit}}toRequest(){return new Request(this.url,this.requestInit)}clone(){const e=Object.assign({},this.requestInit);return e.headers=Object.assign({},this.requestInit.headers),this.requestInit.body&&(e.body=this.requestInit.body.slice()),new s({url:this.url,timestamp:this.timestamp,requestInit:e})}}const i=\"workbox-background-sync\",n=\"requests\",u=\"queueName\",c=\"workbox-background-sync\",o=10080;class l{constructor(t){this.t=t,this.r=new e.DBWrapper(i,1,{onupgradeneeded:e=>e.target.result.createObjectStore(n,{autoIncrement:!0}).createIndex(u,u,{unique:!1})})}addEntry(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.add(n,{queueName:t.t.name,storableRequest:e.toObject()})})()}getAndRemoveOldestEntry(){var e=this;return babelHelpers.asyncToGenerator(function*(){const[t]=yield e.r.getAllMatching(n,{index:u,query:IDBKeyRange.only(e.t.name),count:1,includeKeys:!0});if(t)return yield e.r.delete(n,t.primaryKey),new s(t.value.storableRequest)})()}}const a=new Set;class h{constructor(e,{callbacks:r={},maxRetentionTime:s=o}={}){if(a.has(e))throw new t.WorkboxError(\"duplicate-queue-name\",{name:e});a.add(e),this.s=e,this.i=r,this.n=s,this.u=new l(this),this.c()}get name(){return this.s}addRequest(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield s.fromRequest(e.clone());yield t.o(\"requestWillEnqueue\",r),yield t.u.addEntry(r),yield t.l()})()}replayRequests(){var e=this;return babelHelpers.asyncToGenerator(function*(){const r=Date.now(),s=[],i=[];let n;for(;n=yield e.u.getAndRemoveOldestEntry();){const t=n.clone(),u=60*e.n*1e3;if(r-n.timestamp>u)continue;yield e.o(\"requestWillReplay\",n);const c={request:n.toRequest()};try{c.response=yield fetch(c.request.clone())}catch(e){c.error=e,i.push(t)}s.push(c)}if(yield e.o(\"queueDidReplay\",s),i.length)throw yield Promise.all(i.map(function(t){return e.u.addEntry(t)})),new t.WorkboxError(\"queue-replay-failed\",{name:e.s,count:i.length})})()}o(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){\"function\"==typeof r.i[e]&&(yield r.i[e].apply(null,t))})()}c(){\"sync\"in registration?self.addEventListener(\"sync\",e=>{e.tag===`${c}:${this.s}`&&e.waitUntil(this.replayRequests())}):this.replayRequests()}l(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(\"sync\"in registration)try{yield registration.sync.register(`${c}:${e.s}`)}catch(e){}})()}static get a(){return a}}return Object.freeze({Queue:h,Plugin:class{constructor(...e){this.t=new h(...e),this.fetchDidFail=this.fetchDidFail.bind(this)}fetchDidFail({request:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.t.addRequest(e)})()}}})}(workbox.core._private,workbox.core._private);\n"],"file":"workbox-background-sync.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js b/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js new file mode 100644 index 0000000..3e779c1 --- /dev/null +++ b/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js @@ -0,0 +1,395 @@ +this.workbox = this.workbox || {}; +this.workbox.broadcastUpdate = (function (exports,WorkboxError_mjs,logger_mjs,assert_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:broadcast-cache-update:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Given two `Response's`, compares several header values to see if they are + * the same or not. + * + * @param {Response} firstResponse + * @param {Response} secondResponse + * @param {Array} headersToCheck + * @return {boolean} + * + * @memberof workbox.broadcastUpdate + * @private + */ + const responsesAreSame = (firstResponse, secondResponse, headersToCheck) => { + { + if (!(firstResponse instanceof Response && secondResponse instanceof Response)) { + throw new WorkboxError_mjs.WorkboxError('invalid-responses-are-same-args'); + } + } + + const atLeastOneHeaderAvailable = headersToCheck.some(header => { + return firstResponse.headers.has(header) && secondResponse.headers.has(header); + }); + + if (!atLeastOneHeaderAvailable) { + { + logger_mjs.logger.warn(`Unable to determine where the response has been updated ` + `because none of the headers that would be checked are present.`); + logger_mjs.logger.debug(`Attempting to compare the following: `, firstResponse, secondResponse, headersToCheck); + } + + // Just return true, indicating the that responses are the same, since we + // can't determine otherwise. + return true; + } + + return headersToCheck.every(header => { + const headerStateComparison = firstResponse.headers.has(header) === secondResponse.headers.has(header); + const headerValueComparison = firstResponse.headers.get(header) === secondResponse.headers.get(header); + + return headerStateComparison && headerValueComparison; + }); + }; + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var messageTypes = { + CACHE_UPDATED: 'CACHE_UPDATED' + }; + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * You would not normally call this method directly; it's called automatically + * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here + * for the benefit of developers who would rather not use the full + * `BroadcastCacheUpdate` implementation. + * + * Calling this will dispatch a message on the provided + * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel} + * to notify interested subscribers about a change to a cached resource. + * + * The message that's posted has a formation inspired by the + * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction) + * format like so: + * + * ``` + * { + * type: 'CACHE_UPDATED', + * meta: 'workbox-broadcast-cache-update', + * payload: { + * cacheName: 'the-cache-name', + * updatedUrl: 'https://example.com/' + * } + * } + * ``` + * + * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at + * all required.) + * + * @param {BroadcastChannel} channel The `BroadcastChannel` to use. + * @param {string} cacheName The name of the cache in which the updated + * `Response` was stored. + * @param {string} url The URL associated with the updated `Response`. + * @param {string} source A string identifying this library as the source + * of the update message. + * + * @memberof workbox.broadcastUpdate + */ + const broadcastUpdate = (channel, cacheName, url, source) => { + // There are browsers which support service workers but don't support the + // Broadcast Channel API. + // See https://github.com/GoogleChrome/workbox/issues/1304 + if (!('BroadcastChannel' in self && channel)) { + { + logger_mjs.logger.debug(`${url} was updated, but the Broadcast Channel API is not ` + `available in the current browser.`); + } + return; + } + + { + assert_mjs.assert.isInstance(channel, BroadcastChannel, { + moduleName: 'workbox-broadcast-cache-update', + className: '~', + funcName: 'broadcastUpdate', + paramName: 'channel' + }); + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-broadcast-cache-update', + className: '~', + funcName: 'broadcastUpdate', + paramName: 'cacheName' + }); + assert_mjs.assert.isType(url, 'string', { + moduleName: 'workbox-broadcast-cache-update', + className: '~', + funcName: 'broadcastUpdate', + paramName: 'url' + }); + assert_mjs.assert.isType(source, 'string', { + moduleName: 'workbox-broadcast-cache-update', + className: '~', + funcName: 'broadcastUpdate', + paramName: 'source' + }); + } + + channel.postMessage({ + type: messageTypes.CACHE_UPDATED, + meta: source, + payload: { + cacheName: cacheName, + updatedUrl: url + } + }); + }; + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel} + * to notify interested parties when a cached response has been updated. + * + * For efficiency's sake, the underlying response bodies are not compared; + * only specific response headers are checked. + * + * @memberof workbox.broadcastUpdate + */ + class BroadcastCacheUpdate { + /** + * Construct a BroadcastCacheUpdate instance with a specific `channelName` to + * broadcast messages on + * + * @param {string} channelName The name that will be used when creating + * the `BroadcastChannel`. + * @param {Object} options + * @param {Array} + * [options.headersToCheck=['content-length', 'etag', 'last-modified']] A + * list of headers that will be used to determine whether the responses + * differ. + * @param {string} [options.source='workbox-broadcast-cache-update'] An + * attribution value that indicates where the update originated. + */ + constructor(channelName, { headersToCheck, source } = {}) { + { + if (typeof channelName !== 'string' || channelName.length === 0) { + throw new WorkboxError_mjs.WorkboxError('channel-name-required'); + } + } + + this._channelName = channelName; + this._headersToCheck = headersToCheck || ['content-length', 'etag', 'last-modified']; + this._source = source || 'workbox-broadcast-cache-update'; + + // TODO assert typeof headersToCheck instanceof Array + } + + /** + * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for + * broadcasting updates, or undefined if the browser doesn't support the + * Broadcast Channel API. + * + * @private + */ + _getChannel() { + if ('BroadcastChannel' in self && !this._channel) { + this._channel = new BroadcastChannel(this._channelName); + } + return this._channel; + } + + /** + * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response) + * and send a message via the + * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API} + * if they differ. + * + * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}. + * + * @param {Response} firstResponse First responses to compare. + * @param {Response} secondResponse Second responses to compare. + * @param {string} url The URL of the updated request. + * @param {string} cacheName Name of the cache the responses belong to. + * This is included in the message posted on the broadcast channel. + */ + notifyIfUpdated(firstResponse, secondResponse, url, cacheName) { + if (!responsesAreSame(firstResponse, secondResponse, this._headersToCheck)) { + broadcastUpdate(this._getChannel(), cacheName, url, this._source); + } + } + } + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * This plugin will automatically broadcast a message whenever a cached response + * is updated. + * + * @memberof workbox.broadcastUpdate + */ + class Plugin { + /** + * Construct a new instance with a specific `channelName` to + * broadcast messages on + * + * @param {string} channelName The name that will be used when creating + * the `BroadcastChannel`. + * @param {Object} options + * @param {Array} + * [options.headersToCheck=['content-length', 'etag', 'last-modified']] A + * list of headers that will be used to determine whether the responses + * differ. + * @param {string} [options.source='workbox-broadcast-cache-update'] An + * attribution value that indicates where the update originated. + */ + constructor(channelName, options) { + this._broadcastUpdate = new BroadcastCacheUpdate(channelName, options); + } + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is + * added to a cache. + * + * @private + * @param {Object} options The input object to this function. + * @param {string} options.cacheName Name of the cache being updated. + * @param {Response} [options.oldResponse] The previous cached value, if any. + * @param {Response} options.newResponse The new value in the cache. + */ + cacheDidUpdate({ cacheName, oldResponse, newResponse, request }) { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-broadcast-cache-update', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'cacheName' + }); + assert_mjs.assert.isInstance(newResponse, Response, { + moduleName: 'workbox-broadcast-cache-update', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'newResponse' + }); + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-broadcast-cache-update', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'request' + }); + } + + if (!oldResponse) { + // Without a two responses there is nothing to compare. + return; + } + + this._broadcastUpdate.notifyIfUpdated(oldResponse, newResponse, request.url, cacheName); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.BroadcastCacheUpdate = BroadcastCacheUpdate; + exports.Plugin = Plugin; + exports.broadcastUpdate = broadcastUpdate; + exports.messageTypes = messageTypes; + + return exports; + +}({},workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-broadcast-cache-update.dev.js.map diff --git a/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js.map b/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js.map new file mode 100644 index 0000000..aa0dd03 --- /dev/null +++ b/workbox-v3.6.3/workbox-broadcast-cache-update.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-broadcast-cache-update/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.broadcastUpdate = (function (exports,WorkboxError_mjs,logger_mjs,assert_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:broadcast-cache-update:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Given two `Response's`, compares several header values to see if they are\n * the same or not.\n *\n * @param {Response} firstResponse\n * @param {Response} secondResponse\n * @param {Array} headersToCheck\n * @return {boolean}\n *\n * @memberof workbox.broadcastUpdate\n * @private\n */\n const responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {\n {\n if (!(firstResponse instanceof Response && secondResponse instanceof Response)) {\n throw new WorkboxError_mjs.WorkboxError('invalid-responses-are-same-args');\n }\n }\n\n const atLeastOneHeaderAvailable = headersToCheck.some(header => {\n return firstResponse.headers.has(header) && secondResponse.headers.has(header);\n });\n\n if (!atLeastOneHeaderAvailable) {\n {\n logger_mjs.logger.warn(`Unable to determine where the response has been updated ` + `because none of the headers that would be checked are present.`);\n logger_mjs.logger.debug(`Attempting to compare the following: `, firstResponse, secondResponse, headersToCheck);\n }\n\n // Just return true, indicating the that responses are the same, since we\n // can't determine otherwise.\n return true;\n }\n\n return headersToCheck.every(header => {\n const headerStateComparison = firstResponse.headers.has(header) === secondResponse.headers.has(header);\n const headerValueComparison = firstResponse.headers.get(header) === secondResponse.headers.get(header);\n\n return headerStateComparison && headerValueComparison;\n });\n };\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var messageTypes = {\n CACHE_UPDATED: 'CACHE_UPDATED'\n };\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * You would not normally call this method directly; it's called automatically\n * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here\n * for the benefit of developers who would rather not use the full\n * `BroadcastCacheUpdate` implementation.\n *\n * Calling this will dispatch a message on the provided\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}\n * to notify interested subscribers about a change to a cached resource.\n *\n * The message that's posted has a formation inspired by the\n * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)\n * format like so:\n *\n * ```\n * {\n * type: 'CACHE_UPDATED',\n * meta: 'workbox-broadcast-cache-update',\n * payload: {\n * cacheName: 'the-cache-name',\n * updatedUrl: 'https://example.com/'\n * }\n * }\n * ```\n *\n * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at\n * all required.)\n *\n * @param {BroadcastChannel} channel The `BroadcastChannel` to use.\n * @param {string} cacheName The name of the cache in which the updated\n * `Response` was stored.\n * @param {string} url The URL associated with the updated `Response`.\n * @param {string} source A string identifying this library as the source\n * of the update message.\n *\n * @memberof workbox.broadcastUpdate\n */\n const broadcastUpdate = (channel, cacheName, url, source) => {\n // There are browsers which support service workers but don't support the\n // Broadcast Channel API.\n // See https://github.com/GoogleChrome/workbox/issues/1304\n if (!('BroadcastChannel' in self && channel)) {\n {\n logger_mjs.logger.debug(`${url} was updated, but the Broadcast Channel API is not ` + `available in the current browser.`);\n }\n return;\n }\n\n {\n assert_mjs.assert.isInstance(channel, BroadcastChannel, {\n moduleName: 'workbox-broadcast-cache-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'channel'\n });\n assert_mjs.assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-cache-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'cacheName'\n });\n assert_mjs.assert.isType(url, 'string', {\n moduleName: 'workbox-broadcast-cache-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'url'\n });\n assert_mjs.assert.isType(source, 'string', {\n moduleName: 'workbox-broadcast-cache-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'source'\n });\n }\n\n channel.postMessage({\n type: messageTypes.CACHE_UPDATED,\n meta: source,\n payload: {\n cacheName: cacheName,\n updatedUrl: url\n }\n });\n };\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}\n * to notify interested parties when a cached response has been updated.\n *\n * For efficiency's sake, the underlying response bodies are not compared;\n * only specific response headers are checked.\n *\n * @memberof workbox.broadcastUpdate\n */\n class BroadcastCacheUpdate {\n /**\n * Construct a BroadcastCacheUpdate instance with a specific `channelName` to\n * broadcast messages on\n *\n * @param {string} channelName The name that will be used when creating\n * the `BroadcastChannel`.\n * @param {Object} options\n * @param {Array}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']] A\n * list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.source='workbox-broadcast-cache-update'] An\n * attribution value that indicates where the update originated.\n */\n constructor(channelName, { headersToCheck, source } = {}) {\n {\n if (typeof channelName !== 'string' || channelName.length === 0) {\n throw new WorkboxError_mjs.WorkboxError('channel-name-required');\n }\n }\n\n this._channelName = channelName;\n this._headersToCheck = headersToCheck || ['content-length', 'etag', 'last-modified'];\n this._source = source || 'workbox-broadcast-cache-update';\n\n // TODO assert typeof headersToCheck instanceof Array\n }\n\n /**\n * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for\n * broadcasting updates, or undefined if the browser doesn't support the\n * Broadcast Channel API.\n *\n * @private\n */\n _getChannel() {\n if ('BroadcastChannel' in self && !this._channel) {\n this._channel = new BroadcastChannel(this._channelName);\n }\n return this._channel;\n }\n\n /**\n * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * and send a message via the\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}\n * if they differ.\n *\n * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.\n *\n * @param {Response} firstResponse First responses to compare.\n * @param {Response} secondResponse Second responses to compare.\n * @param {string} url The URL of the updated request.\n * @param {string} cacheName Name of the cache the responses belong to.\n * This is included in the message posted on the broadcast channel.\n */\n notifyIfUpdated(firstResponse, secondResponse, url, cacheName) {\n if (!responsesAreSame(firstResponse, secondResponse, this._headersToCheck)) {\n broadcastUpdate(this._getChannel(), cacheName, url, this._source);\n }\n }\n }\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * This plugin will automatically broadcast a message whenever a cached response\n * is updated.\n *\n * @memberof workbox.broadcastUpdate\n */\n class Plugin {\n /**\n * Construct a new instance with a specific `channelName` to\n * broadcast messages on\n *\n * @param {string} channelName The name that will be used when creating\n * the `BroadcastChannel`.\n * @param {Object} options\n * @param {Array}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']] A\n * list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.source='workbox-broadcast-cache-update'] An\n * attribution value that indicates where the update originated.\n */\n constructor(channelName, options) {\n this._broadcastUpdate = new BroadcastCacheUpdate(channelName, options);\n }\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is\n * added to a cache.\n *\n * @private\n * @param {Object} options The input object to this function.\n * @param {string} options.cacheName Name of the cache being updated.\n * @param {Response} [options.oldResponse] The previous cached value, if any.\n * @param {Response} options.newResponse The new value in the cache.\n */\n cacheDidUpdate({ cacheName, oldResponse, newResponse, request }) {\n {\n assert_mjs.assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-cache-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName'\n });\n assert_mjs.assert.isInstance(newResponse, Response, {\n moduleName: 'workbox-broadcast-cache-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'newResponse'\n });\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-broadcast-cache-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request'\n });\n }\n\n if (!oldResponse) {\n // Without a two responses there is nothing to compare.\n return;\n }\n\n this._broadcastUpdate.notifyIfUpdated(oldResponse, newResponse, request.url, cacheName);\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.BroadcastCacheUpdate = BroadcastCacheUpdate;\n exports.Plugin = Plugin;\n exports.broadcastUpdate = broadcastUpdate;\n exports.messageTypes = messageTypes;\n\n return exports;\n\n}({},workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-broadcast-cache-update.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js b/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js new file mode 100644 index 0000000..d1b1997 --- /dev/null +++ b/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(t){"use strict";try{self.workbox.v["workbox:broadcast-cache-update:3.6.3"]=1}catch(t){}const e=(t,e,s)=>{return!s.some(s=>t.headers.has(s)&&e.headers.has(s))||s.every(s=>{const a=t.headers.has(s)===e.headers.has(s),n=t.headers.get(s)===e.headers.get(s);return a&&n})};var s={CACHE_UPDATED:"CACHE_UPDATED"};const a=(t,e,a,n)=>{"BroadcastChannel"in self&&t&&t.postMessage({type:s.CACHE_UPDATED,meta:n,payload:{cacheName:e,updatedUrl:a}})};class n{constructor(t,{headersToCheck:e,source:s}={}){this.t=t,this.e=e||["content-length","etag","last-modified"],this.s=s||"workbox-broadcast-cache-update"}a(){return"BroadcastChannel"in self&&!this.n&&(this.n=new BroadcastChannel(this.t)),this.n}notifyIfUpdated(t,s,n,c){e(t,s,this.e)||a(this.a(),c,n,this.s)}}return t.BroadcastCacheUpdate=n,t.Plugin=class{constructor(t,e){this.c=new n(t,e)}cacheDidUpdate({cacheName:t,oldResponse:e,newResponse:s,request:a}){e&&this.c.notifyIfUpdated(e,s,a.url,t)}},t.broadcastUpdate=a,t.messageTypes=s,t}({}); + +//# sourceMappingURL=workbox-broadcast-cache-update.prod.js.map diff --git a/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js.map b/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js.map new file mode 100644 index 0000000..2c5bd98 --- /dev/null +++ b/workbox-v3.6.3/workbox-broadcast-cache-update.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-broadcast-cache-update/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(t){\"use strict\";try{self.workbox.v[\"workbox:broadcast-cache-update:3.6.3\"]=1}catch(t){}const e=(t,e,s)=>{return!s.some(s=>t.headers.has(s)&&e.headers.has(s))||s.every(s=>{const a=t.headers.has(s)===e.headers.has(s),n=t.headers.get(s)===e.headers.get(s);return a&&n})};var s={CACHE_UPDATED:\"CACHE_UPDATED\"};const a=(t,e,a,n)=>{\"BroadcastChannel\"in self&&t&&t.postMessage({type:s.CACHE_UPDATED,meta:n,payload:{cacheName:e,updatedUrl:a}})};class n{constructor(t,{headersToCheck:e,source:s}={}){this.t=t,this.e=e||[\"content-length\",\"etag\",\"last-modified\"],this.s=s||\"workbox-broadcast-cache-update\"}a(){return\"BroadcastChannel\"in self&&!this.n&&(this.n=new BroadcastChannel(this.t)),this.n}notifyIfUpdated(t,s,n,c){e(t,s,this.e)||a(this.a(),c,n,this.s)}}return t.BroadcastCacheUpdate=n,t.Plugin=class{constructor(t,e){this.c=new n(t,e)}cacheDidUpdate({cacheName:t,oldResponse:e,newResponse:s,request:a}){e&&this.c.notifyIfUpdated(e,s,a.url,t)}},t.broadcastUpdate=a,t.messageTypes=s,t}({});\n"],"file":"workbox-broadcast-cache-update.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-cache-expiration.dev.js b/workbox-v3.6.3/workbox-cache-expiration.dev.js new file mode 100644 index 0000000..0f10a31 --- /dev/null +++ b/workbox-v3.6.3/workbox-cache-expiration.dev.js @@ -0,0 +1,740 @@ +this.workbox = this.workbox || {}; +this.workbox.expiration = (function (exports,DBWrapper_mjs,WorkboxError_mjs,assert_mjs,logger_mjs,cacheNames_mjs,index_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:cache-expiration:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const URL_KEY = 'url'; + const TIMESTAMP_KEY = 'timestamp'; + + /** + * Returns the timestamp model. + * + * @private + */ + class CacheTimestampsModel { + /** + * + * @param {string} cacheName + * + * @private + */ + constructor(cacheName) { + // TODO Check cacheName + + this._cacheName = cacheName; + this._storeName = cacheName; + + this._db = new DBWrapper_mjs.DBWrapper(this._cacheName, 2, { + onupgradeneeded: evt => this._handleUpgrade(evt) + }); + } + + /** + * Should perform an upgrade of indexedDB. + * + * @param {Event} evt + * + * @private + */ + _handleUpgrade(evt) { + const db = evt.target.result; + if (evt.oldVersion < 2) { + // Remove old databases. + if (db.objectStoreNames.contains('workbox-cache-expiration')) { + db.deleteObjectStore('workbox-cache-expiration'); + } + } + + db.createObjectStore(this._storeName, { keyPath: URL_KEY }).createIndex(TIMESTAMP_KEY, TIMESTAMP_KEY, { unique: false }); + } + + /** + * @param {string} url + * @param {number} timestamp + * + * @private + */ + setTimestamp(url, timestamp) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this._db.put(_this._storeName, { + [URL_KEY]: new URL(url, location).href, + [TIMESTAMP_KEY]: timestamp + }); + })(); + } + + /** + * Get all of the timestamps in the indexedDB. + * + * @return {Array} + * + * @private + */ + getAllTimestamps() { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + return yield _this2._db.getAllMatching(_this2._storeName, { + index: TIMESTAMP_KEY + }); + })(); + } + + /** + * Returns the timestamp stored for a given URL. + * + * @param {string} url + * @return {number} + * + * @private + */ + getTimestamp(url) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + const timestampObject = yield _this3._db.get(_this3._storeName, url); + return timestampObject.timestamp; + })(); + } + + /** + * @param {string} url + * + * @private + */ + deleteUrl(url) { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this4._db.delete(_this4._storeName, new URL(url, location).href); + })(); + } + + /** + * Removes the underlying IndexedDB object store entirely. + */ + delete() { + var _this5 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this5._db.deleteDatabase(); + _this5._db = null; + })(); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * The `CacheExpiration` class allows you define an expiration and / or + * limit on the number of responses stored in a + * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache). + * + * @memberof workbox.expiration + */ + class CacheExpiration { + /** + * To construct a new CacheExpiration instance you must provide at least + * one of the `config` properties. + * + * @param {string} cacheName Name of the cache to apply restrictions to. + * @param {Object} config + * @param {number} [config.maxEntries] The maximum number of entries to cache. + * Entries used the least will be removed as the maximum is reached. + * @param {number} [config.maxAgeSeconds] The maximum age of an entry before + * it's treated as stale and removed. + */ + constructor(cacheName, config = {}) { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-cache-expiration', + className: 'CacheExpiration', + funcName: 'constructor', + paramName: 'cacheName' + }); + + if (!(config.maxEntries || config.maxAgeSeconds)) { + throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', { + moduleName: 'workbox-cache-expiration', + className: 'CacheExpiration', + funcName: 'constructor' + }); + } + + if (config.maxEntries) { + assert_mjs.assert.isType(config.maxEntries, 'number', { + moduleName: 'workbox-cache-expiration', + className: 'CacheExpiration', + funcName: 'constructor', + paramName: 'config.maxEntries' + }); + + // TODO: Assert is positive + } + + if (config.maxAgeSeconds) { + assert_mjs.assert.isType(config.maxAgeSeconds, 'number', { + moduleName: 'workbox-cache-expiration', + className: 'CacheExpiration', + funcName: 'constructor', + paramName: 'config.maxAgeSeconds' + }); + + // TODO: Assert is positive + } + } + + this._isRunning = false; + this._rerunRequested = false; + this._maxEntries = config.maxEntries; + this._maxAgeSeconds = config.maxAgeSeconds; + this._cacheName = cacheName; + this._timestampModel = new CacheTimestampsModel(cacheName); + } + + /** + * Expires entries for the given cache and given criteria. + */ + expireEntries() { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + if (_this._isRunning) { + _this._rerunRequested = true; + return; + } + _this._isRunning = true; + + const now = Date.now(); + + // First, expire old entries, if maxAgeSeconds is set. + const oldEntries = yield _this._findOldEntries(now); + + // Once that's done, check for the maximum size. + const extraEntries = yield _this._findExtraEntries(); + + // Use a Set to remove any duplicates following the concatenation, then + // convert back into an array. + const allUrls = [...new Set(oldEntries.concat(extraEntries))]; + + yield Promise.all([_this._deleteFromCache(allUrls), _this._deleteFromIDB(allUrls)]); + + { + // TODO: break apart entries deleted due to expiration vs size restraints + if (allUrls.length > 0) { + logger_mjs.logger.groupCollapsed(`Expired ${allUrls.length} ` + `${allUrls.length === 1 ? 'entry' : 'entries'} and removed ` + `${allUrls.length === 1 ? 'it' : 'them'} from the ` + `'${_this._cacheName}' cache.`); + logger_mjs.logger.log(`Expired the following ${allUrls.length === 1 ? 'URL' : 'URLs'}:`); + allUrls.forEach(function (url) { + return logger_mjs.logger.log(` ${url}`); + }); + logger_mjs.logger.groupEnd(); + } else { + logger_mjs.logger.debug(`Cache expiration ran and found no entries to remove.`); + } + } + + _this._isRunning = false; + if (_this._rerunRequested) { + _this._rerunRequested = false; + _this.expireEntries(); + } + })(); + } + + /** + * Expires entries based on the maximum age. + * + * @param {number} expireFromTimestamp A timestamp. + * @return {Promise>} A list of the URLs that were expired. + * + * @private + */ + _findOldEntries(expireFromTimestamp) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isType(expireFromTimestamp, 'number', { + moduleName: 'workbox-cache-expiration', + className: 'CacheExpiration', + funcName: '_findOldEntries', + paramName: 'expireFromTimestamp' + }); + } + + if (!_this2._maxAgeSeconds) { + return []; + } + + const expireOlderThan = expireFromTimestamp - _this2._maxAgeSeconds * 1000; + const timestamps = yield _this2._timestampModel.getAllTimestamps(); + const expiredUrls = []; + timestamps.forEach(function (timestampDetails) { + if (timestampDetails.timestamp < expireOlderThan) { + expiredUrls.push(timestampDetails.url); + } + }); + + return expiredUrls; + })(); + } + + /** + * @return {Promise} + * + * @private + */ + _findExtraEntries() { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + const extraUrls = []; + + if (!_this3._maxEntries) { + return []; + } + + const timestamps = yield _this3._timestampModel.getAllTimestamps(); + while (timestamps.length > _this3._maxEntries) { + const lastUsed = timestamps.shift(); + extraUrls.push(lastUsed.url); + } + + return extraUrls; + })(); + } + + /** + * @param {Array} urls Array of URLs to delete from cache. + * + * @private + */ + _deleteFromCache(urls) { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + const cache = yield caches.open(_this4._cacheName); + for (const url of urls) { + yield cache.delete(url); + } + })(); + } + + /** + * @param {Array} urls Array of URLs to delete from IDB + * + * @private + */ + _deleteFromIDB(urls) { + var _this5 = this; + + return babelHelpers.asyncToGenerator(function* () { + for (const url of urls) { + yield _this5._timestampModel.deleteUrl(url); + } + })(); + } + + /** + * Update the timestamp for the given URL. This ensures the when + * removing entries based on maximum entries, most recently used + * is accurate or when expiring, the timestamp is up-to-date. + * + * @param {string} url + */ + updateTimestamp(url) { + var _this6 = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isType(url, 'string', { + moduleName: 'workbox-cache-expiration', + className: 'CacheExpiration', + funcName: 'updateTimestamp', + paramName: 'url' + }); + } + + const urlObject = new URL(url, location); + urlObject.hash = ''; + + yield _this6._timestampModel.setTimestamp(urlObject.href, Date.now()); + })(); + } + + /** + * Can be used to check if a URL has expired or not before it's used. + * + * This requires a look up from IndexedDB, so can be slow. + * + * Note: This method will not remove the cached entry, call + * `expireEntries()` to remove indexedDB and Cache entries. + * + * @param {string} url + * @return {boolean} + */ + isURLExpired(url) { + var _this7 = this; + + return babelHelpers.asyncToGenerator(function* () { + if (!_this7._maxAgeSeconds) { + throw new WorkboxError_mjs.WorkboxError(`expired-test-without-max-age`, { + methodName: 'isURLExpired', + paramName: 'maxAgeSeconds' + }); + } + const urlObject = new URL(url, location); + urlObject.hash = ''; + + const timestamp = yield _this7._timestampModel.getTimestamp(urlObject.href); + const expireOlderThan = Date.now() - _this7._maxAgeSeconds * 1000; + return timestamp < expireOlderThan; + })(); + } + + /** + * Removes the IndexedDB object store used to keep track of cache expiration + * metadata. + */ + delete() { + var _this8 = this; + + return babelHelpers.asyncToGenerator(function* () { + // Make sure we don't attempt another rerun if we're called in the middle of + // a cache expiration. + _this8._rerunRequested = false; + yield _this8._timestampModel.delete(); + })(); + } + } + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * This plugin can be used in the Workbox APIs to regularly enforce a + * limit on the age and / or the number of cached requests. + * + * Whenever a cached request is used or updated, this plugin will look + * at the used Cache and remove any old or extra requests. + * + * When using `maxAgeSeconds`, requests may be used *once* after expiring + * because the expiration clean up will not have occurred until *after* the + * cached request has been used. If the request has a "Date" header, then + * a light weight expiration check is performed and the request will not be + * used immediately. + * + * When using `maxEntries`, the last request to be used will be the request + * that is removed from the Cache. + * + * @memberof workbox.expiration + */ + class Plugin { + /** + * @param {Object} config + * @param {number} [config.maxEntries] The maximum number of entries to cache. + * Entries used the least will be removed as the maximum is reached. + * @param {number} [config.maxAgeSeconds] The maximum age of an entry before + * it's treated as stale and removed. + * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to + * automatic deletion if the available storage quota has been exceeded. + */ + constructor(config = {}) { + { + if (!(config.maxEntries || config.maxAgeSeconds)) { + throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', { + moduleName: 'workbox-cache-expiration', + className: 'Plugin', + funcName: 'constructor' + }); + } + + if (config.maxEntries) { + assert_mjs.assert.isType(config.maxEntries, 'number', { + moduleName: 'workbox-cache-expiration', + className: 'Plugin', + funcName: 'constructor', + paramName: 'config.maxEntries' + }); + } + + if (config.maxAgeSeconds) { + assert_mjs.assert.isType(config.maxAgeSeconds, 'number', { + moduleName: 'workbox-cache-expiration', + className: 'Plugin', + funcName: 'constructor', + paramName: 'config.maxAgeSeconds' + }); + } + } + + this._config = config; + this._maxAgeSeconds = config.maxAgeSeconds; + this._cacheExpirations = new Map(); + + if (config.purgeOnQuotaError) { + index_mjs.registerQuotaErrorCallback(() => this.deleteCacheAndMetadata()); + } + } + + /** + * A simple helper method to return a CacheExpiration instance for a given + * cache name. + * + * @param {string} cacheName + * @return {CacheExpiration} + * + * @private + */ + _getCacheExpiration(cacheName) { + if (cacheName === cacheNames_mjs.cacheNames.getRuntimeName()) { + throw new WorkboxError_mjs.WorkboxError('expire-custom-caches-only'); + } + + let cacheExpiration = this._cacheExpirations.get(cacheName); + if (!cacheExpiration) { + cacheExpiration = new CacheExpiration(cacheName, this._config); + this._cacheExpirations.set(cacheName, cacheExpiration); + } + return cacheExpiration; + } + + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox.runtimeCaching` handlers when a `Response` is about to be returned + * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to + * the handler. It allows the `Response` to be inspected for freshness and + * prevents it from being used if the `Response`'s `Date` header value is + * older than the configured `maxAgeSeconds`. + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache the response is in. + * @param {Response} options.cachedResponse The `Response` object that's been + * read from a cache and whose freshness should be checked. + * @return {Response} Either the `cachedResponse`, if it's + * fresh, or `null` if the `Response` is older than `maxAgeSeconds`. + * + * @private + */ + cachedResponseWillBeUsed({ cacheName, cachedResponse }) { + if (!cachedResponse) { + return null; + } + + let isFresh = this._isResponseDateFresh(cachedResponse); + + // Expire entries to ensure that even if the expiration date has + // expired, it'll only be used once. + const cacheExpiration = this._getCacheExpiration(cacheName); + cacheExpiration.expireEntries(); + + return isFresh ? cachedResponse : null; + } + + /** + * @param {Response} cachedResponse + * @return {boolean} + * + * @private + */ + _isResponseDateFresh(cachedResponse) { + if (!this._maxAgeSeconds) { + // We aren't expiring by age, so return true, it's fresh + return true; + } + + // Check if the 'date' header will suffice a quick expiration check. + // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for + // discussion. + const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse); + if (dateHeaderTimestamp === null) { + // Unable to parse date, so assume it's fresh. + return true; + } + + // If we have a valid headerTime, then our response is fresh iff the + // headerTime plus maxAgeSeconds is greater than the current time. + const now = Date.now(); + return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000; + } + + /** + * This method will extract the data header and parse it into a useful + * value. + * + * @param {Response} cachedResponse + * @return {number} + * + * @private + */ + _getDateHeaderTimestamp(cachedResponse) { + if (!cachedResponse.headers.has('date')) { + return null; + } + + const dateHeader = cachedResponse.headers.get('date'); + const parsedDate = new Date(dateHeader); + const headerTime = parsedDate.getTime(); + + // If the Date header was invalid for some reason, parsedDate.getTime() + // will return NaN. + if (isNaN(headerTime)) { + return null; + } + + return headerTime; + } + + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox.runtimeCaching` handlers when an entry is added to a cache. + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache that was updated. + * @param {string} options.request The Request for the cached entry. + * + * @private + */ + cacheDidUpdate({ cacheName, request }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-cache-expiration', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'cacheName' + }); + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-cache-expiration', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'request' + }); + } + + const cacheExpiration = _this._getCacheExpiration(cacheName); + yield cacheExpiration.updateTimestamp(request.url); + yield cacheExpiration.expireEntries(); + })(); + } + + /** + * This is a helper method that performs two operations: + * + * - Deletes *all* the underlying Cache instances associated with this plugin + * instance, by calling caches.delete() on you behalf. + * - Deletes the metadata from IndexedDB used to keep track of expiration + * details for each Cache instance. + * + * When using cache expiration, calling this method is preferable to calling + * `caches.delete()` directly, since this will ensure that the IndexedDB + * metadata is also cleanly removed and open IndexedDB instances are deleted. + * + * Note that if you're *not* using cache expiration for a given cache, calling + * `caches.delete()` and passing in the cache's name should be sufficient. + * There is no Workbox-specific method needed for cleanup in that case. + */ + deleteCacheAndMetadata() { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + // Do this one at a time instead of all at once via `Promise.all()` to + // reduce the chance of inconsistency if a promise rejects. + for (const [cacheName, cacheExpiration] of _this2._cacheExpirations) { + yield caches.delete(cacheName); + yield cacheExpiration.delete(); + } + + // Reset this._cacheExpirations to its initial state. + _this2._cacheExpirations = new Map(); + })(); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.CacheExpiration = CacheExpiration; + exports.Plugin = Plugin; + + return exports; + +}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core)); + +//# sourceMappingURL=workbox-cache-expiration.dev.js.map diff --git a/workbox-v3.6.3/workbox-cache-expiration.dev.js.map b/workbox-v3.6.3/workbox-cache-expiration.dev.js.map new file mode 100644 index 0000000..adf1df9 --- /dev/null +++ b/workbox-v3.6.3/workbox-cache-expiration.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-cache-expiration/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.expiration = (function (exports,DBWrapper_mjs,WorkboxError_mjs,assert_mjs,logger_mjs,cacheNames_mjs,index_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:cache-expiration:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const URL_KEY = 'url';\n const TIMESTAMP_KEY = 'timestamp';\n\n /**\n * Returns the timestamp model.\n *\n * @private\n */\n class CacheTimestampsModel {\n /**\n *\n * @param {string} cacheName\n *\n * @private\n */\n constructor(cacheName) {\n // TODO Check cacheName\n\n this._cacheName = cacheName;\n this._storeName = cacheName;\n\n this._db = new DBWrapper_mjs.DBWrapper(this._cacheName, 2, {\n onupgradeneeded: evt => this._handleUpgrade(evt)\n });\n }\n\n /**\n * Should perform an upgrade of indexedDB.\n *\n * @param {Event} evt\n *\n * @private\n */\n _handleUpgrade(evt) {\n const db = evt.target.result;\n if (evt.oldVersion < 2) {\n // Remove old databases.\n if (db.objectStoreNames.contains('workbox-cache-expiration')) {\n db.deleteObjectStore('workbox-cache-expiration');\n }\n }\n\n db.createObjectStore(this._storeName, { keyPath: URL_KEY }).createIndex(TIMESTAMP_KEY, TIMESTAMP_KEY, { unique: false });\n }\n\n /**\n * @param {string} url\n * @param {number} timestamp\n *\n * @private\n */\n setTimestamp(url, timestamp) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this._db.put(_this._storeName, {\n [URL_KEY]: new URL(url, location).href,\n [TIMESTAMP_KEY]: timestamp\n });\n })();\n }\n\n /**\n * Get all of the timestamps in the indexedDB.\n *\n * @return {Array}\n *\n * @private\n */\n getAllTimestamps() {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n return yield _this2._db.getAllMatching(_this2._storeName, {\n index: TIMESTAMP_KEY\n });\n })();\n }\n\n /**\n * Returns the timestamp stored for a given URL.\n *\n * @param {string} url\n * @return {number}\n *\n * @private\n */\n getTimestamp(url) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const timestampObject = yield _this3._db.get(_this3._storeName, url);\n return timestampObject.timestamp;\n })();\n }\n\n /**\n * @param {string} url\n *\n * @private\n */\n deleteUrl(url) {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this4._db.delete(_this4._storeName, new URL(url, location).href);\n })();\n }\n\n /**\n * Removes the underlying IndexedDB object store entirely.\n */\n delete() {\n var _this5 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this5._db.deleteDatabase();\n _this5._db = null;\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * The `CacheExpiration` class allows you define an expiration and / or\n * limit on the number of responses stored in a\n * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).\n *\n * @memberof workbox.expiration\n */\n class CacheExpiration {\n /**\n * To construct a new CacheExpiration instance you must provide at least\n * one of the `config` properties.\n *\n * @param {string} cacheName Name of the cache to apply restrictions to.\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n */\n constructor(cacheName, config = {}) {\n {\n assert_mjs.assert.isType(cacheName, 'string', {\n moduleName: 'workbox-cache-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'cacheName'\n });\n\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-cache-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor'\n });\n }\n\n if (config.maxEntries) {\n assert_mjs.assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-cache-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxEntries'\n });\n\n // TODO: Assert is positive\n }\n\n if (config.maxAgeSeconds) {\n assert_mjs.assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-cache-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds'\n });\n\n // TODO: Assert is positive\n }\n }\n\n this._isRunning = false;\n this._rerunRequested = false;\n this._maxEntries = config.maxEntries;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheName = cacheName;\n this._timestampModel = new CacheTimestampsModel(cacheName);\n }\n\n /**\n * Expires entries for the given cache and given criteria.\n */\n expireEntries() {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (_this._isRunning) {\n _this._rerunRequested = true;\n return;\n }\n _this._isRunning = true;\n\n const now = Date.now();\n\n // First, expire old entries, if maxAgeSeconds is set.\n const oldEntries = yield _this._findOldEntries(now);\n\n // Once that's done, check for the maximum size.\n const extraEntries = yield _this._findExtraEntries();\n\n // Use a Set to remove any duplicates following the concatenation, then\n // convert back into an array.\n const allUrls = [...new Set(oldEntries.concat(extraEntries))];\n\n yield Promise.all([_this._deleteFromCache(allUrls), _this._deleteFromIDB(allUrls)]);\n\n {\n // TODO: break apart entries deleted due to expiration vs size restraints\n if (allUrls.length > 0) {\n logger_mjs.logger.groupCollapsed(`Expired ${allUrls.length} ` + `${allUrls.length === 1 ? 'entry' : 'entries'} and removed ` + `${allUrls.length === 1 ? 'it' : 'them'} from the ` + `'${_this._cacheName}' cache.`);\n logger_mjs.logger.log(`Expired the following ${allUrls.length === 1 ? 'URL' : 'URLs'}:`);\n allUrls.forEach(function (url) {\n return logger_mjs.logger.log(` ${url}`);\n });\n logger_mjs.logger.groupEnd();\n } else {\n logger_mjs.logger.debug(`Cache expiration ran and found no entries to remove.`);\n }\n }\n\n _this._isRunning = false;\n if (_this._rerunRequested) {\n _this._rerunRequested = false;\n _this.expireEntries();\n }\n })();\n }\n\n /**\n * Expires entries based on the maximum age.\n *\n * @param {number} expireFromTimestamp A timestamp.\n * @return {Promise>} A list of the URLs that were expired.\n *\n * @private\n */\n _findOldEntries(expireFromTimestamp) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isType(expireFromTimestamp, 'number', {\n moduleName: 'workbox-cache-expiration',\n className: 'CacheExpiration',\n funcName: '_findOldEntries',\n paramName: 'expireFromTimestamp'\n });\n }\n\n if (!_this2._maxAgeSeconds) {\n return [];\n }\n\n const expireOlderThan = expireFromTimestamp - _this2._maxAgeSeconds * 1000;\n const timestamps = yield _this2._timestampModel.getAllTimestamps();\n const expiredUrls = [];\n timestamps.forEach(function (timestampDetails) {\n if (timestampDetails.timestamp < expireOlderThan) {\n expiredUrls.push(timestampDetails.url);\n }\n });\n\n return expiredUrls;\n })();\n }\n\n /**\n * @return {Promise}\n *\n * @private\n */\n _findExtraEntries() {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const extraUrls = [];\n\n if (!_this3._maxEntries) {\n return [];\n }\n\n const timestamps = yield _this3._timestampModel.getAllTimestamps();\n while (timestamps.length > _this3._maxEntries) {\n const lastUsed = timestamps.shift();\n extraUrls.push(lastUsed.url);\n }\n\n return extraUrls;\n })();\n }\n\n /**\n * @param {Array} urls Array of URLs to delete from cache.\n *\n * @private\n */\n _deleteFromCache(urls) {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const cache = yield caches.open(_this4._cacheName);\n for (const url of urls) {\n yield cache.delete(url);\n }\n })();\n }\n\n /**\n * @param {Array} urls Array of URLs to delete from IDB\n *\n * @private\n */\n _deleteFromIDB(urls) {\n var _this5 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n for (const url of urls) {\n yield _this5._timestampModel.deleteUrl(url);\n }\n })();\n }\n\n /**\n * Update the timestamp for the given URL. This ensures the when\n * removing entries based on maximum entries, most recently used\n * is accurate or when expiring, the timestamp is up-to-date.\n *\n * @param {string} url\n */\n updateTimestamp(url) {\n var _this6 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isType(url, 'string', {\n moduleName: 'workbox-cache-expiration',\n className: 'CacheExpiration',\n funcName: 'updateTimestamp',\n paramName: 'url'\n });\n }\n\n const urlObject = new URL(url, location);\n urlObject.hash = '';\n\n yield _this6._timestampModel.setTimestamp(urlObject.href, Date.now());\n })();\n }\n\n /**\n * Can be used to check if a URL has expired or not before it's used.\n *\n * This requires a look up from IndexedDB, so can be slow.\n *\n * Note: This method will not remove the cached entry, call\n * `expireEntries()` to remove indexedDB and Cache entries.\n *\n * @param {string} url\n * @return {boolean}\n */\n isURLExpired(url) {\n var _this7 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (!_this7._maxAgeSeconds) {\n throw new WorkboxError_mjs.WorkboxError(`expired-test-without-max-age`, {\n methodName: 'isURLExpired',\n paramName: 'maxAgeSeconds'\n });\n }\n const urlObject = new URL(url, location);\n urlObject.hash = '';\n\n const timestamp = yield _this7._timestampModel.getTimestamp(urlObject.href);\n const expireOlderThan = Date.now() - _this7._maxAgeSeconds * 1000;\n return timestamp < expireOlderThan;\n })();\n }\n\n /**\n * Removes the IndexedDB object store used to keep track of cache expiration\n * metadata.\n */\n delete() {\n var _this8 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n // Make sure we don't attempt another rerun if we're called in the middle of\n // a cache expiration.\n _this8._rerunRequested = false;\n yield _this8._timestampModel.delete();\n })();\n }\n }\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * This plugin can be used in the Workbox APIs to regularly enforce a\n * limit on the age and / or the number of cached requests.\n *\n * Whenever a cached request is used or updated, this plugin will look\n * at the used Cache and remove any old or extra requests.\n *\n * When using `maxAgeSeconds`, requests may be used *once* after expiring\n * because the expiration clean up will not have occurred until *after* the\n * cached request has been used. If the request has a \"Date\" header, then\n * a light weight expiration check is performed and the request will not be\n * used immediately.\n *\n * When using `maxEntries`, the last request to be used will be the request\n * that is removed from the Cache.\n *\n * @memberof workbox.expiration\n */\n class Plugin {\n /**\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to\n * automatic deletion if the available storage quota has been exceeded.\n */\n constructor(config = {}) {\n {\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-cache-expiration',\n className: 'Plugin',\n funcName: 'constructor'\n });\n }\n\n if (config.maxEntries) {\n assert_mjs.assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-cache-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxEntries'\n });\n }\n\n if (config.maxAgeSeconds) {\n assert_mjs.assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-cache-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds'\n });\n }\n }\n\n this._config = config;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheExpirations = new Map();\n\n if (config.purgeOnQuotaError) {\n index_mjs.registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());\n }\n }\n\n /**\n * A simple helper method to return a CacheExpiration instance for a given\n * cache name.\n *\n * @param {string} cacheName\n * @return {CacheExpiration}\n *\n * @private\n */\n _getCacheExpiration(cacheName) {\n if (cacheName === cacheNames_mjs.cacheNames.getRuntimeName()) {\n throw new WorkboxError_mjs.WorkboxError('expire-custom-caches-only');\n }\n\n let cacheExpiration = this._cacheExpirations.get(cacheName);\n if (!cacheExpiration) {\n cacheExpiration = new CacheExpiration(cacheName, this._config);\n this._cacheExpirations.set(cacheName, cacheExpiration);\n }\n return cacheExpiration;\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox.runtimeCaching` handlers when a `Response` is about to be returned\n * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to\n * the handler. It allows the `Response` to be inspected for freshness and\n * prevents it from being used if the `Response`'s `Date` header value is\n * older than the configured `maxAgeSeconds`.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache the response is in.\n * @param {Response} options.cachedResponse The `Response` object that's been\n * read from a cache and whose freshness should be checked.\n * @return {Response} Either the `cachedResponse`, if it's\n * fresh, or `null` if the `Response` is older than `maxAgeSeconds`.\n *\n * @private\n */\n cachedResponseWillBeUsed({ cacheName, cachedResponse }) {\n if (!cachedResponse) {\n return null;\n }\n\n let isFresh = this._isResponseDateFresh(cachedResponse);\n\n // Expire entries to ensure that even if the expiration date has\n // expired, it'll only be used once.\n const cacheExpiration = this._getCacheExpiration(cacheName);\n cacheExpiration.expireEntries();\n\n return isFresh ? cachedResponse : null;\n }\n\n /**\n * @param {Response} cachedResponse\n * @return {boolean}\n *\n * @private\n */\n _isResponseDateFresh(cachedResponse) {\n if (!this._maxAgeSeconds) {\n // We aren't expiring by age, so return true, it's fresh\n return true;\n }\n\n // Check if the 'date' header will suffice a quick expiration check.\n // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for\n // discussion.\n const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);\n if (dateHeaderTimestamp === null) {\n // Unable to parse date, so assume it's fresh.\n return true;\n }\n\n // If we have a valid headerTime, then our response is fresh iff the\n // headerTime plus maxAgeSeconds is greater than the current time.\n const now = Date.now();\n return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000;\n }\n\n /**\n * This method will extract the data header and parse it into a useful\n * value.\n *\n * @param {Response} cachedResponse\n * @return {number}\n *\n * @private\n */\n _getDateHeaderTimestamp(cachedResponse) {\n if (!cachedResponse.headers.has('date')) {\n return null;\n }\n\n const dateHeader = cachedResponse.headers.get('date');\n const parsedDate = new Date(dateHeader);\n const headerTime = parsedDate.getTime();\n\n // If the Date header was invalid for some reason, parsedDate.getTime()\n // will return NaN.\n if (isNaN(headerTime)) {\n return null;\n }\n\n return headerTime;\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox.runtimeCaching` handlers when an entry is added to a cache.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache that was updated.\n * @param {string} options.request The Request for the cached entry.\n *\n * @private\n */\n cacheDidUpdate({ cacheName, request }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isType(cacheName, 'string', {\n moduleName: 'workbox-cache-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName'\n });\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-cache-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request'\n });\n }\n\n const cacheExpiration = _this._getCacheExpiration(cacheName);\n yield cacheExpiration.updateTimestamp(request.url);\n yield cacheExpiration.expireEntries();\n })();\n }\n\n /**\n * This is a helper method that performs two operations:\n *\n * - Deletes *all* the underlying Cache instances associated with this plugin\n * instance, by calling caches.delete() on you behalf.\n * - Deletes the metadata from IndexedDB used to keep track of expiration\n * details for each Cache instance.\n *\n * When using cache expiration, calling this method is preferable to calling\n * `caches.delete()` directly, since this will ensure that the IndexedDB\n * metadata is also cleanly removed and open IndexedDB instances are deleted.\n *\n * Note that if you're *not* using cache expiration for a given cache, calling\n * `caches.delete()` and passing in the cache's name should be sufficient.\n * There is no Workbox-specific method needed for cleanup in that case.\n */\n deleteCacheAndMetadata() {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n // Do this one at a time instead of all at once via `Promise.all()` to\n // reduce the chance of inconsistency if a promise rejects.\n for (const [cacheName, cacheExpiration] of _this2._cacheExpirations) {\n yield caches.delete(cacheName);\n yield cacheExpiration.delete();\n }\n\n // Reset this._cacheExpirations to its initial state.\n _this2._cacheExpirations = new Map();\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.CacheExpiration = CacheExpiration;\n exports.Plugin = Plugin;\n\n return exports;\n\n}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core));\n"],"file":"workbox-cache-expiration.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-cache-expiration.prod.js b/workbox-v3.6.3/workbox-cache-expiration.prod.js new file mode 100644 index 0000000..f0a6913 --- /dev/null +++ b/workbox-v3.6.3/workbox-cache-expiration.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.expiration=function(e,t,r,n,i){"use strict";try{self.workbox.v["workbox:cache-expiration:3.6.3"]=1}catch(e){}const s="url",a="timestamp";class l{constructor(e){this.e=e,this.t=e,this.r=new t.DBWrapper(this.e,2,{onupgradeneeded:e=>this.n(e)})}n(e){const t=e.target.result;e.oldVersion<2&&t.objectStoreNames.contains("workbox-cache-expiration")&&t.deleteObjectStore("workbox-cache-expiration"),t.createObjectStore(this.t,{keyPath:s}).createIndex(a,a,{unique:!1})}setTimestamp(e,t){var r=this;return babelHelpers.asyncToGenerator(function*(){yield r.r.put(r.t,{[s]:new URL(e,location).href,[a]:t})})()}getAllTimestamps(){var e=this;return babelHelpers.asyncToGenerator(function*(){return yield e.r.getAllMatching(e.t,{index:a})})()}getTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){return(yield t.r.get(t.t,e)).timestamp})()}deleteUrl(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.delete(t.t,new URL(e,location).href)})()}delete(){var e=this;return babelHelpers.asyncToGenerator(function*(){yield e.r.deleteDatabase(),e.r=null})()}}class o{constructor(e,t={}){this.i=!1,this.s=!1,this.a=t.maxEntries,this.l=t.maxAgeSeconds,this.e=e,this.o=new l(e)}expireEntries(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(e.i)return void(e.s=!0);e.i=!0;const t=Date.now(),r=yield e.c(t),n=yield e.u(),i=[...new Set(r.concat(n))];yield Promise.all([e.h(i),e.d(i)]),e.i=!1,e.s&&(e.s=!1,e.expireEntries())})()}c(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)return[];const r=e-1e3*t.l,n=[];return(yield t.o.getAllTimestamps()).forEach(function(e){e.timestampe.a;){const e=r.shift();t.push(e.url)}return t})()}h(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield caches.open(t.e);for(const t of e)yield r.delete(t)})()}d(e){var t=this;return babelHelpers.asyncToGenerator(function*(){for(const r of e)yield t.o.deleteUrl(r)})()}updateTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=new URL(e,location);r.hash="",yield t.o.setTimestamp(r.href,Date.now())})()}isURLExpired(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)throw new r.WorkboxError("expired-test-without-max-age",{methodName:"isURLExpired",paramName:"maxAgeSeconds"});const n=new URL(e,location);return n.hash="",(yield t.o.getTimestamp(n.href))this.deleteCacheAndMetadata())}f(e){if(e===n.cacheNames.getRuntimeName())throw new r.WorkboxError("expire-custom-caches-only");let t=this.b.get(e);return t||(t=new o(e,this.p),this.b.set(e,t)),t}cachedResponseWillBeUsed({cacheName:e,cachedResponse:t}){if(!t)return null;let r=this.m(t);return this.f(e).expireEntries(),r?t:null}m(e){if(!this.l)return!0;const t=this.y(e);return null===t||t>=Date.now()-1e3*this.l}y(e){if(!e.headers.has("date"))return null;const t=e.headers.get("date"),r=new Date(t).getTime();return isNaN(r)?null:r}cacheDidUpdate({cacheName:e,request:t}){var r=this;return babelHelpers.asyncToGenerator(function*(){const n=r.f(e);yield n.updateTimestamp(t.url),yield n.expireEntries()})()}deleteCacheAndMetadata(){var e=this;return babelHelpers.asyncToGenerator(function*(){for(const[t,r]of e.b)yield caches.delete(t),yield r.delete();e.b=new Map})()}},e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core); + +//# sourceMappingURL=workbox-cache-expiration.prod.js.map diff --git a/workbox-v3.6.3/workbox-cache-expiration.prod.js.map b/workbox-v3.6.3/workbox-cache-expiration.prod.js.map new file mode 100644 index 0000000..84d70ca --- /dev/null +++ b/workbox-v3.6.3/workbox-cache-expiration.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-cache-expiration/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.expiration=function(e,t,r,n,i){\"use strict\";try{self.workbox.v[\"workbox:cache-expiration:3.6.3\"]=1}catch(e){}const s=\"url\",a=\"timestamp\";class l{constructor(e){this.e=e,this.t=e,this.r=new t.DBWrapper(this.e,2,{onupgradeneeded:e=>this.n(e)})}n(e){const t=e.target.result;e.oldVersion<2&&t.objectStoreNames.contains(\"workbox-cache-expiration\")&&t.deleteObjectStore(\"workbox-cache-expiration\"),t.createObjectStore(this.t,{keyPath:s}).createIndex(a,a,{unique:!1})}setTimestamp(e,t){var r=this;return babelHelpers.asyncToGenerator(function*(){yield r.r.put(r.t,{[s]:new URL(e,location).href,[a]:t})})()}getAllTimestamps(){var e=this;return babelHelpers.asyncToGenerator(function*(){return yield e.r.getAllMatching(e.t,{index:a})})()}getTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){return(yield t.r.get(t.t,e)).timestamp})()}deleteUrl(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.r.delete(t.t,new URL(e,location).href)})()}delete(){var e=this;return babelHelpers.asyncToGenerator(function*(){yield e.r.deleteDatabase(),e.r=null})()}}class o{constructor(e,t={}){this.i=!1,this.s=!1,this.a=t.maxEntries,this.l=t.maxAgeSeconds,this.e=e,this.o=new l(e)}expireEntries(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(e.i)return void(e.s=!0);e.i=!0;const t=Date.now(),r=yield e.c(t),n=yield e.u(),i=[...new Set(r.concat(n))];yield Promise.all([e.h(i),e.d(i)]),e.i=!1,e.s&&(e.s=!1,e.expireEntries())})()}c(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)return[];const r=e-1e3*t.l,n=[];return(yield t.o.getAllTimestamps()).forEach(function(e){e.timestampe.a;){const e=r.shift();t.push(e.url)}return t})()}h(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=yield caches.open(t.e);for(const t of e)yield r.delete(t)})()}d(e){var t=this;return babelHelpers.asyncToGenerator(function*(){for(const r of e)yield t.o.deleteUrl(r)})()}updateTimestamp(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const r=new URL(e,location);r.hash=\"\",yield t.o.setTimestamp(r.href,Date.now())})()}isURLExpired(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!t.l)throw new r.WorkboxError(\"expired-test-without-max-age\",{methodName:\"isURLExpired\",paramName:\"maxAgeSeconds\"});const n=new URL(e,location);return n.hash=\"\",(yield t.o.getTimestamp(n.href))this.deleteCacheAndMetadata())}f(e){if(e===n.cacheNames.getRuntimeName())throw new r.WorkboxError(\"expire-custom-caches-only\");let t=this.b.get(e);return t||(t=new o(e,this.p),this.b.set(e,t)),t}cachedResponseWillBeUsed({cacheName:e,cachedResponse:t}){if(!t)return null;let r=this.m(t);return this.f(e).expireEntries(),r?t:null}m(e){if(!this.l)return!0;const t=this.y(e);return null===t||t>=Date.now()-1e3*this.l}y(e){if(!e.headers.has(\"date\"))return null;const t=e.headers.get(\"date\"),r=new Date(t).getTime();return isNaN(r)?null:r}cacheDidUpdate({cacheName:e,request:t}){var r=this;return babelHelpers.asyncToGenerator(function*(){const n=r.f(e);yield n.updateTimestamp(t.url),yield n.expireEntries()})()}deleteCacheAndMetadata(){var e=this;return babelHelpers.asyncToGenerator(function*(){for(const[t,r]of e.b)yield caches.delete(t),yield r.delete();e.b=new Map})()}},e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core);\n"],"file":"workbox-cache-expiration.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-cacheable-response.dev.js b/workbox-v3.6.3/workbox-cacheable-response.dev.js new file mode 100644 index 0000000..64a049d --- /dev/null +++ b/workbox-v3.6.3/workbox-cacheable-response.dev.js @@ -0,0 +1,236 @@ +this.workbox = this.workbox || {}; +this.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,getFriendlyURL_mjs,logger_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:cacheable-response:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * This class allows you to set up rules determining what + * status codes and/or headers need to be present in order for a + * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) + * to be considered cacheable. + * + * @memberof workbox.cacheableResponse + */ + class CacheableResponse { + /** + * To construct a new CacheableResponse instance you must provide at least + * one of the `config` properties. + * + * If both `statuses` and `headers` are specified, then both conditions must + * be met for the `Response` to be considered cacheable. + * + * @param {Object} config + * @param {Array} [config.statuses] One or more status codes that a + * `Response` can have and be considered cacheable. + * @param {Object} [config.headers] A mapping of header names + * and expected values that a `Response` can have and be considered cacheable. + * If multiple headers are provided, only one needs to be present. + */ + constructor(config = {}) { + { + if (!(config.statuses || config.headers)) { + throw new WorkboxError_mjs.WorkboxError('statuses-or-headers-required', { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor' + }); + } + + if (config.statuses) { + assert_mjs.assert.isArray(config.statuses, { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor', + paramName: 'config.statuses' + }); + } + + if (config.headers) { + assert_mjs.assert.isType(config.headers, 'object', { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor', + paramName: 'config.headers' + }); + } + } + + this._statuses = config.statuses; + this._headers = config.headers; + } + + /** + * Checks a response to see whether it's cacheable or not, based on this + * object's configuration. + * + * @param {Response} response The response whose cacheability is being + * checked. + * @return {boolean} `true` if the `Response` is cacheable, and `false` + * otherwise. + */ + isResponseCacheable(response) { + { + assert_mjs.assert.isInstance(response, Response, { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'isResponseCacheable', + paramName: 'response' + }); + } + + let cacheable = true; + + if (this._statuses) { + cacheable = this._statuses.includes(response.status); + } + + if (this._headers && cacheable) { + cacheable = Object.keys(this._headers).some(headerName => { + return response.headers.get(headerName) === this._headers[headerName]; + }); + } + + { + if (!cacheable) { + logger_mjs.logger.groupCollapsed(`The request for ` + `'${getFriendlyURL_mjs.getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`); + + logger_mjs.logger.groupCollapsed(`View cacheability criteria here.`); + logger_mjs.logger.unprefixed.log(`Cacheable statuses: ` + JSON.stringify(this._statuses)); + logger_mjs.logger.unprefixed.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2)); + logger_mjs.logger.groupEnd(); + + const logFriendlyHeaders = {}; + response.headers.forEach((value, key) => { + logFriendlyHeaders[key] = value; + }); + + logger_mjs.logger.groupCollapsed(`View response status and headers here.`); + logger_mjs.logger.unprefixed.log(`Response status: ` + response.status); + logger_mjs.logger.unprefixed.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2)); + logger_mjs.logger.groupEnd(); + + logger_mjs.logger.groupCollapsed(`View full response details here.`); + logger_mjs.logger.unprefixed.log(response.headers); + logger_mjs.logger.unprefixed.log(response); + logger_mjs.logger.groupEnd(); + + logger_mjs.logger.groupEnd(); + } + } + + return cacheable; + } + } + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it + * easier to add in cacheability checks to requests made via Workbox's built-in + * strategies. + * + * @memberof workbox.cacheableResponse + */ + class Plugin { + /** + * To construct a new cacheable response Plugin instance you must provide at + * least one of the `config` properties. + * + * If both `statuses` and `headers` are specified, then both conditions must + * be met for the `Response` to be considered cacheable. + * + * @param {Object} config + * @param {Array} [config.statuses] One or more status codes that a + * `Response` can have and be considered cacheable. + * @param {Object} [config.headers] A mapping of header names + * and expected values that a `Response` can have and be considered cacheable. + * If multiple headers are provided, only one needs to be present. + */ + constructor(config) { + this._cacheableResponse = new CacheableResponse(config); + } + + /** + * @param {Object} options + * @param {Response} options.response + * @return {boolean} + * @private + */ + cacheWillUpdate({ response }) { + if (this._cacheableResponse.isResponseCacheable(response)) { + return response; + } + return null; + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.CacheableResponse = CacheableResponse; + exports.Plugin = Plugin; + + return exports; + +}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-cacheable-response.dev.js.map diff --git a/workbox-v3.6.3/workbox-cacheable-response.dev.js.map b/workbox-v3.6.3/workbox-cacheable-response.dev.js.map new file mode 100644 index 0000000..3e4d2ab --- /dev/null +++ b/workbox-v3.6.3/workbox-cacheable-response.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-cacheable-response/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.cacheableResponse = (function (exports,WorkboxError_mjs,assert_mjs,getFriendlyURL_mjs,logger_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:cacheable-response:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox.cacheableResponse\n */\n class CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError_mjs.WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor'\n });\n }\n\n if (config.statuses) {\n assert_mjs.assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses'\n });\n }\n\n if (config.headers) {\n assert_mjs.assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers'\n });\n }\n }\n\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n {\n assert_mjs.assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response'\n });\n }\n\n let cacheable = true;\n\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some(headerName => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n\n {\n if (!cacheable) {\n logger_mjs.logger.groupCollapsed(`The request for ` + `'${getFriendlyURL_mjs.getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`);\n\n logger_mjs.logger.groupCollapsed(`View cacheability criteria here.`);\n logger_mjs.logger.unprefixed.log(`Cacheable statuses: ` + JSON.stringify(this._statuses));\n logger_mjs.logger.unprefixed.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2));\n logger_mjs.logger.groupEnd();\n\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n\n logger_mjs.logger.groupCollapsed(`View response status and headers here.`);\n logger_mjs.logger.unprefixed.log(`Response status: ` + response.status);\n logger_mjs.logger.unprefixed.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2));\n logger_mjs.logger.groupEnd();\n\n logger_mjs.logger.groupCollapsed(`View full response details here.`);\n logger_mjs.logger.unprefixed.log(response.headers);\n logger_mjs.logger.unprefixed.log(response);\n logger_mjs.logger.groupEnd();\n\n logger_mjs.logger.groupEnd();\n }\n }\n\n return cacheable;\n }\n }\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox.cacheableResponse\n */\n class Plugin {\n /**\n * To construct a new cacheable response Plugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n this._cacheableResponse = new CacheableResponse(config);\n }\n\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {boolean}\n * @private\n */\n cacheWillUpdate({ response }) {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.CacheableResponse = CacheableResponse;\n exports.Plugin = Plugin;\n\n return exports;\n\n}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-cacheable-response.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-cacheable-response.prod.js b/workbox-v3.6.3/workbox-cacheable-response.prod.js new file mode 100644 index 0000000..76f159c --- /dev/null +++ b/workbox-v3.6.3/workbox-cacheable-response.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(t){"use strict";try{self.workbox.v["workbox:cacheable-response:3.6.3"]=1}catch(t){}class s{constructor(t={}){this.t=t.statuses,this.s=t.headers}isResponseCacheable(t){let s=!0;return this.t&&(s=this.t.includes(t.status)),this.s&&s&&(s=Object.keys(this.s).some(s=>t.headers.get(s)===this.s[s])),s}}return t.CacheableResponse=s,t.Plugin=class{constructor(t){this.e=new s(t)}cacheWillUpdate({response:t}){return this.e.isResponseCacheable(t)?t:null}},t}({}); + +//# sourceMappingURL=workbox-cacheable-response.prod.js.map diff --git a/workbox-v3.6.3/workbox-cacheable-response.prod.js.map b/workbox-v3.6.3/workbox-cacheable-response.prod.js.map new file mode 100644 index 0000000..6471d14 --- /dev/null +++ b/workbox-v3.6.3/workbox-cacheable-response.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-cacheable-response/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(t){\"use strict\";try{self.workbox.v[\"workbox:cacheable-response:3.6.3\"]=1}catch(t){}class s{constructor(t={}){this.t=t.statuses,this.s=t.headers}isResponseCacheable(t){let s=!0;return this.t&&(s=this.t.includes(t.status)),this.s&&s&&(s=Object.keys(this.s).some(s=>t.headers.get(s)===this.s[s])),s}}return t.CacheableResponse=s,t.Plugin=class{constructor(t){this.e=new s(t)}cacheWillUpdate({response:t}){return this.e.isResponseCacheable(t)?t:null}},t}({});\n"],"file":"workbox-cacheable-response.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-core.dev.js b/workbox-v3.6.3/workbox-core.dev.js new file mode 100644 index 0000000..1196c16 --- /dev/null +++ b/workbox-v3.6.3/workbox-core.dev.js @@ -0,0 +1,1736 @@ +/* eslint-disable */ +// This is extracted from the Babel runtime (original source: https://github.com/babel/babel/blob/9e0f5235b1ca5167c368a576ad7c5af62d20b0e3/packages/babel-helpers/src/helpers.js#L240). +// As part of the Rollup bundling process, it's injected once into workbox-core +// and reused throughout all of the other modules, avoiding code duplication. +// See https://github.com/GoogleChrome/workbox/pull/1048#issuecomment-344698046 +// for further background. +self.babelHelpers = { + asyncToGenerator: function(fn) { + return function() { + var gen = fn.apply(this, arguments); + return new Promise(function(resolve, reject) { + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + return Promise.resolve(value).then(function(value) { + step('next', value); + }, function(err) { + step('throw', err); + }); + } + } + + return step('next'); + }); + }; + }, +}; + +this.workbox = this.workbox || {}; +this.workbox.core = (function () { + 'use strict'; + + try { + self.workbox.v['workbox:core:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * The available log levels in Workbox: debug, log, warn, error and silent. + * + * @property {int} debug Prints all logs from Workbox. Useful for debugging. + * @property {int} log Prints console log, warn, error and groups. Default for + * debug builds. + * @property {int} warn Prints console warn, error and groups. Default for + * non-debug builds. + * @property {int} error Print console error and groups. + * @property {int} silent Force no logging from Workbox. + * + * @alias workbox.core.LOG_LEVELS + */ + + var LOG_LEVELS = { + debug: 0, + log: 1, + warn: 2, + error: 3, + silent: 4 + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + // Safari doesn't print all console.groupCollapsed() arguments. + // Related bug: https://bugs.webkit.org/show_bug.cgi?id=182754 + const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + + const GREY = `#7f8c8d`; + const GREEN = `#2ecc71`; + const YELLOW = `#f39c12`; + const RED = `#c0392b`; + const BLUE = `#3498db`; + + const getDefaultLogLevel = () => LOG_LEVELS.log; + + let logLevel = getDefaultLogLevel(); + const shouldPrint = minLevel => logLevel <= minLevel; + const setLoggerLevel = newLogLevel => logLevel = newLogLevel; + const getLoggerLevel = () => logLevel; + + // We always want groups to be logged unless logLevel is silent. + const groupLevel = LOG_LEVELS.error; + + const _print = function (keyName, logArgs, levelColor) { + const logLevel = keyName.indexOf('group') === 0 ? groupLevel : LOG_LEVELS[keyName]; + if (!shouldPrint(logLevel)) { + return; + } + + if (!levelColor || keyName === 'groupCollapsed' && isSafari) { + console[keyName](...logArgs); + return; + } + + const logPrefix = ['%cworkbox', `background: ${levelColor}; color: white; padding: 2px 0.5em; ` + `border-radius: 0.5em;`]; + console[keyName](...logPrefix, ...logArgs); + }; + + const groupEnd = () => { + if (shouldPrint(groupLevel)) { + console.groupEnd(); + } + }; + + const defaultExport = { + groupEnd, + unprefixed: { + groupEnd + } + }; + + const setupLogs = (keyName, color) => { + defaultExport[keyName] = (...args) => _print(keyName, args, color); + defaultExport.unprefixed[keyName] = (...args) => _print(keyName, args); + }; + + const levelToColor = { + debug: GREY, + log: GREEN, + warn: YELLOW, + error: RED, + groupCollapsed: BLUE + }; + Object.keys(levelToColor).forEach(keyName => setupLogs(keyName, levelToColor[keyName])); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var messages = { + 'invalid-value': ({ paramName, validValueDescription, value }) => { + if (!paramName || !validValueDescription) { + throw new Error(`Unexpected input to 'invalid-value' error.`); + } + return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; + }, + + 'not-in-sw': ({ moduleName }) => { + if (!moduleName) { + throw new Error(`Unexpected input to 'not-in-sw' error.`); + } + return `The '${moduleName}' must be used in a service worker.`; + }, + + 'not-an-array': ({ moduleName, className, funcName, paramName }) => { + if (!moduleName || !className || !funcName || !paramName) { + throw new Error(`Unexpected input to 'not-an-array' error.`); + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; + }, + + 'incorrect-type': ({ expectedType, paramName, moduleName, className, + funcName }) => { + if (!expectedType || !paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-type' error.`); + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}` + `${funcName}()' must be of type ${expectedType}.`; + }, + + 'incorrect-class': ({ expectedClass, paramName, moduleName, className, + funcName, isReturnValueProblem }) => { + if (!expectedClass || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`; + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`; + }, + + 'missing-a-method': ({ expectedMethod, paramName, moduleName, className, + funcName }) => { + if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'missing-a-method' error.`); + } + return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; + }, + + 'add-to-cache-list-unexpected-type': ({ entry }) => { + return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; + }, + + 'add-to-cache-list-conflicting-entries': ({ firstEntry, secondEntry }) => { + if (!firstEntry || !secondEntry) { + throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); + } + + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had matching ` + `URLs but different revision details. This means workbox-precaching ` + `is unable to determine cache the asset correctly. Please remove one ` + `of the entries.`; + }, + + 'plugin-error-request-will-fetch': ({ thrownError }) => { + if (!thrownError) { + throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); + } + + return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`; + }, + + 'invalid-cache-name': ({ cacheNameId, value }) => { + if (!cacheNameId) { + throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); + } + + return `You must provide a name containing at least one character for ` + `setCacheDeatils({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; + }, + + 'unregister-route-but-not-found-with-method': ({ method }) => { + if (!method) { + throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); + } + + return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; + }, + + 'unregister-route-route-not-registered': () => { + return `The route you're trying to unregister was not previously ` + `registered.`; + }, + + 'queue-replay-failed': ({ name, count }) => { + return `${count} requests failed, while trying to replay Queue: ${name}.`; + }, + + 'duplicate-queue-name': ({ name }) => { + return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; + }, + + 'expired-test-without-max-age': ({ methodName, paramName }) => { + return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; + }, + + 'unsupported-route-type': ({ moduleName, className, funcName, paramName }) => { + return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; + }, + + 'not-array-of-class': ({ value, expectedClass, + moduleName, className, funcName, paramName }) => { + return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; + }, + + 'max-entries-or-age-required': ({ moduleName, className, funcName }) => { + return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; + }, + + 'statuses-or-headers-required': ({ moduleName, className, funcName }) => { + return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; + }, + + 'invalid-string': ({ moduleName, className, funcName, paramName }) => { + if (!paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'invalid-string' error.`); + } + return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${className}.${funcName}() for ` + `more info.`; + }, + 'channel-name-required': () => { + return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; + }, + 'invalid-responses-are-same-args': () => { + return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; + }, + 'expire-custom-caches-only': () => { + return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; + }, + 'unit-must-be-bytes': ({ normalizedRangeHeader }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); + } + return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; + }, + 'single-range-only': ({ normalizedRangeHeader }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'single-range-only' error.`); + } + return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'invalid-range-values': ({ normalizedRangeHeader }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'invalid-range-values' error.`); + } + return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'no-range-header': () => { + return `No Range header was found in the Request provided.`; + }, + 'range-not-satisfiable': ({ size, start, end }) => { + return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; + }, + 'attempt-to-cache-non-get-request': ({ url, method }) => { + return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; + }, + 'cache-put-with-no-response': ({ url }) => { + return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; + } + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const generatorFunction = (code, ...args) => { + const message = messages[code]; + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + + return message(...args); + }; + + const exportedValue = generatorFunction; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + let message = exportedValue(errorCode, details); + + super(message); + + this.name = errorCode; + this.details = details; + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + * This method returns true if the current context is a service worker. + */ + const isSwEnv = moduleName => { + if (!('ServiceWorkerGlobalScope' in self)) { + throw new WorkboxError('not-in-sw', { moduleName }); + } + }; + + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + const isArray = (value, { moduleName, className, funcName, paramName }) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', { + moduleName, + className, + funcName, + paramName + }); + } + }; + + const hasMethod = (object, expectedMethod, { moduleName, className, funcName, paramName }) => { + const type = typeof object[expectedMethod]; + if (type !== 'function') { + throw new WorkboxError('missing-a-method', { paramName, expectedMethod, + moduleName, className, funcName }); + } + }; + + const isType = (object, expectedType, { moduleName, className, funcName, paramName }) => { + if (typeof object !== expectedType) { + throw new WorkboxError('incorrect-type', { paramName, expectedType, + moduleName, className, funcName }); + } + }; + + const isInstance = (object, expectedClass, { moduleName, className, funcName, + paramName, isReturnValueProblem }) => { + if (!(object instanceof expectedClass)) { + throw new WorkboxError('incorrect-class', { paramName, expectedClass, + moduleName, className, funcName, isReturnValueProblem }); + } + }; + + const isOneOf = (value, validValues, { paramName }) => { + if (!validValues.includes(value)) { + throw new WorkboxError('invalid-value', { + paramName, + value, + validValueDescription: `Valid values are ${JSON.stringify(validValues)}.` + }); + } + }; + + const isArrayOfClass = (value, expectedClass, { moduleName, className, funcName, paramName }) => { + const error = new WorkboxError('not-array-of-class', { + value, expectedClass, + moduleName, className, funcName, paramName + }); + if (!Array.isArray(value)) { + throw error; + } + + for (let item of value) { + if (!(item instanceof expectedClass)) { + throw error; + } + } + }; + + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isSwEnv, + isType, + isArrayOfClass + }; + + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof workbox.core + * @private + */ + let executeQuotaErrorCallbacks = (() => { + var _ref = babelHelpers.asyncToGenerator(function* () { + { + defaultExport.log(`About to run ${callbacks.size} callbacks to clean up caches.`); + } + + for (const callback of callbacks) { + yield callback(); + { + defaultExport.log(callback, 'is complete.'); + } + } + + { + defaultExport.log('Finished running callbacks.'); + } + }); + + return function executeQuotaErrorCallbacks() { + return _ref.apply(this, arguments); + }; + })(); + + const callbacks = new Set(); + + /** + * Adds a function to the set of callbacks that will be executed when there's + * a quota error. + * + * @param {Function} callback + * @memberof workbox.core + */ + function registerQuotaErrorCallback(callback) { + { + finalAssertExports.isType(callback, 'function', { + moduleName: 'workbox-core', + funcName: 'register', + paramName: 'callback' + }); + } + + callbacks.add(callback); + + { + defaultExport.log('Registered a callback to respond to quota errors.', callback); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * A class that wraps common IndexedDB functionality in a promise-based API. + * It exposes all the underlying power and functionality of IndexedDB, but + * wraps the most commonly used features in a way that's much simpler to use. + * + * @private + */ + class DBWrapper { + /** + * @param {string} name + * @param {number} version + * @param {Object=} [callback] + * @param {function(this:DBWrapper, Event)} [callbacks.onupgradeneeded] + * @param {function(this:DBWrapper, Event)} [callbacks.onversionchange] + * Defaults to DBWrapper.prototype._onversionchange when not specified. + */ + constructor(name, version, { + onupgradeneeded, + onversionchange = this._onversionchange + } = {}) { + this._name = name; + this._version = version; + this._onupgradeneeded = onupgradeneeded; + this._onversionchange = onversionchange; + + // If this is null, it means the database isn't open. + this._db = null; + } + + /** + * Opens a connected to an IDBDatabase, invokes any onupgradedneeded + * callback, and added an onversionchange callback to the database. + * + * @return {IDBDatabase} + * + * @private + */ + open() { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + if (_this._db) return; + + _this._db = yield new Promise(function (resolve, reject) { + // This flag is flipped to true if the timeout callback runs prior + // to the request failing or succeeding. Note: we use a timeout instead + // of an onblocked handler since there are cases where onblocked will + // never never run. A timeout better handles all possible scenarios: + // https://github.com/w3c/IndexedDB/issues/223 + let openRequestTimedOut = false; + setTimeout(function () { + openRequestTimedOut = true; + reject(new Error('The open request was blocked and timed out')); + }, _this.OPEN_TIMEOUT); + + const openRequest = indexedDB.open(_this._name, _this._version); + openRequest.onerror = function (evt) { + return reject(openRequest.error); + }; + openRequest.onupgradeneeded = function (evt) { + if (openRequestTimedOut) { + openRequest.transaction.abort(); + evt.target.result.close(); + } else if (_this._onupgradeneeded) { + _this._onupgradeneeded(evt); + } + }; + openRequest.onsuccess = function (evt) { + const db = evt.target.result; + if (openRequestTimedOut) { + db.close(); + } else { + db.onversionchange = _this._onversionchange; + resolve(db); + } + }; + }); + + return _this; + })(); + } + + /** + * Delegates to the native `get()` method for the object store. + * + * @param {string} storeName The name of the object store to put the value. + * @param {...*} args The values passed to the delegated method. + * @return {*} The key of the entry. + * + * @private + */ + get(storeName, ...args) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + return yield _this2._call('get', storeName, 'readonly', ...args); + })(); + } + + /** + * Delegates to the native `add()` method for the object store. + * + * @param {string} storeName The name of the object store to put the value. + * @param {...*} args The values passed to the delegated method. + * @return {*} The key of the entry. + * + * @private + */ + add(storeName, ...args) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + return yield _this3._call('add', storeName, 'readwrite', ...args); + })(); + } + + /** + * Delegates to the native `put()` method for the object store. + * + * @param {string} storeName The name of the object store to put the value. + * @param {...*} args The values passed to the delegated method. + * @return {*} The key of the entry. + * + * @private + */ + put(storeName, ...args) { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + return yield _this4._call('put', storeName, 'readwrite', ...args); + })(); + } + + /** + * Delegates to the native `delete()` method for the object store. + * + * @param {string} storeName + * @param {...*} args The values passed to the delegated method. + * + * @private + */ + delete(storeName, ...args) { + var _this5 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this5._call('delete', storeName, 'readwrite', ...args); + })(); + } + + /** + * Deletes the underlying database, ensuring that any open connections are + * closed first. + * + * @private + */ + deleteDatabase() { + var _this6 = this; + + return babelHelpers.asyncToGenerator(function* () { + _this6.close(); + _this6._db = null; + yield new Promise(function (resolve, reject) { + const request = indexedDB.deleteDatabase(_this6._name); + request.onerror = function (evt) { + return reject(evt.target.error); + }; + request.onblocked = function () { + return reject(new Error('Deletion was blocked.')); + }; + request.onsuccess = function () { + return resolve(); + }; + }); + })(); + } + + /** + * Delegates to the native `getAll()` or polyfills it via the `find()` + * method in older browsers. + * + * @param {string} storeName + * @param {*} query + * @param {number} count + * @return {Array} + * + * @private + */ + getAll(storeName, query, count) { + var _this7 = this; + + return babelHelpers.asyncToGenerator(function* () { + if ('getAll' in IDBObjectStore.prototype) { + return yield _this7._call('getAll', storeName, 'readonly', query, count); + } else { + return yield _this7.getAllMatching(storeName, { query, count }); + } + })(); + } + + /** + * Supports flexible lookup in an object store by specifying an index, + * query, direction, and count. This method returns an array of objects + * with the signature . + * + * @param {string} storeName + * @param {Object} [opts] + * @param {IDBCursorDirection} [opts.direction] + * @param {*} [opts.query] + * @param {string} [opts.index] The index to use (if specified). + * @param {number} [opts.count] The max number of results to return. + * @param {boolean} [opts.includeKeys] When true, the structure of the + * returned objects is changed from an array of values to an array of + * objects in the form {key, primaryKey, value}. + * @return {Array} + * + * @private + */ + getAllMatching(storeName, opts = {}) { + var _this8 = this; + + return babelHelpers.asyncToGenerator(function* () { + return yield _this8.transaction([storeName], 'readonly', function (stores, done) { + const store = stores[storeName]; + const target = opts.index ? store.index(opts.index) : store; + const results = []; + + // Passing `undefined` arguments to Edge's `openCursor(...)` causes + // 'DOMException: DataError' + // Details in issue: https://github.com/GoogleChrome/workbox/issues/1509 + const query = opts.query || null; + const direction = opts.direction || 'next'; + target.openCursor(query, direction).onsuccess = function (evt) { + const cursor = evt.target.result; + if (cursor) { + const { primaryKey, key, value } = cursor; + results.push(opts.includeKeys ? { primaryKey, key, value } : value); + if (opts.count && results.length >= opts.count) { + done(results); + } else { + cursor.continue(); + } + } else { + done(results); + } + }; + }); + })(); + } + + /** + * Accepts a list of stores, a transaction type, and a callback and + * performs a transaction. A promise is returned that resolves to whatever + * value the callback chooses. The callback holds all the transaction logic + * and is invoked with three arguments: + * 1. An object mapping object store names to IDBObjectStore values. + * 2. A `done` function, that's used to resolve the promise when + * when the transaction is done. + * 3. An `abort` function that can be called to abort the transaction + * at any time. + * + * @param {Array} storeNames An array of object store names + * involved in the transaction. + * @param {string} type Can be `readonly` or `readwrite`. + * @param {function(Object, function(), function(*)):?IDBRequest} callback + * @return {*} The result of the transaction ran by the callback. + * + * @private + */ + transaction(storeNames, type, callback) { + var _this9 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this9.open(); + const result = yield new Promise(function (resolve, reject) { + const txn = _this9._db.transaction(storeNames, type); + const done = function (value) { + return resolve(value); + }; + const abort = function () { + reject(new Error('The transaction was manually aborted')); + txn.abort(); + }; + txn.onerror = function (evt) { + return reject(evt.target.error); + }; + txn.onabort = function (evt) { + return reject(evt.target.error); + }; + txn.oncomplete = function () { + return resolve(); + }; + + const stores = {}; + for (const storeName of storeNames) { + stores[storeName] = txn.objectStore(storeName); + } + callback(stores, done, abort); + }); + return result; + })(); + } + + /** + * Delegates async to a native IDBObjectStore method. + * + * @param {string} method The method name. + * @param {string} storeName The object store name. + * @param {string} type Can be `readonly` or `readwrite`. + * @param {...*} args The list of args to pass to the native method. + * @return {*} The result of the transaction. + * + * @private + */ + _call(method, storeName, type, ...args) { + var _this10 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this10.open(); + const callback = function (stores, done) { + stores[storeName][method](...args).onsuccess = function (evt) { + done(evt.target.result); + }; + }; + + return yield _this10.transaction([storeName], type, callback); + })(); + } + + /** + * The default onversionchange handler, which closes the database so other + * connections can open without being blocked. + * + * @param {Event} evt + * + * @private + */ + _onversionchange(evt) { + this.close(); + } + + /** + * Closes the connection opened by `DBWrapper.open()`. Generally this method + * doesn't need to be called since: + * 1. It's usually better to keep a connection open since opening + * a new connection is somewhat slow. + * 2. Connections are automatically closed when the reference is + * garbage collected. + * The primary use case for needing to close a connection is when another + * reference (typically in another tab) needs to upgrade it and would be + * blocked by the current, open connection. + * + * @private + */ + close() { + if (this._db) this._db.close(); + } + } + + // Exposed to let users modify the default timeout on a per-instance + // or global basis. + DBWrapper.prototype.OPEN_TIMEOUT = 2000; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const _cacheNameDetails = { + prefix: 'workbox', + suffix: self.registration.scope, + googleAnalytics: 'googleAnalytics', + precache: 'precache', + runtime: 'runtime' + }; + + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value.length > 0).join('-'); + }; + + const cacheNames = { + updateDetails: details => { + Object.keys(_cacheNameDetails).forEach(key => { + if (typeof details[key] !== 'undefined') { + _cacheNameDetails[key] = details[key]; + } + }); + }, + getGoogleAnalyticsName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); + }, + getPrecacheName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.precache); + }, + getRuntimeName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.runtime); + } + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var pluginEvents = { + CACHE_DID_UPDATE: 'cacheDidUpdate', + CACHE_WILL_UPDATE: 'cacheWillUpdate', + CACHED_RESPONSE_WILL_BE_USED: 'cachedResponseWillBeUsed', + FETCH_DID_FAIL: 'fetchDidFail', + REQUEST_WILL_FETCH: 'requestWillFetch' + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var pluginUtils = { + filter: (plugins, callbackname) => { + return plugins.filter(plugin => callbackname in plugin); + } + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const getFriendlyURL = url => { + const urlObj = new URL(url, location); + if (urlObj.origin === location.origin) { + return urlObj.pathname; + } + return urlObj.href; + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Wrapper around cache.put(). + * + * Will call `cacheDidUpdate` on plugins if the cache was updated. + * + * @param {Object} options + * @param {string} options.cacheName + * @param {Request} options.request + * @param {Response} options.response + * @param {Event} [options.event] + * @param {Array} [options.plugins=[]] + * + * @private + * @memberof module:workbox-core + */ + const putWrapper = (() => { + var _ref = babelHelpers.asyncToGenerator(function* ({ + cacheName, + request, + response, + event, + plugins = [] + } = {}) { + if (!response) { + { + defaultExport.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(request.url)}'.`); + } + + throw new WorkboxError('cache-put-with-no-response', { + url: getFriendlyURL(request.url) + }); + } + + let responseToCache = yield _isResponseSafeToCache({ request, response, event, plugins }); + + if (!responseToCache) { + { + defaultExport.debug(`Response '${getFriendlyURL(request.url)}' will not be ` + `cached.`, responseToCache); + } + return; + } + + { + if (responseToCache.method && responseToCache.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(request.url), + method: responseToCache.method + }); + } + } + + const cache = yield caches.open(cacheName); + + const updatePlugins = pluginUtils.filter(plugins, pluginEvents.CACHE_DID_UPDATE); + + let oldResponse = updatePlugins.length > 0 ? yield matchWrapper({ cacheName, request }) : null; + + { + defaultExport.debug(`Updating the '${cacheName}' cache with a new Response for ` + `${getFriendlyURL(request.url)}.`); + } + + try { + yield cache.put(request, responseToCache); + } catch (error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + yield executeQuotaErrorCallbacks(); + } + throw error; + } + + for (let plugin of updatePlugins) { + yield plugin[pluginEvents.CACHE_DID_UPDATE].call(plugin, { + cacheName, + request, + event, + oldResponse, + newResponse: responseToCache + }); + } + }); + + return function putWrapper() { + return _ref.apply(this, arguments); + }; + })(); + + /** + * This is a wrapper around cache.match(). + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache to match against. + * @param {Request} options.request The Request that will be used to look up + *. cache entries. + * @param {Event} [options.event] The event that propted the action. + * @param {Object} [options.matchOptions] Options passed to cache.match(). + * @param {Array} [options.plugins=[]] Array of plugins. + * @return {Response} A cached response if available. + * + * @private + * @memberof module:workbox-core + */ + const matchWrapper = (() => { + var _ref2 = babelHelpers.asyncToGenerator(function* ({ + cacheName, + request, + event, + matchOptions, + plugins = [] }) { + const cache = yield caches.open(cacheName); + let cachedResponse = yield cache.match(request, matchOptions); + { + if (cachedResponse) { + defaultExport.debug(`Found a cached response in '${cacheName}'.`); + } else { + defaultExport.debug(`No cached response found in '${cacheName}'.`); + } + } + for (let plugin of plugins) { + if (pluginEvents.CACHED_RESPONSE_WILL_BE_USED in plugin) { + cachedResponse = yield plugin[pluginEvents.CACHED_RESPONSE_WILL_BE_USED].call(plugin, { + cacheName, + request, + event, + matchOptions, + cachedResponse + }); + { + if (cachedResponse) { + finalAssertExports.isInstance(cachedResponse, Response, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED, + isReturnValueProblem: true + }); + } + } + } + } + return cachedResponse; + }); + + return function matchWrapper(_x) { + return _ref2.apply(this, arguments); + }; + })(); + + /** + * This method will call cacheWillUpdate on the available plugins (or use + * response.ok) to determine if the Response is safe and valid to cache. + * + * @param {Object} options + * @param {Request} options.request + * @param {Response} options.response + * @param {Event} [options.event] + * @param {Array} [options.plugins=[]] + * @return {Promise} + * + * @private + * @memberof module:workbox-core + */ + const _isResponseSafeToCache = (() => { + var _ref3 = babelHelpers.asyncToGenerator(function* ({ request, response, event, plugins }) { + let responseToCache = response; + let pluginsUsed = false; + for (let plugin of plugins) { + if (pluginEvents.CACHE_WILL_UPDATE in plugin) { + pluginsUsed = true; + responseToCache = yield plugin[pluginEvents.CACHE_WILL_UPDATE].call(plugin, { + request, + response: responseToCache, + event + }); + + { + if (responseToCache) { + finalAssertExports.isInstance(responseToCache, Response, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHE_WILL_UPDATE, + isReturnValueProblem: true + }); + } + } + + if (!responseToCache) { + break; + } + } + } + + if (!pluginsUsed) { + { + if (!responseToCache.ok) { + if (responseToCache.status === 0) { + defaultExport.warn(`The response for '${request.url}' is an opaque ` + `response. The caching strategy that you're using will not ` + `cache opaque responses by default.`); + } else { + defaultExport.debug(`The response for '${request.url}' returned ` + `a status code of '${response.status}' and won't be cached as a ` + `result.`); + } + } + } + responseToCache = responseToCache.ok ? responseToCache : null; + } + + return responseToCache ? responseToCache : null; + }); + + return function _isResponseSafeToCache(_x2) { + return _ref3.apply(this, arguments); + }; + })(); + + const cacheWrapper = { + put: putWrapper, + match: matchWrapper + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Wrapper around the fetch API. + * + * Will call requestWillFetch on available plugins. + * + * @param {Object} options + * @param {Request|string} options.request + * @param {Object} [options.fetchOptions] + * @param {Event} [options.event] + * @param {Array} [options.plugins=[]] + * @return {Promise} + * + * @private + * @memberof module:workbox-core + */ + const wrappedFetch = (() => { + var _ref = babelHelpers.asyncToGenerator(function* ({ + request, + fetchOptions, + event, + plugins = [] }) { + // We *should* be able to call `await event.preloadResponse` even if it's + // undefined, but for some reason, doing so leads to errors in our Node unit + // tests. To work around that, explicitly check preloadResponse's value first. + if (event && event.preloadResponse) { + const possiblePreloadResponse = yield event.preloadResponse; + if (possiblePreloadResponse) { + { + defaultExport.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + return possiblePreloadResponse; + } + } + + if (typeof request === 'string') { + request = new Request(request); + } + + { + finalAssertExports.isInstance(request, Request, { + paramName: request, + expectedClass: 'Request', + moduleName: 'workbox-core', + className: 'fetchWrapper', + funcName: 'wrappedFetch' + }); + } + + const failedFetchPlugins = pluginUtils.filter(plugins, pluginEvents.FETCH_DID_FAIL); + + // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + const originalRequest = failedFetchPlugins.length > 0 ? request.clone() : null; + + try { + for (let plugin of plugins) { + if (pluginEvents.REQUEST_WILL_FETCH in plugin) { + request = yield plugin[pluginEvents.REQUEST_WILL_FETCH].call(plugin, { + request: request.clone(), + event + }); + + { + if (request) { + finalAssertExports.isInstance(request, Request, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED, + isReturnValueProblem: true + }); + } + } + } + } + } catch (err) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownError: err + }); + } + + // The request can be altered by plugins with `requestWillFetch` making + // the original request (Most likely from a `fetch` event) to be different + // to the Request we make. Pass both to `fetchDidFail` to aid debugging. + const pluginFilteredRequest = request.clone(); + + try { + const fetchResponse = yield fetch(request, fetchOptions); + { + defaultExport.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + return fetchResponse; + } catch (error) { + { + defaultExport.error(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } + + for (let plugin of failedFetchPlugins) { + yield plugin[pluginEvents.FETCH_DID_FAIL].call(plugin, { + error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + + throw error; + } + }); + + return function wrappedFetch(_x) { + return _ref.apply(this, arguments); + }; + })(); + + const fetchWrapper = { + fetch: wrappedFetch + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var _private = /*#__PURE__*/Object.freeze({ + DBWrapper: DBWrapper, + WorkboxError: WorkboxError, + assert: finalAssertExports, + cacheNames: cacheNames, + cacheWrapper: cacheWrapper, + fetchWrapper: fetchWrapper, + getFriendlyURL: getFriendlyURL, + logger: defaultExport + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Logs a warning to the user recommending changing + * to max-age=0 or no-cache. + * + * @param {string} cacheControlHeader + * + * @private + */ + function showWarning(cacheControlHeader) { + const docsUrl = 'https://developers.google.com/web/tools/workbox/guides/service-worker-checklist#cache-control_of_your_service_worker_file'; + defaultExport.warn(`You are setting a 'cache-control' header of ` + `'${cacheControlHeader}' on your service worker file. This should be ` + `set to 'max-age=0' or 'no-cache' to ensure the latest service worker ` + `is served to your users. Learn more here: ${docsUrl}`); + } + + /** + * Checks for cache-control header on SW file and + * warns the developer if it exists with a value + * other than max-age=0 or no-cache. + * + * @return {Promise} + * @private + */ + function checkSWFileCacheHeaders() { + // This is wrapped as an iife to allow async/await while making + // rollup exclude it in builds. + return babelHelpers.asyncToGenerator(function* () { + try { + const swFile = self.location.href; + const response = yield fetch(swFile); + if (!response.ok) { + // Response failed so nothing we can check; + return; + } + + if (!response.headers.has('cache-control')) { + // No cache control header. + return; + } + + const cacheControlHeader = response.headers.get('cache-control'); + const maxAgeResult = /max-age\s*=\s*(\d*)/g.exec(cacheControlHeader); + if (maxAgeResult) { + if (parseInt(maxAgeResult[1], 10) === 0) { + return; + } + } + + if (cacheControlHeader.indexOf('no-cache') !== -1) { + return; + } + + if (cacheControlHeader.indexOf('no-store') !== -1) { + return; + } + + showWarning(cacheControlHeader); + } catch (err) { + // NOOP + } + })(); + } + + const finalCheckSWFileCacheHeaders = checkSWFileCacheHeaders; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * This class is never exposed publicly. Inidividual methods are exposed + * using jsdoc alias commands. + * + * @memberof workbox.core + * @private + */ + class WorkboxCore { + /** + * You should not instantiate this object directly. + * + * @private + */ + constructor() { + // Give our version strings something to hang off of. + try { + self.workbox.v = self.workbox.v || {}; + } catch (err) {} + // NOOP + + + // A WorkboxCore instance must be exported before we can use the logger. + // This is so it can get the current log level. + { + const padding = ' '; + defaultExport.groupCollapsed('Welcome to Workbox!'); + defaultExport.unprefixed.log(`You are currently using a development build. ` + `By default this will switch to prod builds when not on localhost. ` + `You can force this with workbox.setConfig({debug: true|false}).`); + defaultExport.unprefixed.log(`📖 Read the guides and documentation\n` + `${padding}https://developers.google.com/web/tools/workbox/`); + defaultExport.unprefixed.log(`❓ Use the [workbox] tag on Stack Overflow to ask questions\n` + `${padding}https://stackoverflow.com/questions/ask?tags=workbox`); + defaultExport.unprefixed.log(`🐛 Found a bug? Report it on GitHub\n` + `${padding}https://github.com/GoogleChrome/workbox/issues/new`); + defaultExport.groupEnd(); + + if (typeof finalCheckSWFileCacheHeaders === 'function') { + finalCheckSWFileCacheHeaders(); + } + } + } + + /** + * Get the current cache names used by Workbox. + * + * `cacheNames.precache` is used for precached assets, + * `cacheNames.googleAnalytics` is used by `workbox-google-analytics` to + * store `analytics.js`, + * and `cacheNames.runtime` is used for everything else. + * + * @return {Object} An object with `precache` and `runtime` cache names. + * + * @alias workbox.core.cacheNames + */ + get cacheNames() { + return { + googleAnalytics: cacheNames.getGoogleAnalyticsName(), + precache: cacheNames.getPrecacheName(), + runtime: cacheNames.getRuntimeName() + }; + } + + /** + * You can alter the default cache names used by the Workbox modules by + * changing the cache name details. + * + * Cache names are generated as `--`. + * + * @param {Object} details + * @param {Object} details.prefix The string to add to the beginning of + * the precache and runtime cache names. + * @param {Object} details.suffix The string to add to the end of + * the precache and runtime cache names. + * @param {Object} details.precache The cache name to use for precache + * caching. + * @param {Object} details.runtime The cache name to use for runtime caching. + * @param {Object} details.googleAnalytics The cache name to use for + * `workbox-google-analytics` caching. + * + * @alias workbox.core.setCacheNameDetails + */ + setCacheNameDetails(details) { + { + Object.keys(details).forEach(key => { + finalAssertExports.isType(details[key], 'string', { + moduleName: 'workbox-core', + className: 'WorkboxCore', + funcName: 'setCacheNameDetails', + paramName: `details.${key}` + }); + }); + + if ('precache' in details && details.precache.length === 0) { + throw new WorkboxError('invalid-cache-name', { + cacheNameId: 'precache', + value: details.precache + }); + } + + if ('runtime' in details && details.runtime.length === 0) { + throw new WorkboxError('invalid-cache-name', { + cacheNameId: 'runtime', + value: details.runtime + }); + } + + if ('googleAnalytics' in details && details.googleAnalytics.length === 0) { + throw new WorkboxError('invalid-cache-name', { + cacheNameId: 'googleAnalytics', + value: details.googleAnalytics + }); + } + } + + cacheNames.updateDetails(details); + } + + /** + * Get the current log level. + * + * @return {number}. + * + * @alias workbox.core.logLevel + */ + get logLevel() { + return getLoggerLevel(); + } + + /** + * Set the current log level passing in one of the values from + * [LOG_LEVELS]{@link module:workbox-core.LOG_LEVELS}. + * + * @param {number} newLevel The new log level to use. + * + * @alias workbox.core.setLogLevel + */ + setLogLevel(newLevel) { + { + finalAssertExports.isType(newLevel, 'number', { + moduleName: 'workbox-core', + className: 'WorkboxCore', + funcName: 'logLevel [setter]', + paramName: `logLevel` + }); + } + + if (newLevel > LOG_LEVELS.silent || newLevel < LOG_LEVELS.debug) { + throw new WorkboxError('invalid-value', { + paramName: 'logLevel', + validValueDescription: `Please use a value from LOG_LEVELS, i.e ` + `'logLevel = workbox.core.LOG_LEVELS.debug'.`, + value: newLevel + }); + } + + setLoggerLevel(newLevel); + } + } + + var defaultExport$1 = new WorkboxCore(); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const finalExports = Object.assign(defaultExport$1, { + _private, + LOG_LEVELS, + registerQuotaErrorCallback + }); + + return finalExports; + +}()); + +//# sourceMappingURL=workbox-core.dev.js.map diff --git a/workbox-v3.6.3/workbox-core.dev.js.map b/workbox-v3.6.3/workbox-core.dev.js.map new file mode 100644 index 0000000..52f27fb --- /dev/null +++ b/workbox-v3.6.3/workbox-core.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-core/browser.mjs"],"sourcesContent":["/* eslint-disable */\n// This is extracted from the Babel runtime (original source: https://github.com/babel/babel/blob/9e0f5235b1ca5167c368a576ad7c5af62d20b0e3/packages/babel-helpers/src/helpers.js#L240).\n// As part of the Rollup bundling process, it's injected once into workbox-core\n// and reused throughout all of the other modules, avoiding code duplication.\n// See https://github.com/GoogleChrome/workbox/pull/1048#issuecomment-344698046\n// for further background.\nself.babelHelpers = {\n asyncToGenerator: function(fn) {\n return function() {\n var gen = fn.apply(this, arguments);\n return new Promise(function(resolve, reject) {\n function step(key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n return Promise.resolve(value).then(function(value) {\n step('next', value);\n }, function(err) {\n step('throw', err);\n });\n }\n }\n\n return step('next');\n });\n };\n },\n};\n\nthis.workbox = this.workbox || {};\nthis.workbox.core = (function () {\n 'use strict';\n\n try {\n self.workbox.v['workbox:core:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * The available log levels in Workbox: debug, log, warn, error and silent.\n *\n * @property {int} debug Prints all logs from Workbox. Useful for debugging.\n * @property {int} log Prints console log, warn, error and groups. Default for\n * debug builds.\n * @property {int} warn Prints console warn, error and groups. Default for\n * non-debug builds.\n * @property {int} error Print console error and groups.\n * @property {int} silent Force no logging from Workbox.\n *\n * @alias workbox.core.LOG_LEVELS\n */\n\n var LOG_LEVELS = {\n debug: 0,\n log: 1,\n warn: 2,\n error: 3,\n silent: 4\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n // Safari doesn't print all console.groupCollapsed() arguments.\n // Related bug: https://bugs.webkit.org/show_bug.cgi?id=182754\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n const GREY = `#7f8c8d`;\n const GREEN = `#2ecc71`;\n const YELLOW = `#f39c12`;\n const RED = `#c0392b`;\n const BLUE = `#3498db`;\n\n const getDefaultLogLevel = () => LOG_LEVELS.log;\n\n let logLevel = getDefaultLogLevel();\n const shouldPrint = minLevel => logLevel <= minLevel;\n const setLoggerLevel = newLogLevel => logLevel = newLogLevel;\n const getLoggerLevel = () => logLevel;\n\n // We always want groups to be logged unless logLevel is silent.\n const groupLevel = LOG_LEVELS.error;\n\n const _print = function (keyName, logArgs, levelColor) {\n const logLevel = keyName.indexOf('group') === 0 ? groupLevel : LOG_LEVELS[keyName];\n if (!shouldPrint(logLevel)) {\n return;\n }\n\n if (!levelColor || keyName === 'groupCollapsed' && isSafari) {\n console[keyName](...logArgs);\n return;\n }\n\n const logPrefix = ['%cworkbox', `background: ${levelColor}; color: white; padding: 2px 0.5em; ` + `border-radius: 0.5em;`];\n console[keyName](...logPrefix, ...logArgs);\n };\n\n const groupEnd = () => {\n if (shouldPrint(groupLevel)) {\n console.groupEnd();\n }\n };\n\n const defaultExport = {\n groupEnd,\n unprefixed: {\n groupEnd\n }\n };\n\n const setupLogs = (keyName, color) => {\n defaultExport[keyName] = (...args) => _print(keyName, args, color);\n defaultExport.unprefixed[keyName] = (...args) => _print(keyName, args);\n };\n\n const levelToColor = {\n debug: GREY,\n log: GREEN,\n warn: YELLOW,\n error: RED,\n groupCollapsed: BLUE\n };\n Object.keys(levelToColor).forEach(keyName => setupLogs(keyName, levelToColor[keyName]));\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var messages = {\n 'invalid-value': ({ paramName, validValueDescription, value }) => {\n if (!paramName || !validValueDescription) {\n throw new Error(`Unexpected input to 'invalid-value' error.`);\n }\n return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`;\n },\n\n 'not-in-sw': ({ moduleName }) => {\n if (!moduleName) {\n throw new Error(`Unexpected input to 'not-in-sw' error.`);\n }\n return `The '${moduleName}' must be used in a service worker.`;\n },\n\n 'not-an-array': ({ moduleName, className, funcName, paramName }) => {\n if (!moduleName || !className || !funcName || !paramName) {\n throw new Error(`Unexpected input to 'not-an-array' error.`);\n }\n return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`;\n },\n\n 'incorrect-type': ({ expectedType, paramName, moduleName, className,\n funcName }) => {\n if (!expectedType || !paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-type' error.`);\n }\n return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}` + `${funcName}()' must be of type ${expectedType}.`;\n },\n\n 'incorrect-class': ({ expectedClass, paramName, moduleName, className,\n funcName, isReturnValueProblem }) => {\n if (!expectedClass || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-class' error.`);\n }\n\n if (isReturnValueProblem) {\n return `The return value from ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;\n }\n\n return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;\n },\n\n 'missing-a-method': ({ expectedMethod, paramName, moduleName, className,\n funcName }) => {\n if (!expectedMethod || !paramName || !moduleName || !className || !funcName) {\n throw new Error(`Unexpected input to 'missing-a-method' error.`);\n }\n return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`;\n },\n\n 'add-to-cache-list-unexpected-type': ({ entry }) => {\n return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`;\n },\n\n 'add-to-cache-list-conflicting-entries': ({ firstEntry, secondEntry }) => {\n if (!firstEntry || !secondEntry) {\n throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`);\n }\n\n return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had matching ` + `URLs but different revision details. This means workbox-precaching ` + `is unable to determine cache the asset correctly. Please remove one ` + `of the entries.`;\n },\n\n 'plugin-error-request-will-fetch': ({ thrownError }) => {\n if (!thrownError) {\n throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`);\n }\n\n return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`;\n },\n\n 'invalid-cache-name': ({ cacheNameId, value }) => {\n if (!cacheNameId) {\n throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);\n }\n\n return `You must provide a name containing at least one character for ` + `setCacheDeatils({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`;\n },\n\n 'unregister-route-but-not-found-with-method': ({ method }) => {\n if (!method) {\n throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`);\n }\n\n return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`;\n },\n\n 'unregister-route-route-not-registered': () => {\n return `The route you're trying to unregister was not previously ` + `registered.`;\n },\n\n 'queue-replay-failed': ({ name, count }) => {\n return `${count} requests failed, while trying to replay Queue: ${name}.`;\n },\n\n 'duplicate-queue-name': ({ name }) => {\n return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`;\n },\n\n 'expired-test-without-max-age': ({ methodName, paramName }) => {\n return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`;\n },\n\n 'unsupported-route-type': ({ moduleName, className, funcName, paramName }) => {\n return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`;\n },\n\n 'not-array-of-class': ({ value, expectedClass,\n moduleName, className, funcName, paramName }) => {\n return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`;\n },\n\n 'max-entries-or-age-required': ({ moduleName, className, funcName }) => {\n return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`;\n },\n\n 'statuses-or-headers-required': ({ moduleName, className, funcName }) => {\n return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`;\n },\n\n 'invalid-string': ({ moduleName, className, funcName, paramName }) => {\n if (!paramName || !moduleName || !className || !funcName) {\n throw new Error(`Unexpected input to 'invalid-string' error.`);\n }\n return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${className}.${funcName}() for ` + `more info.`;\n },\n 'channel-name-required': () => {\n return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`;\n },\n 'invalid-responses-are-same-args': () => {\n return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`;\n },\n 'expire-custom-caches-only': () => {\n return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`;\n },\n 'unit-must-be-bytes': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);\n }\n return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was \"${normalizedRangeHeader}\"`;\n },\n 'single-range-only': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'single-range-only' error.`);\n }\n return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `\"${normalizedRangeHeader}\"`;\n },\n 'invalid-range-values': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'invalid-range-values' error.`);\n }\n return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `\"${normalizedRangeHeader}\"`;\n },\n 'no-range-header': () => {\n return `No Range header was found in the Request provided.`;\n },\n 'range-not-satisfiable': ({ size, start, end }) => {\n return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`;\n },\n 'attempt-to-cache-non-get-request': ({ url, method }) => {\n return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`;\n },\n 'cache-put-with-no-response': ({ url }) => {\n return `There was an attempt to cache '${url}' but the response was not ` + `defined.`;\n }\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const generatorFunction = (code, ...args) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n\n return message(...args);\n };\n\n const exportedValue = generatorFunction;\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\n class WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n let message = exportedValue(errorCode, details);\n\n super(message);\n\n this.name = errorCode;\n this.details = details;\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n * This method returns true if the current context is a service worker.\n */\n const isSwEnv = moduleName => {\n if (!('ServiceWorkerGlobalScope' in self)) {\n throw new WorkboxError('not-in-sw', { moduleName });\n }\n };\n\n /*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\n const isArray = (value, { moduleName, className, funcName, paramName }) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', {\n moduleName,\n className,\n funcName,\n paramName\n });\n }\n };\n\n const hasMethod = (object, expectedMethod, { moduleName, className, funcName, paramName }) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n throw new WorkboxError('missing-a-method', { paramName, expectedMethod,\n moduleName, className, funcName });\n }\n };\n\n const isType = (object, expectedType, { moduleName, className, funcName, paramName }) => {\n if (typeof object !== expectedType) {\n throw new WorkboxError('incorrect-type', { paramName, expectedType,\n moduleName, className, funcName });\n }\n };\n\n const isInstance = (object, expectedClass, { moduleName, className, funcName,\n paramName, isReturnValueProblem }) => {\n if (!(object instanceof expectedClass)) {\n throw new WorkboxError('incorrect-class', { paramName, expectedClass,\n moduleName, className, funcName, isReturnValueProblem });\n }\n };\n\n const isOneOf = (value, validValues, { paramName }) => {\n if (!validValues.includes(value)) {\n throw new WorkboxError('invalid-value', {\n paramName,\n value,\n validValueDescription: `Valid values are ${JSON.stringify(validValues)}.`\n });\n }\n };\n\n const isArrayOfClass = (value, expectedClass, { moduleName, className, funcName, paramName }) => {\n const error = new WorkboxError('not-array-of-class', {\n value, expectedClass,\n moduleName, className, funcName, paramName\n });\n if (!Array.isArray(value)) {\n throw error;\n }\n\n for (let item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n };\n\n const finalAssertExports = {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isSwEnv,\n isType,\n isArrayOfClass\n };\n\n /**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof workbox.core\n * @private\n */\n let executeQuotaErrorCallbacks = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* () {\n {\n defaultExport.log(`About to run ${callbacks.size} callbacks to clean up caches.`);\n }\n\n for (const callback of callbacks) {\n yield callback();\n {\n defaultExport.log(callback, 'is complete.');\n }\n }\n\n {\n defaultExport.log('Finished running callbacks.');\n }\n });\n\n return function executeQuotaErrorCallbacks() {\n return _ref.apply(this, arguments);\n };\n })();\n\n const callbacks = new Set();\n\n /**\n * Adds a function to the set of callbacks that will be executed when there's\n * a quota error.\n *\n * @param {Function} callback\n * @memberof workbox.core\n */\n function registerQuotaErrorCallback(callback) {\n {\n finalAssertExports.isType(callback, 'function', {\n moduleName: 'workbox-core',\n funcName: 'register',\n paramName: 'callback'\n });\n }\n\n callbacks.add(callback);\n\n {\n defaultExport.log('Registered a callback to respond to quota errors.', callback);\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * A class that wraps common IndexedDB functionality in a promise-based API.\n * It exposes all the underlying power and functionality of IndexedDB, but\n * wraps the most commonly used features in a way that's much simpler to use.\n *\n * @private\n */\n class DBWrapper {\n /**\n * @param {string} name\n * @param {number} version\n * @param {Object=} [callback]\n * @param {function(this:DBWrapper, Event)} [callbacks.onupgradeneeded]\n * @param {function(this:DBWrapper, Event)} [callbacks.onversionchange]\n * Defaults to DBWrapper.prototype._onversionchange when not specified.\n */\n constructor(name, version, {\n onupgradeneeded,\n onversionchange = this._onversionchange\n } = {}) {\n this._name = name;\n this._version = version;\n this._onupgradeneeded = onupgradeneeded;\n this._onversionchange = onversionchange;\n\n // If this is null, it means the database isn't open.\n this._db = null;\n }\n\n /**\n * Opens a connected to an IDBDatabase, invokes any onupgradedneeded\n * callback, and added an onversionchange callback to the database.\n *\n * @return {IDBDatabase}\n *\n * @private\n */\n open() {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (_this._db) return;\n\n _this._db = yield new Promise(function (resolve, reject) {\n // This flag is flipped to true if the timeout callback runs prior\n // to the request failing or succeeding. Note: we use a timeout instead\n // of an onblocked handler since there are cases where onblocked will\n // never never run. A timeout better handles all possible scenarios:\n // https://github.com/w3c/IndexedDB/issues/223\n let openRequestTimedOut = false;\n setTimeout(function () {\n openRequestTimedOut = true;\n reject(new Error('The open request was blocked and timed out'));\n }, _this.OPEN_TIMEOUT);\n\n const openRequest = indexedDB.open(_this._name, _this._version);\n openRequest.onerror = function (evt) {\n return reject(openRequest.error);\n };\n openRequest.onupgradeneeded = function (evt) {\n if (openRequestTimedOut) {\n openRequest.transaction.abort();\n evt.target.result.close();\n } else if (_this._onupgradeneeded) {\n _this._onupgradeneeded(evt);\n }\n };\n openRequest.onsuccess = function (evt) {\n const db = evt.target.result;\n if (openRequestTimedOut) {\n db.close();\n } else {\n db.onversionchange = _this._onversionchange;\n resolve(db);\n }\n };\n });\n\n return _this;\n })();\n }\n\n /**\n * Delegates to the native `get()` method for the object store.\n *\n * @param {string} storeName The name of the object store to put the value.\n * @param {...*} args The values passed to the delegated method.\n * @return {*} The key of the entry.\n *\n * @private\n */\n get(storeName, ...args) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n return yield _this2._call('get', storeName, 'readonly', ...args);\n })();\n }\n\n /**\n * Delegates to the native `add()` method for the object store.\n *\n * @param {string} storeName The name of the object store to put the value.\n * @param {...*} args The values passed to the delegated method.\n * @return {*} The key of the entry.\n *\n * @private\n */\n add(storeName, ...args) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n return yield _this3._call('add', storeName, 'readwrite', ...args);\n })();\n }\n\n /**\n * Delegates to the native `put()` method for the object store.\n *\n * @param {string} storeName The name of the object store to put the value.\n * @param {...*} args The values passed to the delegated method.\n * @return {*} The key of the entry.\n *\n * @private\n */\n put(storeName, ...args) {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n return yield _this4._call('put', storeName, 'readwrite', ...args);\n })();\n }\n\n /**\n * Delegates to the native `delete()` method for the object store.\n *\n * @param {string} storeName\n * @param {...*} args The values passed to the delegated method.\n *\n * @private\n */\n delete(storeName, ...args) {\n var _this5 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this5._call('delete', storeName, 'readwrite', ...args);\n })();\n }\n\n /**\n * Deletes the underlying database, ensuring that any open connections are\n * closed first.\n *\n * @private\n */\n deleteDatabase() {\n var _this6 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n _this6.close();\n _this6._db = null;\n yield new Promise(function (resolve, reject) {\n const request = indexedDB.deleteDatabase(_this6._name);\n request.onerror = function (evt) {\n return reject(evt.target.error);\n };\n request.onblocked = function () {\n return reject(new Error('Deletion was blocked.'));\n };\n request.onsuccess = function () {\n return resolve();\n };\n });\n })();\n }\n\n /**\n * Delegates to the native `getAll()` or polyfills it via the `find()`\n * method in older browsers.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n *\n * @private\n */\n getAll(storeName, query, count) {\n var _this7 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if ('getAll' in IDBObjectStore.prototype) {\n return yield _this7._call('getAll', storeName, 'readonly', query, count);\n } else {\n return yield _this7.getAllMatching(storeName, { query, count });\n }\n })();\n }\n\n /**\n * Supports flexible lookup in an object store by specifying an index,\n * query, direction, and count. This method returns an array of objects\n * with the signature .\n *\n * @param {string} storeName\n * @param {Object} [opts]\n * @param {IDBCursorDirection} [opts.direction]\n * @param {*} [opts.query]\n * @param {string} [opts.index] The index to use (if specified).\n * @param {number} [opts.count] The max number of results to return.\n * @param {boolean} [opts.includeKeys] When true, the structure of the\n * returned objects is changed from an array of values to an array of\n * objects in the form {key, primaryKey, value}.\n * @return {Array}\n *\n * @private\n */\n getAllMatching(storeName, opts = {}) {\n var _this8 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n return yield _this8.transaction([storeName], 'readonly', function (stores, done) {\n const store = stores[storeName];\n const target = opts.index ? store.index(opts.index) : store;\n const results = [];\n\n // Passing `undefined` arguments to Edge's `openCursor(...)` causes\n // 'DOMException: DataError'\n // Details in issue: https://github.com/GoogleChrome/workbox/issues/1509\n const query = opts.query || null;\n const direction = opts.direction || 'next';\n target.openCursor(query, direction).onsuccess = function (evt) {\n const cursor = evt.target.result;\n if (cursor) {\n const { primaryKey, key, value } = cursor;\n results.push(opts.includeKeys ? { primaryKey, key, value } : value);\n if (opts.count && results.length >= opts.count) {\n done(results);\n } else {\n cursor.continue();\n }\n } else {\n done(results);\n }\n };\n });\n })();\n }\n\n /**\n * Accepts a list of stores, a transaction type, and a callback and\n * performs a transaction. A promise is returned that resolves to whatever\n * value the callback chooses. The callback holds all the transaction logic\n * and is invoked with three arguments:\n * 1. An object mapping object store names to IDBObjectStore values.\n * 2. A `done` function, that's used to resolve the promise when\n * when the transaction is done.\n * 3. An `abort` function that can be called to abort the transaction\n * at any time.\n *\n * @param {Array} storeNames An array of object store names\n * involved in the transaction.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {function(Object, function(), function(*)):?IDBRequest} callback\n * @return {*} The result of the transaction ran by the callback.\n *\n * @private\n */\n transaction(storeNames, type, callback) {\n var _this9 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this9.open();\n const result = yield new Promise(function (resolve, reject) {\n const txn = _this9._db.transaction(storeNames, type);\n const done = function (value) {\n return resolve(value);\n };\n const abort = function () {\n reject(new Error('The transaction was manually aborted'));\n txn.abort();\n };\n txn.onerror = function (evt) {\n return reject(evt.target.error);\n };\n txn.onabort = function (evt) {\n return reject(evt.target.error);\n };\n txn.oncomplete = function () {\n return resolve();\n };\n\n const stores = {};\n for (const storeName of storeNames) {\n stores[storeName] = txn.objectStore(storeName);\n }\n callback(stores, done, abort);\n });\n return result;\n })();\n }\n\n /**\n * Delegates async to a native IDBObjectStore method.\n *\n * @param {string} method The method name.\n * @param {string} storeName The object store name.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {...*} args The list of args to pass to the native method.\n * @return {*} The result of the transaction.\n *\n * @private\n */\n _call(method, storeName, type, ...args) {\n var _this10 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this10.open();\n const callback = function (stores, done) {\n stores[storeName][method](...args).onsuccess = function (evt) {\n done(evt.target.result);\n };\n };\n\n return yield _this10.transaction([storeName], type, callback);\n })();\n }\n\n /**\n * The default onversionchange handler, which closes the database so other\n * connections can open without being blocked.\n *\n * @param {Event} evt\n *\n * @private\n */\n _onversionchange(evt) {\n this.close();\n }\n\n /**\n * Closes the connection opened by `DBWrapper.open()`. Generally this method\n * doesn't need to be called since:\n * 1. It's usually better to keep a connection open since opening\n * a new connection is somewhat slow.\n * 2. Connections are automatically closed when the reference is\n * garbage collected.\n * The primary use case for needing to close a connection is when another\n * reference (typically in another tab) needs to upgrade it and would be\n * blocked by the current, open connection.\n *\n * @private\n */\n close() {\n if (this._db) this._db.close();\n }\n }\n\n // Exposed to let users modify the default timeout on a per-instance\n // or global basis.\n DBWrapper.prototype.OPEN_TIMEOUT = 2000;\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const _cacheNameDetails = {\n prefix: 'workbox',\n suffix: self.registration.scope,\n googleAnalytics: 'googleAnalytics',\n precache: 'precache',\n runtime: 'runtime'\n };\n\n const _createCacheName = cacheName => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value.length > 0).join('-');\n };\n\n const cacheNames = {\n updateDetails: details => {\n Object.keys(_cacheNameDetails).forEach(key => {\n if (typeof details[key] !== 'undefined') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: userCacheName => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: userCacheName => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getRuntimeName: userCacheName => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n }\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var pluginEvents = {\n CACHE_DID_UPDATE: 'cacheDidUpdate',\n CACHE_WILL_UPDATE: 'cacheWillUpdate',\n CACHED_RESPONSE_WILL_BE_USED: 'cachedResponseWillBeUsed',\n FETCH_DID_FAIL: 'fetchDidFail',\n REQUEST_WILL_FETCH: 'requestWillFetch'\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var pluginUtils = {\n filter: (plugins, callbackname) => {\n return plugins.filter(plugin => callbackname in plugin);\n }\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const getFriendlyURL = url => {\n const urlObj = new URL(url, location);\n if (urlObj.origin === location.origin) {\n return urlObj.pathname;\n }\n return urlObj.href;\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Wrapper around cache.put().\n *\n * Will call `cacheDidUpdate` on plugins if the cache was updated.\n *\n * @param {Object} options\n * @param {string} options.cacheName\n * @param {Request} options.request\n * @param {Response} options.response\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n *\n * @private\n * @memberof module:workbox-core\n */\n const putWrapper = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* ({\n cacheName,\n request,\n response,\n event,\n plugins = []\n } = {}) {\n if (!response) {\n {\n defaultExport.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(request.url)}'.`);\n }\n\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(request.url)\n });\n }\n\n let responseToCache = yield _isResponseSafeToCache({ request, response, event, plugins });\n\n if (!responseToCache) {\n {\n defaultExport.debug(`Response '${getFriendlyURL(request.url)}' will not be ` + `cached.`, responseToCache);\n }\n return;\n }\n\n {\n if (responseToCache.method && responseToCache.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(request.url),\n method: responseToCache.method\n });\n }\n }\n\n const cache = yield caches.open(cacheName);\n\n const updatePlugins = pluginUtils.filter(plugins, pluginEvents.CACHE_DID_UPDATE);\n\n let oldResponse = updatePlugins.length > 0 ? yield matchWrapper({ cacheName, request }) : null;\n\n {\n defaultExport.debug(`Updating the '${cacheName}' cache with a new Response for ` + `${getFriendlyURL(request.url)}.`);\n }\n\n try {\n yield cache.put(request, responseToCache);\n } catch (error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n yield executeQuotaErrorCallbacks();\n }\n throw error;\n }\n\n for (let plugin of updatePlugins) {\n yield plugin[pluginEvents.CACHE_DID_UPDATE].call(plugin, {\n cacheName,\n request,\n event,\n oldResponse,\n newResponse: responseToCache\n });\n }\n });\n\n return function putWrapper() {\n return _ref.apply(this, arguments);\n };\n })();\n\n /**\n * This is a wrapper around cache.match().\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache to match against.\n * @param {Request} options.request The Request that will be used to look up\n *. cache entries.\n * @param {Event} [options.event] The event that propted the action.\n * @param {Object} [options.matchOptions] Options passed to cache.match().\n * @param {Array} [options.plugins=[]] Array of plugins.\n * @return {Response} A cached response if available.\n *\n * @private\n * @memberof module:workbox-core\n */\n const matchWrapper = (() => {\n var _ref2 = babelHelpers.asyncToGenerator(function* ({\n cacheName,\n request,\n event,\n matchOptions,\n plugins = [] }) {\n const cache = yield caches.open(cacheName);\n let cachedResponse = yield cache.match(request, matchOptions);\n {\n if (cachedResponse) {\n defaultExport.debug(`Found a cached response in '${cacheName}'.`);\n } else {\n defaultExport.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (let plugin of plugins) {\n if (pluginEvents.CACHED_RESPONSE_WILL_BE_USED in plugin) {\n cachedResponse = yield plugin[pluginEvents.CACHED_RESPONSE_WILL_BE_USED].call(plugin, {\n cacheName,\n request,\n event,\n matchOptions,\n cachedResponse\n });\n {\n if (cachedResponse) {\n finalAssertExports.isInstance(cachedResponse, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,\n isReturnValueProblem: true\n });\n }\n }\n }\n }\n return cachedResponse;\n });\n\n return function matchWrapper(_x) {\n return _ref2.apply(this, arguments);\n };\n })();\n\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * response.ok) to determine if the Response is safe and valid to cache.\n *\n * @param {Object} options\n * @param {Request} options.request\n * @param {Response} options.response\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\n const _isResponseSafeToCache = (() => {\n var _ref3 = babelHelpers.asyncToGenerator(function* ({ request, response, event, plugins }) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (let plugin of plugins) {\n if (pluginEvents.CACHE_WILL_UPDATE in plugin) {\n pluginsUsed = true;\n responseToCache = yield plugin[pluginEvents.CACHE_WILL_UPDATE].call(plugin, {\n request,\n response: responseToCache,\n event\n });\n\n {\n if (responseToCache) {\n finalAssertExports.isInstance(responseToCache, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHE_WILL_UPDATE,\n isReturnValueProblem: true\n });\n }\n }\n\n if (!responseToCache) {\n break;\n }\n }\n }\n\n if (!pluginsUsed) {\n {\n if (!responseToCache.ok) {\n if (responseToCache.status === 0) {\n defaultExport.warn(`The response for '${request.url}' is an opaque ` + `response. The caching strategy that you're using will not ` + `cache opaque responses by default.`);\n } else {\n defaultExport.debug(`The response for '${request.url}' returned ` + `a status code of '${response.status}' and won't be cached as a ` + `result.`);\n }\n }\n }\n responseToCache = responseToCache.ok ? responseToCache : null;\n }\n\n return responseToCache ? responseToCache : null;\n });\n\n return function _isResponseSafeToCache(_x2) {\n return _ref3.apply(this, arguments);\n };\n })();\n\n const cacheWrapper = {\n put: putWrapper,\n match: matchWrapper\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Wrapper around the fetch API.\n *\n * Will call requestWillFetch on available plugins.\n *\n * @param {Object} options\n * @param {Request|string} options.request\n * @param {Object} [options.fetchOptions]\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\n const wrappedFetch = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* ({\n request,\n fetchOptions,\n event,\n plugins = [] }) {\n // We *should* be able to call `await event.preloadResponse` even if it's\n // undefined, but for some reason, doing so leads to errors in our Node unit\n // tests. To work around that, explicitly check preloadResponse's value first.\n if (event && event.preloadResponse) {\n const possiblePreloadResponse = yield event.preloadResponse;\n if (possiblePreloadResponse) {\n {\n defaultExport.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n {\n finalAssertExports.isInstance(request, Request, {\n paramName: request,\n expectedClass: 'Request',\n moduleName: 'workbox-core',\n className: 'fetchWrapper',\n funcName: 'wrappedFetch'\n });\n }\n\n const failedFetchPlugins = pluginUtils.filter(plugins, pluginEvents.FETCH_DID_FAIL);\n\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = failedFetchPlugins.length > 0 ? request.clone() : null;\n\n try {\n for (let plugin of plugins) {\n if (pluginEvents.REQUEST_WILL_FETCH in plugin) {\n request = yield plugin[pluginEvents.REQUEST_WILL_FETCH].call(plugin, {\n request: request.clone(),\n event\n });\n\n {\n if (request) {\n finalAssertExports.isInstance(request, Request, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,\n isReturnValueProblem: true\n });\n }\n }\n }\n }\n } catch (err) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownError: err\n });\n }\n\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (Most likely from a `fetch` event) to be different\n // to the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n\n try {\n const fetchResponse = yield fetch(request, fetchOptions);\n {\n defaultExport.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`);\n }\n return fetchResponse;\n } catch (error) {\n {\n defaultExport.error(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n\n for (let plugin of failedFetchPlugins) {\n yield plugin[pluginEvents.FETCH_DID_FAIL].call(plugin, {\n error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone()\n });\n }\n\n throw error;\n }\n });\n\n return function wrappedFetch(_x) {\n return _ref.apply(this, arguments);\n };\n })();\n\n const fetchWrapper = {\n fetch: wrappedFetch\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var _private = /*#__PURE__*/Object.freeze({\n DBWrapper: DBWrapper,\n WorkboxError: WorkboxError,\n assert: finalAssertExports,\n cacheNames: cacheNames,\n cacheWrapper: cacheWrapper,\n fetchWrapper: fetchWrapper,\n getFriendlyURL: getFriendlyURL,\n logger: defaultExport\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Logs a warning to the user recommending changing\n * to max-age=0 or no-cache.\n *\n * @param {string} cacheControlHeader\n *\n * @private\n */\n function showWarning(cacheControlHeader) {\n const docsUrl = 'https://developers.google.com/web/tools/workbox/guides/service-worker-checklist#cache-control_of_your_service_worker_file';\n defaultExport.warn(`You are setting a 'cache-control' header of ` + `'${cacheControlHeader}' on your service worker file. This should be ` + `set to 'max-age=0' or 'no-cache' to ensure the latest service worker ` + `is served to your users. Learn more here: ${docsUrl}`);\n }\n\n /**\n * Checks for cache-control header on SW file and\n * warns the developer if it exists with a value\n * other than max-age=0 or no-cache.\n *\n * @return {Promise}\n * @private\n */\n function checkSWFileCacheHeaders() {\n // This is wrapped as an iife to allow async/await while making\n // rollup exclude it in builds.\n return babelHelpers.asyncToGenerator(function* () {\n try {\n const swFile = self.location.href;\n const response = yield fetch(swFile);\n if (!response.ok) {\n // Response failed so nothing we can check;\n return;\n }\n\n if (!response.headers.has('cache-control')) {\n // No cache control header.\n return;\n }\n\n const cacheControlHeader = response.headers.get('cache-control');\n const maxAgeResult = /max-age\\s*=\\s*(\\d*)/g.exec(cacheControlHeader);\n if (maxAgeResult) {\n if (parseInt(maxAgeResult[1], 10) === 0) {\n return;\n }\n }\n\n if (cacheControlHeader.indexOf('no-cache') !== -1) {\n return;\n }\n\n if (cacheControlHeader.indexOf('no-store') !== -1) {\n return;\n }\n\n showWarning(cacheControlHeader);\n } catch (err) {\n // NOOP\n }\n })();\n }\n\n const finalCheckSWFileCacheHeaders = checkSWFileCacheHeaders;\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * This class is never exposed publicly. Inidividual methods are exposed\n * using jsdoc alias commands.\n *\n * @memberof workbox.core\n * @private\n */\n class WorkboxCore {\n /**\n * You should not instantiate this object directly.\n *\n * @private\n */\n constructor() {\n // Give our version strings something to hang off of.\n try {\n self.workbox.v = self.workbox.v || {};\n } catch (err) {}\n // NOOP\n\n\n // A WorkboxCore instance must be exported before we can use the logger.\n // This is so it can get the current log level.\n {\n const padding = ' ';\n defaultExport.groupCollapsed('Welcome to Workbox!');\n defaultExport.unprefixed.log(`You are currently using a development build. ` + `By default this will switch to prod builds when not on localhost. ` + `You can force this with workbox.setConfig({debug: true|false}).`);\n defaultExport.unprefixed.log(`📖 Read the guides and documentation\\n` + `${padding}https://developers.google.com/web/tools/workbox/`);\n defaultExport.unprefixed.log(`❓ Use the [workbox] tag on Stack Overflow to ask questions\\n` + `${padding}https://stackoverflow.com/questions/ask?tags=workbox`);\n defaultExport.unprefixed.log(`🐛 Found a bug? Report it on GitHub\\n` + `${padding}https://github.com/GoogleChrome/workbox/issues/new`);\n defaultExport.groupEnd();\n\n if (typeof finalCheckSWFileCacheHeaders === 'function') {\n finalCheckSWFileCacheHeaders();\n }\n }\n }\n\n /**\n * Get the current cache names used by Workbox.\n *\n * `cacheNames.precache` is used for precached assets,\n * `cacheNames.googleAnalytics` is used by `workbox-google-analytics` to\n * store `analytics.js`,\n * and `cacheNames.runtime` is used for everything else.\n *\n * @return {Object} An object with `precache` and `runtime` cache names.\n *\n * @alias workbox.core.cacheNames\n */\n get cacheNames() {\n return {\n googleAnalytics: cacheNames.getGoogleAnalyticsName(),\n precache: cacheNames.getPrecacheName(),\n runtime: cacheNames.getRuntimeName()\n };\n }\n\n /**\n * You can alter the default cache names used by the Workbox modules by\n * changing the cache name details.\n *\n * Cache names are generated as `--`.\n *\n * @param {Object} details\n * @param {Object} details.prefix The string to add to the beginning of\n * the precache and runtime cache names.\n * @param {Object} details.suffix The string to add to the end of\n * the precache and runtime cache names.\n * @param {Object} details.precache The cache name to use for precache\n * caching.\n * @param {Object} details.runtime The cache name to use for runtime caching.\n * @param {Object} details.googleAnalytics The cache name to use for\n * `workbox-google-analytics` caching.\n *\n * @alias workbox.core.setCacheNameDetails\n */\n setCacheNameDetails(details) {\n {\n Object.keys(details).forEach(key => {\n finalAssertExports.isType(details[key], 'string', {\n moduleName: 'workbox-core',\n className: 'WorkboxCore',\n funcName: 'setCacheNameDetails',\n paramName: `details.${key}`\n });\n });\n\n if ('precache' in details && details.precache.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'precache',\n value: details.precache\n });\n }\n\n if ('runtime' in details && details.runtime.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'runtime',\n value: details.runtime\n });\n }\n\n if ('googleAnalytics' in details && details.googleAnalytics.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'googleAnalytics',\n value: details.googleAnalytics\n });\n }\n }\n\n cacheNames.updateDetails(details);\n }\n\n /**\n * Get the current log level.\n *\n * @return {number}.\n *\n * @alias workbox.core.logLevel\n */\n get logLevel() {\n return getLoggerLevel();\n }\n\n /**\n * Set the current log level passing in one of the values from\n * [LOG_LEVELS]{@link module:workbox-core.LOG_LEVELS}.\n *\n * @param {number} newLevel The new log level to use.\n *\n * @alias workbox.core.setLogLevel\n */\n setLogLevel(newLevel) {\n {\n finalAssertExports.isType(newLevel, 'number', {\n moduleName: 'workbox-core',\n className: 'WorkboxCore',\n funcName: 'logLevel [setter]',\n paramName: `logLevel`\n });\n }\n\n if (newLevel > LOG_LEVELS.silent || newLevel < LOG_LEVELS.debug) {\n throw new WorkboxError('invalid-value', {\n paramName: 'logLevel',\n validValueDescription: `Please use a value from LOG_LEVELS, i.e ` + `'logLevel = workbox.core.LOG_LEVELS.debug'.`,\n value: newLevel\n });\n }\n\n setLoggerLevel(newLevel);\n }\n }\n\n var defaultExport$1 = new WorkboxCore();\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const finalExports = Object.assign(defaultExport$1, {\n _private,\n LOG_LEVELS,\n registerQuotaErrorCallback\n });\n\n return finalExports;\n\n}());\n"],"file":"workbox-core.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-core.prod.js b/workbox-v3.6.3/workbox-core.prod.js new file mode 100644 index 0000000..3f32a3e --- /dev/null +++ b/workbox-v3.6.3/workbox-core.prod.js @@ -0,0 +1,3 @@ +self.babelHelpers={asyncToGenerator:function(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,r){return function n(o,i){try{var c=t[o](i),l=c.value}catch(e){return void r(e)}if(!c.done)return Promise.resolve(l).then(function(e){n("next",e)},function(e){n("throw",e)});e(l)}("next")})}}},this.workbox=this.workbox||{},this.workbox.core=function(){"use strict";try{self.workbox.v["workbox:core:3.6.3"]=1}catch(e){}var e={debug:0,log:1,warn:2,error:3,silent:4};const t=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);let r=(()=>e.warn)();const n=e=>r<=e,o=e=>r=e,i=()=>r,c=e.error,l=function(r,o,i){const l=0===r.indexOf("group")?c:e[r];if(!n(l))return;if(!i||"groupCollapsed"===r&&t)return void console[r](...o);const s=["%cworkbox",`background: ${i}; color: white; padding: 2px 0.5em; `+"border-radius: 0.5em;"];console[r](...s,...o)},s=()=>{n(c)&&console.groupEnd()},u={groupEnd:s,unprefixed:{groupEnd:s}},a={debug:"#7f8c8d",log:"#2ecc71",warn:"#f39c12",error:"#c0392b",groupCollapsed:"#3498db"};var f,d;Object.keys(a).forEach(e=>(e=e,d=a[e],u[e]=((...t)=>l(e,t,d)),void(u.unprefixed[e]=((...t)=>l(e,t)))));const h=(e,...t)=>{let r=e;return t.length>0&&(r+=` :: ${JSON.stringify(t)}`),r};class p extends Error{constructor(e,t){super(h(e,t)),this.name=e,this.details=t}}let b=(y=babelHelpers.asyncToGenerator(function*(){for(const e of g)yield e()}),function(){return y.apply(this,arguments)});var y;const g=new Set;class v{constructor(e,t,{onupgradeneeded:r,onversionchange:n=this.e}={}){this.t=e,this.r=t,this.n=r,this.e=n,this.o=null}open(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(!e.o)return e.o=yield new Promise(function(t,r){let n=!1;setTimeout(function(){n=!0,r(new Error("The open request was blocked and timed out"))},e.OPEN_TIMEOUT);const o=indexedDB.open(e.t,e.r);o.onerror=function(e){return r(o.error)},o.onupgradeneeded=function(t){n?(o.transaction.abort(),t.target.result.close()):e.n&&e.n(t)},o.onsuccess=function(r){const o=r.target.result;n?o.close():(o.onversionchange=e.e,t(o))}}),e})()}get(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.i("get",e,"readonly",...t)})()}add(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.i("add",e,"readwrite",...t)})()}put(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.i("put",e,"readwrite",...t)})()}delete(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){yield r.i("delete",e,"readwrite",...t)})()}deleteDatabase(){var e=this;return babelHelpers.asyncToGenerator(function*(){e.close(),e.o=null,yield new Promise(function(t,r){const n=indexedDB.deleteDatabase(e.t);n.onerror=function(e){return r(e.target.error)},n.onblocked=function(){return r(new Error("Deletion was blocked."))},n.onsuccess=function(){return t()}})})()}getAll(e,t,r){var n=this;return babelHelpers.asyncToGenerator(function*(){return"getAll"in IDBObjectStore.prototype?yield n.i("getAll",e,"readonly",t,r):yield n.getAllMatching(e,{query:t,count:r})})()}getAllMatching(e,t={}){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.transaction([e],"readonly",function(r,n){const o=r[e],i=t.index?o.index(t.index):o,c=[],l=t.query||null,s=t.direction||"next";i.openCursor(l,s).onsuccess=function(e){const r=e.target.result;if(r){const{primaryKey:e,key:o,value:i}=r;c.push(t.includeKeys?{primaryKey:e,key:o,value:i}:i),t.count&&c.length>=t.count?n(c):r.continue()}else n(c)}})})()}transaction(e,t,r){var n=this;return babelHelpers.asyncToGenerator(function*(){return yield n.open(),yield new Promise(function(o,i){const c=n.o.transaction(e,t);c.onerror=function(e){return i(e.target.error)},c.onabort=function(e){return i(e.target.error)},c.oncomplete=function(){return o()};const l={};for(const t of e)l[t]=c.objectStore(t);r(l,function(e){return o(e)},function(){i(new Error("The transaction was manually aborted")),c.abort()})})})()}i(e,t,r,...n){var o=this;return babelHelpers.asyncToGenerator(function*(){yield o.open();return yield o.transaction([t],r,function(r,o){r[t][e](...n).onsuccess=function(e){o(e.target.result)}})})()}e(e){this.close()}close(){this.o&&this.o.close()}}v.prototype.OPEN_TIMEOUT=2e3;const w={prefix:"workbox",suffix:self.registration.scope,googleAnalytics:"googleAnalytics",precache:"precache",runtime:"runtime"},m=e=>[w.prefix,e,w.suffix].filter(e=>e.length>0).join("-"),q={updateDetails:e=>{Object.keys(w).forEach(t=>{void 0!==e[t]&&(w[t]=e[t])})},getGoogleAnalyticsName:e=>e||m(w.googleAnalytics),getPrecacheName:e=>e||m(w.precache),getRuntimeName:e=>e||m(w.runtime)};var E="cacheDidUpdate",L="cacheWillUpdate",x="cachedResponseWillBeUsed",H="fetchDidFail",N="requestWillFetch",O=(e,t)=>e.filter(e=>t in e);const k=e=>{const t=new URL(e,location);return t.origin===location.origin?t.pathname:t.href},D=(()=>{var e=babelHelpers.asyncToGenerator(function*({cacheName:e,request:t,response:r,event:n,plugins:o=[]}={}){if(!r)throw new p("cache-put-with-no-response",{url:k(t.url)});let i=yield P({request:t,response:r,event:n,plugins:o});if(!i)return;const c=yield caches.open(e),l=O(o,E);let s=l.length>0?yield R({cacheName:e,request:t}):null;try{yield c.put(t,i)}catch(e){throw"QuotaExceededError"===e.name&&(yield b()),e}for(let r of l)yield r[E].call(r,{cacheName:e,request:t,event:n,oldResponse:s,newResponse:i})});return function(){return e.apply(this,arguments)}})(),R=(A=babelHelpers.asyncToGenerator(function*({cacheName:e,request:t,event:r,matchOptions:n,plugins:o=[]}){let i=yield(yield caches.open(e)).match(t,n);for(let c of o)x in c&&(i=yield c[x].call(c,{cacheName:e,request:t,event:r,matchOptions:n,cachedResponse:i}));return i}),function(e){return A.apply(this,arguments)});var A;const P=(W=babelHelpers.asyncToGenerator(function*({request:e,response:t,event:r,plugins:n}){let o=t,i=!1;for(let t of n)if(L in t&&(i=!0,!(o=yield t[L].call(t,{request:e,response:o,event:r}))))break;return i||(o=o.ok?o:null),o||null}),function(e){return W.apply(this,arguments)});var W;const S={put:D,match:R},_={fetch:(()=>{var e=babelHelpers.asyncToGenerator(function*({request:e,fetchOptions:t,event:r,plugins:n=[]}){if(r&&r.preloadResponse){const e=yield r.preloadResponse;if(e)return e}"string"==typeof e&&(e=new Request(e));const o=O(n,H),i=o.length>0?e.clone():null;try{for(let t of n)N in t&&(e=yield t[N].call(t,{request:e.clone(),event:r}))}catch(e){throw new p("plugin-error-request-will-fetch",{thrownError:e})}const c=e.clone();try{return yield fetch(e,t)}catch(e){for(let t of o)yield t[H].call(t,{error:e,event:r,originalRequest:i.clone(),request:c.clone()});throw e}});return function(t){return e.apply(this,arguments)}})()};var j=Object.freeze({DBWrapper:v,WorkboxError:p,assert:null,cacheNames:q,cacheWrapper:S,fetchWrapper:_,getFriendlyURL:k,logger:u});var B=new class{constructor(){try{self.workbox.v=self.workbox.v||{}}catch(e){}}get cacheNames(){return{googleAnalytics:q.getGoogleAnalyticsName(),precache:q.getPrecacheName(),runtime:q.getRuntimeName()}}setCacheNameDetails(e){q.updateDetails(e)}get logLevel(){return i()}setLogLevel(t){if(t>e.silent||te.warn)();const n=e=>r<=e,o=e=>r=e,i=()=>r,c=e.error,l=function(r,o,i){const l=0===r.indexOf(\"group\")?c:e[r];if(!n(l))return;if(!i||\"groupCollapsed\"===r&&t)return void console[r](...o);const s=[\"%cworkbox\",`background: ${i}; color: white; padding: 2px 0.5em; `+\"border-radius: 0.5em;\"];console[r](...s,...o)},s=()=>{n(c)&&console.groupEnd()},u={groupEnd:s,unprefixed:{groupEnd:s}},a={debug:\"#7f8c8d\",log:\"#2ecc71\",warn:\"#f39c12\",error:\"#c0392b\",groupCollapsed:\"#3498db\"};var f,d;Object.keys(a).forEach(e=>(e=e,d=a[e],u[e]=((...t)=>l(e,t,d)),void(u.unprefixed[e]=((...t)=>l(e,t)))));const h=(e,...t)=>{let r=e;return t.length>0&&(r+=` :: ${JSON.stringify(t)}`),r};class p extends Error{constructor(e,t){super(h(e,t)),this.name=e,this.details=t}}let b=(y=babelHelpers.asyncToGenerator(function*(){for(const e of g)yield e()}),function(){return y.apply(this,arguments)});var y;const g=new Set;class v{constructor(e,t,{onupgradeneeded:r,onversionchange:n=this.e}={}){this.t=e,this.r=t,this.n=r,this.e=n,this.o=null}open(){var e=this;return babelHelpers.asyncToGenerator(function*(){if(!e.o)return e.o=yield new Promise(function(t,r){let n=!1;setTimeout(function(){n=!0,r(new Error(\"The open request was blocked and timed out\"))},e.OPEN_TIMEOUT);const o=indexedDB.open(e.t,e.r);o.onerror=function(e){return r(o.error)},o.onupgradeneeded=function(t){n?(o.transaction.abort(),t.target.result.close()):e.n&&e.n(t)},o.onsuccess=function(r){const o=r.target.result;n?o.close():(o.onversionchange=e.e,t(o))}}),e})()}get(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.i(\"get\",e,\"readonly\",...t)})()}add(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.i(\"add\",e,\"readwrite\",...t)})()}put(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.i(\"put\",e,\"readwrite\",...t)})()}delete(e,...t){var r=this;return babelHelpers.asyncToGenerator(function*(){yield r.i(\"delete\",e,\"readwrite\",...t)})()}deleteDatabase(){var e=this;return babelHelpers.asyncToGenerator(function*(){e.close(),e.o=null,yield new Promise(function(t,r){const n=indexedDB.deleteDatabase(e.t);n.onerror=function(e){return r(e.target.error)},n.onblocked=function(){return r(new Error(\"Deletion was blocked.\"))},n.onsuccess=function(){return t()}})})()}getAll(e,t,r){var n=this;return babelHelpers.asyncToGenerator(function*(){return\"getAll\"in IDBObjectStore.prototype?yield n.i(\"getAll\",e,\"readonly\",t,r):yield n.getAllMatching(e,{query:t,count:r})})()}getAllMatching(e,t={}){var r=this;return babelHelpers.asyncToGenerator(function*(){return yield r.transaction([e],\"readonly\",function(r,n){const o=r[e],i=t.index?o.index(t.index):o,c=[],l=t.query||null,s=t.direction||\"next\";i.openCursor(l,s).onsuccess=function(e){const r=e.target.result;if(r){const{primaryKey:e,key:o,value:i}=r;c.push(t.includeKeys?{primaryKey:e,key:o,value:i}:i),t.count&&c.length>=t.count?n(c):r.continue()}else n(c)}})})()}transaction(e,t,r){var n=this;return babelHelpers.asyncToGenerator(function*(){return yield n.open(),yield new Promise(function(o,i){const c=n.o.transaction(e,t);c.onerror=function(e){return i(e.target.error)},c.onabort=function(e){return i(e.target.error)},c.oncomplete=function(){return o()};const l={};for(const t of e)l[t]=c.objectStore(t);r(l,function(e){return o(e)},function(){i(new Error(\"The transaction was manually aborted\")),c.abort()})})})()}i(e,t,r,...n){var o=this;return babelHelpers.asyncToGenerator(function*(){yield o.open();return yield o.transaction([t],r,function(r,o){r[t][e](...n).onsuccess=function(e){o(e.target.result)}})})()}e(e){this.close()}close(){this.o&&this.o.close()}}v.prototype.OPEN_TIMEOUT=2e3;const w={prefix:\"workbox\",suffix:self.registration.scope,googleAnalytics:\"googleAnalytics\",precache:\"precache\",runtime:\"runtime\"},m=e=>[w.prefix,e,w.suffix].filter(e=>e.length>0).join(\"-\"),q={updateDetails:e=>{Object.keys(w).forEach(t=>{void 0!==e[t]&&(w[t]=e[t])})},getGoogleAnalyticsName:e=>e||m(w.googleAnalytics),getPrecacheName:e=>e||m(w.precache),getRuntimeName:e=>e||m(w.runtime)};var E=\"cacheDidUpdate\",L=\"cacheWillUpdate\",x=\"cachedResponseWillBeUsed\",H=\"fetchDidFail\",N=\"requestWillFetch\",O=(e,t)=>e.filter(e=>t in e);const k=e=>{const t=new URL(e,location);return t.origin===location.origin?t.pathname:t.href},D=(()=>{var e=babelHelpers.asyncToGenerator(function*({cacheName:e,request:t,response:r,event:n,plugins:o=[]}={}){if(!r)throw new p(\"cache-put-with-no-response\",{url:k(t.url)});let i=yield P({request:t,response:r,event:n,plugins:o});if(!i)return;const c=yield caches.open(e),l=O(o,E);let s=l.length>0?yield R({cacheName:e,request:t}):null;try{yield c.put(t,i)}catch(e){throw\"QuotaExceededError\"===e.name&&(yield b()),e}for(let r of l)yield r[E].call(r,{cacheName:e,request:t,event:n,oldResponse:s,newResponse:i})});return function(){return e.apply(this,arguments)}})(),R=(A=babelHelpers.asyncToGenerator(function*({cacheName:e,request:t,event:r,matchOptions:n,plugins:o=[]}){let i=yield(yield caches.open(e)).match(t,n);for(let c of o)x in c&&(i=yield c[x].call(c,{cacheName:e,request:t,event:r,matchOptions:n,cachedResponse:i}));return i}),function(e){return A.apply(this,arguments)});var A;const P=(W=babelHelpers.asyncToGenerator(function*({request:e,response:t,event:r,plugins:n}){let o=t,i=!1;for(let t of n)if(L in t&&(i=!0,!(o=yield t[L].call(t,{request:e,response:o,event:r}))))break;return i||(o=o.ok?o:null),o||null}),function(e){return W.apply(this,arguments)});var W;const S={put:D,match:R},_={fetch:(()=>{var e=babelHelpers.asyncToGenerator(function*({request:e,fetchOptions:t,event:r,plugins:n=[]}){if(r&&r.preloadResponse){const e=yield r.preloadResponse;if(e)return e}\"string\"==typeof e&&(e=new Request(e));const o=O(n,H),i=o.length>0?e.clone():null;try{for(let t of n)N in t&&(e=yield t[N].call(t,{request:e.clone(),event:r}))}catch(e){throw new p(\"plugin-error-request-will-fetch\",{thrownError:e})}const c=e.clone();try{return yield fetch(e,t)}catch(e){for(let t of o)yield t[H].call(t,{error:e,event:r,originalRequest:i.clone(),request:c.clone()});throw e}});return function(t){return e.apply(this,arguments)}})()};var j=Object.freeze({DBWrapper:v,WorkboxError:p,assert:null,cacheNames:q,cacheWrapper:S,fetchWrapper:_,getFriendlyURL:k,logger:u});var B=new class{constructor(){try{self.workbox.v=self.workbox.v||{}}catch(e){}}get cacheNames(){return{googleAnalytics:q.getGoogleAnalyticsName(),precache:q.getPrecacheName(),runtime:q.getRuntimeName()}}setCacheNameDetails(e){q.updateDetails(e)}get logLevel(){return i()}setLogLevel(t){if(t>e.silent||t} + * + * @private + */ + const getTextFromBlob = (() => { + var _ref = babelHelpers.asyncToGenerator(function* (blob) { + // This usage of `return await new Promise...` is intentional to work around + // a bug in the transpiled/minified output. + // See https://github.com/GoogleChrome/workbox/issues/1186 + return yield new Promise(function (resolve, reject) { + const reader = new FileReader(); + reader.onloadend = function () { + return resolve(reader.result); + }; + reader.onerror = function () { + return reject(reader.error); + }; + reader.readAsText(blob); + }); + }); + + return function getTextFromBlob(_x) { + return _ref.apply(this, arguments); + }; + })(); + + /** + * Creates the requestWillDequeue callback to be used with the background + * sync queue plugin. The callback takes the failed request and adds the + * `qt` param based on the current time, as well as applies any other + * user-defined hit modifications. + * + * @param {Object} config See workbox.googleAnalytics.initialize. + * @return {Function} The requestWillDequeu callback function. + * + * @private + */ + const createRequestWillReplayCallback = config => { + return (() => { + var _ref2 = babelHelpers.asyncToGenerator(function* (storableRequest) { + let { url, requestInit, timestamp } = storableRequest; + url = new URL(url); + + // Measurement protocol requests can set their payload parameters in either + // the URL query string (for GET requests) or the POST body. + let params; + if (requestInit.body) { + const payload = requestInit.body instanceof Blob ? yield getTextFromBlob(requestInit.body) : requestInit.body; + + params = new URLSearchParams(payload); + } else { + params = url.searchParams; + } + + // Calculate the qt param, accounting for the fact that an existing + // qt param may be present and should be updated rather than replaced. + const originalHitTime = timestamp - (Number(params.get('qt')) || 0); + const queueTime = Date.now() - originalHitTime; + + // Set the qt param prior to applying the hitFilter or parameterOverrides. + params.set('qt', queueTime); + + if (config.parameterOverrides) { + for (const param of Object.keys(config.parameterOverrides)) { + const value = config.parameterOverrides[param]; + params.set(param, value); + } + } + + if (typeof config.hitFilter === 'function') { + config.hitFilter.call(null, params); + } + + requestInit.body = params.toString(); + requestInit.method = 'POST'; + requestInit.mode = 'cors'; + requestInit.credentials = 'omit'; + requestInit.headers = { 'Content-Type': 'text/plain' }; + + // Ignore URL search params as they're now in the post body. + storableRequest.url = `${url.origin}${url.pathname}`; + }); + + return function (_x2) { + return _ref2.apply(this, arguments); + }; + })(); + }; + + /** + * Creates GET and POST routes to catch failed Measurement Protocol hits. + * + * @param {Plugin} queuePlugin + * @return {Array} The created routes. + * + * @private + */ + const createCollectRoutes = queuePlugin => { + const match = ({ url }) => url.hostname === GOOGLE_ANALYTICS_HOST && COLLECT_PATHS_REGEX.test(url.pathname); + + const handler = new NetworkOnly_mjs.NetworkOnly({ + plugins: [queuePlugin] + }); + + return [new Route_mjs.Route(match, handler, 'GET'), new Route_mjs.Route(match, handler, 'POST')]; + }; + + /** + * Creates a route with a network first strategy for the analytics.js script. + * + * @param {string} cacheName + * @return {Route} The created route. + * + * @private + */ + const createAnalyticsJsRoute = cacheName => { + const match = ({ url }) => url.hostname === GOOGLE_ANALYTICS_HOST && url.pathname === ANALYTICS_JS_PATH; + const handler = new NetworkFirst_mjs.NetworkFirst({ cacheName }); + + return new Route_mjs.Route(match, handler, 'GET'); + }; + + /** + * Creates a route with a network first strategy for the gtag.js script. + * + * @param {string} cacheName + * @return {Route} The created route. + * + * @private + */ + const createGtagJsRoute = cacheName => { + const match = ({ url }) => url.hostname === GTM_HOST && url.pathname === GTAG_JS_PATH; + const handler = new NetworkFirst_mjs.NetworkFirst({ cacheName }); + + return new Route_mjs.Route(match, handler, 'GET'); + }; + + /** + * @param {Object=} [options] + * @param {Object} [options.cacheName] The cache name to store and retrieve + * analytics.js. Defaults to the cache names provided by `workbox-core`. + * @param {Object} [options.parameterOverrides] + * [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters), + * expressed as key/value pairs, to be added to replayed Google Analytics + * requests. This can be used to, e.g., set a custom dimension indicating + * that the request was replayed. + * @param {Function} [options.hitFilter] A function that allows you to modify + * the hit parameters prior to replaying + * the hit. The function is invoked with the original hit's URLSearchParams + * object as its only argument. + * + * @memberof workbox.googleAnalytics + */ + const initialize = (options = {}) => { + const cacheName = cacheNames_mjs.cacheNames.getGoogleAnalyticsName(options.cacheName); + + const queuePlugin = new Plugin_mjs.Plugin(QUEUE_NAME, { + maxRetentionTime: MAX_RETENTION_TIME, + callbacks: { + requestWillReplay: createRequestWillReplayCallback(options) + } + }); + + const routes = [createAnalyticsJsRoute(cacheName), createGtagJsRoute(cacheName), ...createCollectRoutes(queuePlugin)]; + + const router = new Router_mjs.Router(); + for (const route of routes) { + router.registerRoute(route); + } + + self.addEventListener('fetch', evt => { + const responsePromise = router.handleRequest(evt); + if (responsePromise) { + evt.respondWith(responsePromise); + } + }); + }; + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.initialize = initialize; + + return exports; + +}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies)); + +//# sourceMappingURL=workbox-google-analytics.dev.js.map diff --git a/workbox-v3.6.3/workbox-google-analytics.dev.js.map b/workbox-v3.6.3/workbox-google-analytics.dev.js.map new file mode 100644 index 0000000..87fd78a --- /dev/null +++ b/workbox-v3.6.3/workbox-google-analytics.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-google-analytics/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.googleAnalytics = (function (exports,Plugin_mjs,cacheNames_mjs,Route_mjs,Router_mjs,NetworkFirst_mjs,NetworkOnly_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:google-analytics:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const QUEUE_NAME = 'workbox-google-analytics';\n const MAX_RETENTION_TIME = 60 * 48; // Two days in minutes\n const GOOGLE_ANALYTICS_HOST = 'www.google-analytics.com';\n const GTM_HOST = 'www.googletagmanager.com';\n const ANALYTICS_JS_PATH = '/analytics.js';\n const GTAG_JS_PATH = '/gtag/js';\n\n // This RegExp matches all known Measurement Protocol single-hit collect\n // endpoints. Most of the time the default path (/collect) is used, but\n // occasionally an experimental endpoint is used when testing new features,\n // (e.g. /r/collect or /j/collect)\n const COLLECT_PATHS_REGEX = /^\\/(\\w+\\/)?collect/;\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Promisifies the FileReader API to await a text response from a Blob.\n *\n * @param {Blob} blob\n * @return {Promise}\n *\n * @private\n */\n const getTextFromBlob = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* (blob) {\n // This usage of `return await new Promise...` is intentional to work around\n // a bug in the transpiled/minified output.\n // See https://github.com/GoogleChrome/workbox/issues/1186\n return yield new Promise(function (resolve, reject) {\n const reader = new FileReader();\n reader.onloadend = function () {\n return resolve(reader.result);\n };\n reader.onerror = function () {\n return reject(reader.error);\n };\n reader.readAsText(blob);\n });\n });\n\n return function getTextFromBlob(_x) {\n return _ref.apply(this, arguments);\n };\n })();\n\n /**\n * Creates the requestWillDequeue callback to be used with the background\n * sync queue plugin. The callback takes the failed request and adds the\n * `qt` param based on the current time, as well as applies any other\n * user-defined hit modifications.\n *\n * @param {Object} config See workbox.googleAnalytics.initialize.\n * @return {Function} The requestWillDequeu callback function.\n *\n * @private\n */\n const createRequestWillReplayCallback = config => {\n return (() => {\n var _ref2 = babelHelpers.asyncToGenerator(function* (storableRequest) {\n let { url, requestInit, timestamp } = storableRequest;\n url = new URL(url);\n\n // Measurement protocol requests can set their payload parameters in either\n // the URL query string (for GET requests) or the POST body.\n let params;\n if (requestInit.body) {\n const payload = requestInit.body instanceof Blob ? yield getTextFromBlob(requestInit.body) : requestInit.body;\n\n params = new URLSearchParams(payload);\n } else {\n params = url.searchParams;\n }\n\n // Calculate the qt param, accounting for the fact that an existing\n // qt param may be present and should be updated rather than replaced.\n const originalHitTime = timestamp - (Number(params.get('qt')) || 0);\n const queueTime = Date.now() - originalHitTime;\n\n // Set the qt param prior to applying the hitFilter or parameterOverrides.\n params.set('qt', queueTime);\n\n if (config.parameterOverrides) {\n for (const param of Object.keys(config.parameterOverrides)) {\n const value = config.parameterOverrides[param];\n params.set(param, value);\n }\n }\n\n if (typeof config.hitFilter === 'function') {\n config.hitFilter.call(null, params);\n }\n\n requestInit.body = params.toString();\n requestInit.method = 'POST';\n requestInit.mode = 'cors';\n requestInit.credentials = 'omit';\n requestInit.headers = { 'Content-Type': 'text/plain' };\n\n // Ignore URL search params as they're now in the post body.\n storableRequest.url = `${url.origin}${url.pathname}`;\n });\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n })();\n };\n\n /**\n * Creates GET and POST routes to catch failed Measurement Protocol hits.\n *\n * @param {Plugin} queuePlugin\n * @return {Array} The created routes.\n *\n * @private\n */\n const createCollectRoutes = queuePlugin => {\n const match = ({ url }) => url.hostname === GOOGLE_ANALYTICS_HOST && COLLECT_PATHS_REGEX.test(url.pathname);\n\n const handler = new NetworkOnly_mjs.NetworkOnly({\n plugins: [queuePlugin]\n });\n\n return [new Route_mjs.Route(match, handler, 'GET'), new Route_mjs.Route(match, handler, 'POST')];\n };\n\n /**\n * Creates a route with a network first strategy for the analytics.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\n const createAnalyticsJsRoute = cacheName => {\n const match = ({ url }) => url.hostname === GOOGLE_ANALYTICS_HOST && url.pathname === ANALYTICS_JS_PATH;\n const handler = new NetworkFirst_mjs.NetworkFirst({ cacheName });\n\n return new Route_mjs.Route(match, handler, 'GET');\n };\n\n /**\n * Creates a route with a network first strategy for the gtag.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\n const createGtagJsRoute = cacheName => {\n const match = ({ url }) => url.hostname === GTM_HOST && url.pathname === GTAG_JS_PATH;\n const handler = new NetworkFirst_mjs.NetworkFirst({ cacheName });\n\n return new Route_mjs.Route(match, handler, 'GET');\n };\n\n /**\n * @param {Object=} [options]\n * @param {Object} [options.cacheName] The cache name to store and retrieve\n * analytics.js. Defaults to the cache names provided by `workbox-core`.\n * @param {Object} [options.parameterOverrides]\n * [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters),\n * expressed as key/value pairs, to be added to replayed Google Analytics\n * requests. This can be used to, e.g., set a custom dimension indicating\n * that the request was replayed.\n * @param {Function} [options.hitFilter] A function that allows you to modify\n * the hit parameters prior to replaying\n * the hit. The function is invoked with the original hit's URLSearchParams\n * object as its only argument.\n *\n * @memberof workbox.googleAnalytics\n */\n const initialize = (options = {}) => {\n const cacheName = cacheNames_mjs.cacheNames.getGoogleAnalyticsName(options.cacheName);\n\n const queuePlugin = new Plugin_mjs.Plugin(QUEUE_NAME, {\n maxRetentionTime: MAX_RETENTION_TIME,\n callbacks: {\n requestWillReplay: createRequestWillReplayCallback(options)\n }\n });\n\n const routes = [createAnalyticsJsRoute(cacheName), createGtagJsRoute(cacheName), ...createCollectRoutes(queuePlugin)];\n\n const router = new Router_mjs.Router();\n for (const route of routes) {\n router.registerRoute(route);\n }\n\n self.addEventListener('fetch', evt => {\n const responsePromise = router.handleRequest(evt);\n if (responsePromise) {\n evt.respondWith(responsePromise);\n }\n });\n };\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.initialize = initialize;\n\n return exports;\n\n}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies));\n"],"file":"workbox-google-analytics.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-google-analytics.prod.js b/workbox-v3.6.3/workbox-google-analytics.prod.js new file mode 100644 index 0000000..6c44f0d --- /dev/null +++ b/workbox-v3.6.3/workbox-google-analytics.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.googleAnalytics=function(e,n,t,o,r,c,s){"use strict";try{self.workbox.v["workbox:google-analytics:3.6.3"]=1}catch(e){}const l=/^\/(\w+\/)?collect/,i=(a=babelHelpers.asyncToGenerator(function*(e){return yield new Promise(function(n,t){const o=new FileReader;o.onloadend=function(){return n(o.result)},o.onerror=function(){return t(o.error)},o.readAsText(e)})}),function(e){return a.apply(this,arguments)});var a;const w=e=>(u=babelHelpers.asyncToGenerator(function*(n){let t,{url:o,requestInit:r,timestamp:c}=n;if(o=new URL(o),r.body){const e=r.body instanceof Blob?yield i(r.body):r.body;t=new URLSearchParams(e)}else t=o.searchParams;const s=c-(Number(t.get("qt"))||0),l=Date.now()-s;if(t.set("qt",l),e.parameterOverrides)for(const n of Object.keys(e.parameterOverrides)){const o=e.parameterOverrides[n];t.set(n,o)}"function"==typeof e.hitFilter&&e.hitFilter.call(null,t),r.body=t.toString(),r.method="POST",r.mode="cors",r.credentials="omit",r.headers={"Content-Type":"text/plain"},n.url=`${o.origin}${o.pathname}`}),function(e){return u.apply(this,arguments)});var u;return e.initialize=((e={})=>{const i=t.cacheNames.getGoogleAnalyticsName(e.cacheName),a=new n.Plugin("workbox-google-analytics",{maxRetentionTime:2880,callbacks:{requestWillReplay:w(e)}}),u=[(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>"www.google-analytics.com"===e.hostname&&"/analytics.js"===e.pathname,n,"GET")})(i),(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>"www.googletagmanager.com"===e.hostname&&"/gtag/js"===e.pathname,n,"GET")})(i),...(e=>{const n=({url:e})=>"www.google-analytics.com"===e.hostname&&l.test(e.pathname),t=new s.NetworkOnly({plugins:[e]});return[new o.Route(n,t,"GET"),new o.Route(n,t,"POST")]})(a)],f=new r.Router;for(const e of u)f.registerRoute(e);self.addEventListener("fetch",e=>{const n=f.handleRequest(e);n&&e.respondWith(n)})}),e}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies); + +//# sourceMappingURL=workbox-google-analytics.prod.js.map diff --git a/workbox-v3.6.3/workbox-google-analytics.prod.js.map b/workbox-v3.6.3/workbox-google-analytics.prod.js.map new file mode 100644 index 0000000..5e55ed8 --- /dev/null +++ b/workbox-v3.6.3/workbox-google-analytics.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-google-analytics/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.googleAnalytics=function(e,n,t,o,r,c,s){\"use strict\";try{self.workbox.v[\"workbox:google-analytics:3.6.3\"]=1}catch(e){}const l=/^\\/(\\w+\\/)?collect/,i=(a=babelHelpers.asyncToGenerator(function*(e){return yield new Promise(function(n,t){const o=new FileReader;o.onloadend=function(){return n(o.result)},o.onerror=function(){return t(o.error)},o.readAsText(e)})}),function(e){return a.apply(this,arguments)});var a;const w=e=>(u=babelHelpers.asyncToGenerator(function*(n){let t,{url:o,requestInit:r,timestamp:c}=n;if(o=new URL(o),r.body){const e=r.body instanceof Blob?yield i(r.body):r.body;t=new URLSearchParams(e)}else t=o.searchParams;const s=c-(Number(t.get(\"qt\"))||0),l=Date.now()-s;if(t.set(\"qt\",l),e.parameterOverrides)for(const n of Object.keys(e.parameterOverrides)){const o=e.parameterOverrides[n];t.set(n,o)}\"function\"==typeof e.hitFilter&&e.hitFilter.call(null,t),r.body=t.toString(),r.method=\"POST\",r.mode=\"cors\",r.credentials=\"omit\",r.headers={\"Content-Type\":\"text/plain\"},n.url=`${o.origin}${o.pathname}`}),function(e){return u.apply(this,arguments)});var u;return e.initialize=((e={})=>{const i=t.cacheNames.getGoogleAnalyticsName(e.cacheName),a=new n.Plugin(\"workbox-google-analytics\",{maxRetentionTime:2880,callbacks:{requestWillReplay:w(e)}}),u=[(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>\"www.google-analytics.com\"===e.hostname&&\"/analytics.js\"===e.pathname,n,\"GET\")})(i),(e=>{const n=new c.NetworkFirst({cacheName:e});return new o.Route(({url:e})=>\"www.googletagmanager.com\"===e.hostname&&\"/gtag/js\"===e.pathname,n,\"GET\")})(i),...(e=>{const n=({url:e})=>\"www.google-analytics.com\"===e.hostname&&l.test(e.pathname),t=new s.NetworkOnly({plugins:[e]});return[new o.Route(n,t,\"GET\"),new o.Route(n,t,\"POST\")]})(a)],f=new r.Router;for(const e of u)f.registerRoute(e);self.addEventListener(\"fetch\",e=>{const n=f.handleRequest(e);n&&e.respondWith(n)})}),e}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies);\n"],"file":"workbox-google-analytics.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-navigation-preload.dev.js b/workbox-v3.6.3/workbox-navigation-preload.dev.js new file mode 100644 index 0000000..2a2e448 --- /dev/null +++ b/workbox-v3.6.3/workbox-navigation-preload.dev.js @@ -0,0 +1,159 @@ +this.workbox = this.workbox || {}; +this.workbox.navigationPreload = (function (exports,logger_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:navigation-preload:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @return {boolean} Whether or not the current browser supports enabling + * navigation preload. + * + * @memberof workbox.navigationPreload + */ + function isSupported() { + return Boolean(self.registration && self.registration.navigationPreload); + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * If the browser supports Navigation Preload, then this will disable it. + * + * @memberof workbox.navigationPreload + */ + function disable() { + if (isSupported()) { + self.addEventListener('activate', event => { + event.waitUntil(self.registration.navigationPreload.disable().then(() => { + { + logger_mjs.logger.log(`Navigation preload is disabled.`); + } + })); + }); + } else { + { + logger_mjs.logger.log(`Navigation preload is not supported in this browser.`); + } + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * If the browser supports Navigation Preload, then this will enable it. + * + * @param {string} [headerValue] Optionally, allows developers to + * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header) + * the value of the `Service-Worker-Navigation-Preload` header which will be + * sent to the server when making the navigation request. + * + * @memberof workbox.navigationPreload + */ + function enable(headerValue) { + if (isSupported()) { + self.addEventListener('activate', event => { + event.waitUntil(self.registration.navigationPreload.enable().then(() => { + // Defaults to Service-Worker-Navigation-Preload: true if not set. + if (headerValue) { + self.registration.navigationPreload.setHeaderValue(headerValue); + } + + { + logger_mjs.logger.log(`Navigation preload is enabled.`); + } + })); + }); + } else { + { + logger_mjs.logger.log(`Navigation preload is not supported in this browser.`); + } + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.disable = disable; + exports.enable = enable; + exports.isSupported = isSupported; + + return exports; + +}({},workbox.core._private)); + +//# sourceMappingURL=workbox-navigation-preload.dev.js.map diff --git a/workbox-v3.6.3/workbox-navigation-preload.dev.js.map b/workbox-v3.6.3/workbox-navigation-preload.dev.js.map new file mode 100644 index 0000000..821cead --- /dev/null +++ b/workbox-v3.6.3/workbox-navigation-preload.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-navigation-preload/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.navigationPreload = (function (exports,logger_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:navigation-preload:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2018 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @return {boolean} Whether or not the current browser supports enabling\n * navigation preload.\n *\n * @memberof workbox.navigationPreload\n */\n function isSupported() {\n return Boolean(self.registration && self.registration.navigationPreload);\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * If the browser supports Navigation Preload, then this will disable it.\n *\n * @memberof workbox.navigationPreload\n */\n function disable() {\n if (isSupported()) {\n self.addEventListener('activate', event => {\n event.waitUntil(self.registration.navigationPreload.disable().then(() => {\n {\n logger_mjs.logger.log(`Navigation preload is disabled.`);\n }\n }));\n });\n } else {\n {\n logger_mjs.logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * If the browser supports Navigation Preload, then this will enable it.\n *\n * @param {string} [headerValue] Optionally, allows developers to\n * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header)\n * the value of the `Service-Worker-Navigation-Preload` header which will be\n * sent to the server when making the navigation request.\n *\n * @memberof workbox.navigationPreload\n */\n function enable(headerValue) {\n if (isSupported()) {\n self.addEventListener('activate', event => {\n event.waitUntil(self.registration.navigationPreload.enable().then(() => {\n // Defaults to Service-Worker-Navigation-Preload: true if not set.\n if (headerValue) {\n self.registration.navigationPreload.setHeaderValue(headerValue);\n }\n\n {\n logger_mjs.logger.log(`Navigation preload is enabled.`);\n }\n }));\n });\n } else {\n {\n logger_mjs.logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.disable = disable;\n exports.enable = enable;\n exports.isSupported = isSupported;\n\n return exports;\n\n}({},workbox.core._private));\n"],"file":"workbox-navigation-preload.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-navigation-preload.prod.js b/workbox-v3.6.3/workbox-navigation-preload.prod.js new file mode 100644 index 0000000..416a527 --- /dev/null +++ b/workbox-v3.6.3/workbox-navigation-preload.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.navigationPreload=function(t){"use strict";try{self.workbox.v["workbox:navigation-preload:3.6.3"]=1}catch(t){}function e(){return Boolean(self.registration&&self.registration.navigationPreload)}return t.disable=function(){e()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.disable().then(()=>{}))})},t.enable=function(t){e()&&self.addEventListener("activate",e=>{e.waitUntil(self.registration.navigationPreload.enable().then(()=>{t&&self.registration.navigationPreload.setHeaderValue(t)}))})},t.isSupported=e,t}({}); + +//# sourceMappingURL=workbox-navigation-preload.prod.js.map diff --git a/workbox-v3.6.3/workbox-navigation-preload.prod.js.map b/workbox-v3.6.3/workbox-navigation-preload.prod.js.map new file mode 100644 index 0000000..4ecf993 --- /dev/null +++ b/workbox-v3.6.3/workbox-navigation-preload.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-navigation-preload/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.navigationPreload=function(t){\"use strict\";try{self.workbox.v[\"workbox:navigation-preload:3.6.3\"]=1}catch(t){}function e(){return Boolean(self.registration&&self.registration.navigationPreload)}return t.disable=function(){e()&&self.addEventListener(\"activate\",t=>{t.waitUntil(self.registration.navigationPreload.disable().then(()=>{}))})},t.enable=function(t){e()&&self.addEventListener(\"activate\",e=>{e.waitUntil(self.registration.navigationPreload.enable().then(()=>{t&&self.registration.navigationPreload.setHeaderValue(t)}))})},t.isSupported=e,t}({});\n"],"file":"workbox-navigation-preload.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-precaching.dev.js b/workbox-v3.6.3/workbox-precaching.dev.js new file mode 100644 index 0000000..addfbb2 --- /dev/null +++ b/workbox-v3.6.3/workbox-precaching.dev.js @@ -0,0 +1,1171 @@ +this.workbox = this.workbox || {}; +this.workbox.precaching = (function (DBWrapper_mjs,logger_mjs,cacheNames_mjs,WorkboxError_mjs,fetchWrapper_mjs,cacheWrapper_mjs,assert_mjs,getFriendlyURL_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:precaching:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Used as a consistent way of referencing a URL to precache. + * + * @private + * @memberof module:workbox-precaching + */ + class PrecacheEntry { + /** + * This class ensures all cache list entries are consistent and + * adds cache busting if required. + * + * @param {*} originalInput + * @param {string} url + * @param {string} revision + * @param {boolean} shouldCacheBust + */ + constructor(originalInput, url, revision, shouldCacheBust) { + this._originalInput = originalInput; + this._entryId = url; + this._revision = revision; + const requestAsCacheKey = new Request(url, { credentials: 'same-origin' }); + this._cacheRequest = requestAsCacheKey; + this._networkRequest = shouldCacheBust ? this._cacheBustRequest(requestAsCacheKey) : requestAsCacheKey; + } + + /** + * This method will either use Request.cache option OR append a cache + * busting parameter to the URL. + * + * @param {Request} request The request to cache bust + * @return {Request} A cachebusted Request + * + * @private + */ + _cacheBustRequest(request) { + let url = request.url; + const requestOptions = { + credentials: 'same-origin' + }; + if ('cache' in Request.prototype) { + // Make use of the Request cache mode where we can. + // Reload skips the HTTP cache for outgoing requests and updates + // the cache with the returned response. + requestOptions.cache = 'reload'; + } else { + const parsedURL = new URL(url, location); + + // This is done so the minifier can mangle 'global.encodeURIComponent' + const _encodeURIComponent = encodeURIComponent; + + parsedURL.search += (parsedURL.search ? '&' : '') + _encodeURIComponent(`_workbox-cache-bust`) + '=' + _encodeURIComponent(this._revision); + url = parsedURL.toString(); + } + + return new Request(url, requestOptions); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + // Allows minifier to mangle this name + const REVISON_IDB_FIELD = 'revision'; + const URL_IDB_FIELD = 'url'; + const DB_STORE_NAME = 'precached-details-models'; + /** + * This model will track the relevant information of entries that + * are cached and their matching revision details. + * + * @private + */ + class PrecachedDetailsModel { + /** + * Construct a new model for a specific cache. + * + * @param {string} dbName + * @private + */ + constructor(dbName) { + // This ensures the db name contains only letters, numbers, '-', '_' and '$' + const filteredDBName = dbName.replace(/[^\w-]/g, '_'); + this._db = new DBWrapper_mjs.DBWrapper(filteredDBName, 2, { + onupgradeneeded: this._handleUpgrade + }); + } + + /** + * Should perform an upgrade of indexedDB. + * + * @param {Event} evt + * + * @private + */ + _handleUpgrade(evt) { + const db = evt.target.result; + if (evt.oldVersion < 2) { + // IndexedDB version 1 used both 'workbox-precaching' and + // 'precached-details-model' before upgrading to version 2. + // Delete them and create a new store with latest schema. + if (db.objectStoreNames.contains('workbox-precaching')) { + db.deleteObjectStore('workbox-precaching'); + } + if (db.objectStoreNames.contains(DB_STORE_NAME)) { + db.deleteObjectStore(DB_STORE_NAME); + } + } + db.createObjectStore(DB_STORE_NAME); + } + + /** + * Check if an entry is already cached. Returns false if + * the entry isn't cached or the revision has changed. + * + * @param {string} cacheName + * @param {PrecacheEntry} precacheEntry + * @return {boolean} + * + * @private + */ + _isEntryCached(cacheName, precacheEntry) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + const revisionDetails = yield _this._getRevision(precacheEntry._entryId); + if (revisionDetails !== precacheEntry._revision) { + return false; + } + + const openCache = yield caches.open(cacheName); + const cachedResponse = yield openCache.match(precacheEntry._cacheRequest); + return !!cachedResponse; + })(); + } + + /** + * @return {Promise} + * + * @private + */ + _getAllEntries() { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + return yield _this2._db.getAllMatching(DB_STORE_NAME, { + includeKeys: true + }); + })(); + } + + /** + * Get the current revision details. + * + * @param {Object} entryId + * @return {Promise} + * + * @private + */ + _getRevision(entryId) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + const data = yield _this3._db.get(DB_STORE_NAME, entryId); + return data ? data[REVISON_IDB_FIELD] : null; + })(); + } + + /** + * Add an entry to the details model. + * + * @param {PrecacheEntry} precacheEntry + * + * @private + */ + _addEntry(precacheEntry) { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this4._db.put(DB_STORE_NAME, { + [REVISON_IDB_FIELD]: precacheEntry._revision, + [URL_IDB_FIELD]: precacheEntry._cacheRequest.url + }, precacheEntry._entryId); + })(); + } + + /** + * Delete entry from details model. + * + * @param {string} entryId + * + * @private + */ + _deleteEntry(entryId) { + var _this5 = this; + + return babelHelpers.asyncToGenerator(function* () { + yield _this5._db.delete(DB_STORE_NAME, entryId); + })(); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * This method will print out a warning if a precache entry doesn't have + * a `revision` value. + * + * This is common if the asset if revisioned in the url like `index.1234.css`. + * + * @param {Map} entriesMap + * + * @private + * @memberof module:workbox-preaching + */ + var showWarningsIfNeeded = (entriesMap => { + const urlOnlyEntries = []; + entriesMap.forEach(entry => { + if (typeof entry === 'string' || !entry._originalInput.revision) { + urlOnlyEntries.push(entry._originalInput); + } + }); + + if (urlOnlyEntries.length === 0) { + // No warnings needed. + return; + } + + logger_mjs.logger.groupCollapsed('Are your precached assets revisioned?'); + + const urlsList = urlOnlyEntries.map(urlOnlyEntry => { + return ` - ${JSON.stringify(urlOnlyEntry)}`; + }).join(`\n`); + + logger_mjs.logger.warn(`The following precache entries might not be revisioned:` + `\n\n` + urlsList + `\n\n`); + + logger_mjs.logger.unprefixed.warn(`You can learn more about why this might be a ` + `problem here: https://developers.google.com/web/tools/workbox/modules/workbox-precaching`); + + logger_mjs.logger.groupEnd(); + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @param {string} groupTitle + * @param {Array} entries + * + * @private + */ + const _nestedGroup = (groupTitle, entries) => { + if (entries.length === 0) { + return; + } + + logger_mjs.logger.groupCollapsed(groupTitle); + + entries.forEach(entry => { + logger_mjs.logger.log(entry._originalInput); + }); + + logger_mjs.logger.groupEnd(); + }; + + /** + * @param {Array} entriesToPrecache + * @param {Array} alreadyPrecachedEntries + * + * @private + * @memberof module:workbox-precachig + */ + var printInstallDetails = ((entriesToPrecache, alreadyPrecachedEntries) => { + // Goal is to print the message: + // Precaching X files. + // Or: + // Precaching X files. Y files were cached and up-to-date. + + const precachedCount = entriesToPrecache.length; + const alreadyPrecachedCount = alreadyPrecachedEntries.length; + let printText = `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`; + if (alreadyPrecachedCount > 0) { + printText += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`; + } + + logger_mjs.logger.groupCollapsed(printText); + + _nestedGroup(`View precached URLs.`, entriesToPrecache); + _nestedGroup(`View URLs that were already precached.`, alreadyPrecachedEntries); + logger_mjs.logger.groupEnd(); + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const logGroup = (groupTitle, urls) => { + logger_mjs.logger.groupCollapsed(groupTitle); + + urls.forEach(url => { + logger_mjs.logger.log(url); + }); + + logger_mjs.logger.groupEnd(); + }; + + /** + * @param {Array} deletedCacheRequests + * @param {Array} deletedRevisionDetails + * + * @private + * @memberof module:workbox-precachig + */ + var printCleanupDetails = ((deletedCacheRequests, deletedRevisionDetails) => { + if (deletedCacheRequests.length === 0 && deletedRevisionDetails.length === 0) { + return; + } + + const cacheDeleteCount = deletedCacheRequests.length; + const revisionDeleteCount = deletedRevisionDetails.length; + + const cacheDeleteText = `${cacheDeleteCount} cached ` + `request${cacheDeleteCount === 1 ? ' was' : 's were'} deleted`; + const revisionDeleteText = `${revisionDeleteCount} ` + `${revisionDeleteCount === 1 ? 'entry' : 'entries'} ` + `${revisionDeleteCount === 1 ? 'was' : 'were'} deleted from IndexedDB.`; + + logger_mjs.logger.groupCollapsed(`During precaching cleanup, ${cacheDeleteText} and ${revisionDeleteText}`); + + logGroup('Deleted Cache Requests', deletedCacheRequests); + logGroup('Revision Details Deleted from DB', deletedRevisionDetails); + + logger_mjs.logger.groupEnd(); + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @param {Response} response + * @return {Response} + * + * @private + * @memberof module:workbox-precaching + */ + const cleanRedirect = (() => { + var _ref = babelHelpers.asyncToGenerator(function* (response) { + const clonedResponse = response.clone(); + + // Not all browsers support the Response.body stream, so fall back + // to reading the entire body into memory as a blob. + const bodyPromise = 'body' in clonedResponse ? Promise.resolve(clonedResponse.body) : clonedResponse.blob(); + + const body = yield bodyPromise; + + // new Response() is happy when passed either a stream or a Blob. + return new Response(body, { + headers: clonedResponse.headers, + status: clonedResponse.status, + statusText: clonedResponse.statusText + }); + }); + + return function cleanRedirect(_x) { + return _ref.apply(this, arguments); + }; + })(); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Performs efficient precaching of assets. + * + * @memberof workbox.precaching + */ + class PrecacheController { + /** + * Create a new PrecacheController. + * + * @param {string} cacheName + */ + constructor(cacheName) { + this._cacheName = cacheNames_mjs.cacheNames.getPrecacheName(cacheName); + this._entriesToCacheMap = new Map(); + this._precacheDetailsModel = new PrecachedDetailsModel(this._cacheName); + } + + /** + * This method will add items to the precache list, removing duplicates + * and ensuring the information is valid. + * + * @param { + * Array + * } entries Array of entries to + * precache. + */ + addToCacheList(entries) { + { + assert_mjs.assert.isArray(entries, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'addToCacheList', + paramName: 'entries' + }); + } + + entries.map(userEntry => { + this._addEntryToCacheList(this._parseEntry(userEntry)); + }); + } + + /** + * This method returns a precache entry. + * + * @private + * @param {string|Object} input + * @return {PrecacheEntry} + */ + _parseEntry(input) { + switch (typeof input) { + case 'string': + { + { + if (input.length === 0) { + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', { + entry: input + }); + } + } + + return new PrecacheEntry(input, input, input); + } + case 'object': + { + { + if (!input || !input.url) { + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', { + entry: input + }); + } + } + + return new PrecacheEntry(input, input.url, input.revision || input.url, !!input.revision); + } + default: + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', { + entry: input + }); + } + } + + /** + * Adds an entry to the precache list, accounting for possible duplicates. + * + * @private + * @param {PrecacheEntry} entryToAdd + */ + _addEntryToCacheList(entryToAdd) { + // Check if the entry is already part of the map + const existingEntry = this._entriesToCacheMap.get(entryToAdd._entryId); + if (!existingEntry) { + this._entriesToCacheMap.set(entryToAdd._entryId, entryToAdd); + return; + } + + // Duplicates are fine, but make sure the revision information + // is the same. + if (existingEntry._revision !== entryToAdd._revision) { + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-conflicting-entries', { + firstEntry: existingEntry._originalInput, + secondEntry: entryToAdd._originalInput + }); + } + } + + /** + * Call this method from a service work install event to start + * precaching assets. + * + * @param {Object} options + * @param {boolean} [options.suppressWarnings] Suppress warning messages. + * @param {Event} [options.event] The install event (if needed). + * @param {Array} [options.plugins] Plugins to be used for fetching + * and caching during install. + * @return {Promise} + */ + install({ suppressWarnings = false, event, plugins } = {}) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + if (suppressWarnings !== true) { + showWarningsIfNeeded(_this._entriesToCacheMap); + } + + if (plugins) { + assert_mjs.assert.isArray(plugins, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'install', + paramName: 'plugins' + }); + } + } + + // Empty the temporary cache. + // NOTE: We remove all entries instead of deleting the cache as the cache + // may be marked for deletion but still exist until a later stage + // resulting in unexpected behavior of being deletect when all references + // are dropped. + // https://github.com/GoogleChrome/workbox/issues/1368 + const tempCache = yield caches.open(_this._getTempCacheName()); + const requests = yield tempCache.keys(); + yield Promise.all(requests.map(function (request) { + return tempCache.delete(request); + })); + + const entriesToPrecache = []; + const entriesAlreadyPrecached = []; + + for (const precacheEntry of _this._entriesToCacheMap.values()) { + if (yield _this._precacheDetailsModel._isEntryCached(_this._cacheName, precacheEntry)) { + entriesAlreadyPrecached.push(precacheEntry); + } else { + entriesToPrecache.push(precacheEntry); + } + } + + // Wait for all requests to be cached. + yield Promise.all(entriesToPrecache.map(function (precacheEntry) { + return _this._cacheEntryInTemp({ event, plugins, precacheEntry }); + })); + + { + printInstallDetails(entriesToPrecache, entriesAlreadyPrecached); + } + + return { + updatedEntries: entriesToPrecache, + notUpdatedEntries: entriesAlreadyPrecached + }; + })(); + } + + /** + * Takes the current set of temporary files and moves them to the final + * cache, deleting the temporary cache once copying is complete. + * + * @param {Object} options + * @param {Array} options.plugins Plugins to be used for fetching + * and caching during install. + * @return { + * Promise} + * Resolves with an object containing details of the deleted cache requests + * and precache revision details. + */ + activate(options = {}) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + const tempCache = yield caches.open(_this2._getTempCacheName()); + + const requests = yield tempCache.keys(); + // Process each request/response one at a time, deleting the temporary entry + // when done, to help avoid triggering quota errors. + for (const request of requests) { + const response = yield tempCache.match(request); + yield cacheWrapper_mjs.cacheWrapper.put({ + cacheName: _this2._cacheName, + request, + response, + plugins: options.plugins + }); + yield tempCache.delete(request); + } + + return _this2._cleanup(); + })(); + } + + /** + * Returns the name of the temporary cache. + * + * @return {string} + * + * @private + */ + _getTempCacheName() { + return `${this._cacheName}-temp`; + } + + /** + * Requests the entry and saves it to the cache if the response + * is valid. + * + * @private + * @param {Object} options + * @param {BaseCacheEntry} options.precacheEntry The entry to fetch and cache. + * @param {Event} [options.event] The install event (if passed). + * @param {Array} [options.plugins] An array of plugins to apply to + * fetch and caching. + * @return {Promise} Returns a promise that resolves once the entry + * has been fetched and cached or skipped if no update is needed. The + * promise resolves with true if the entry was cached / updated and + * false if the entry is already cached and up-to-date. + */ + _cacheEntryInTemp({ precacheEntry, event, plugins }) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + let response = yield fetchWrapper_mjs.fetchWrapper.fetch({ + request: precacheEntry._networkRequest, + event, + fetchOptions: null, + plugins + }); + + if (response.redirected) { + response = yield cleanRedirect(response); + } + + yield cacheWrapper_mjs.cacheWrapper.put({ + cacheName: _this3._getTempCacheName(), + request: precacheEntry._cacheRequest, + response, + event, + plugins + }); + + yield _this3._precacheDetailsModel._addEntry(precacheEntry); + + return true; + })(); + } + + /** + * Compare the URLs and determines which assets are no longer required + * in the cache. + * + * This should be called in the service worker activate event. + * + * @return { + * Promise} + * Resolves with an object containing details of the deleted cache requests + * and precache revision details. + * + * @private + */ + _cleanup() { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + const expectedCacheUrls = []; + _this4._entriesToCacheMap.forEach(function (entry) { + const fullUrl = new URL(entry._cacheRequest.url, location).toString(); + expectedCacheUrls.push(fullUrl); + }); + + const [deletedCacheRequests, deletedRevisionDetails] = yield Promise.all([_this4._cleanupCache(expectedCacheUrls), _this4._cleanupDetailsModel(expectedCacheUrls)]); + + { + printCleanupDetails(deletedCacheRequests, deletedRevisionDetails); + } + + return { + deletedCacheRequests, + deletedRevisionDetails + }; + })(); + } + + /** + * Goes through all the cache entries and removes any that are + * outdated. + * + * @private + * @param {Array} expectedCacheUrls Array of URLs that are + * expected to be cached. + * @return {Promise>} Resolves to an array of URLs + * of cached requests that were deleted. + */ + _cleanupCache(expectedCacheUrls) { + var _this5 = this; + + return babelHelpers.asyncToGenerator(function* () { + if (!(yield caches.has(_this5._cacheName))) { + // Cache doesn't exist, so nothing to delete + return []; + } + + const cache = yield caches.open(_this5._cacheName); + const cachedRequests = yield cache.keys(); + const cachedRequestsToDelete = cachedRequests.filter(function (cachedRequest) { + return !expectedCacheUrls.includes(new URL(cachedRequest.url, location).toString()); + }); + + yield Promise.all(cachedRequestsToDelete.map(function (cacheUrl) { + return cache.delete(cacheUrl); + })); + + return cachedRequestsToDelete.map(function (request) { + return request.url; + }); + })(); + } + + /** + * Goes through all entries in indexedDB and removes any that are outdated. + * + * @private + * @param {Array} expectedCacheUrls Array of URLs that are + * expected to be cached. + * @return {Promise>} Resolves to an array of URLs removed + * from indexedDB. + */ + _cleanupDetailsModel(expectedCacheUrls) { + var _this6 = this; + + return babelHelpers.asyncToGenerator(function* () { + const revisionedEntries = yield _this6._precacheDetailsModel._getAllEntries(); + const detailsToDelete = revisionedEntries.filter(function (entry) { + const fullUrl = new URL(entry.value.url, location).toString(); + return !expectedCacheUrls.includes(fullUrl); + }); + + yield Promise.all(detailsToDelete.map(function (entry) { + return _this6._precacheDetailsModel._deleteEntry(entry.primaryKey); + })); + return detailsToDelete.map(function (entry) { + return entry.value.url; + }); + })(); + } + + /** + * Returns an array of fully qualified URL's that will be precached. + * + * @return {Array} An array of URLs. + */ + getCachedUrls() { + return Array.from(this._entriesToCacheMap.keys()).map(url => new URL(url, location).href); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var publicAPI = /*#__PURE__*/Object.freeze({ + PrecacheController: PrecacheController + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + { + assert_mjs.assert.isSwEnv('workbox-precaching'); + } + + let installActivateListenersAdded = false; + let fetchListenersAdded = false; + let suppressWarnings = false; + let plugins = []; + + const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(); + const precacheController = new PrecacheController(cacheName); + + const _removeIgnoreUrlParams = (origUrlObject, ignoreUrlParametersMatching) => { + // Exclude initial '?' + const searchString = origUrlObject.search.slice(1); + + // Split into an array of 'key=value' strings + const keyValueStrings = searchString.split('&'); + const keyValuePairs = keyValueStrings.map(keyValueString => { + // Split each 'key=value' string into a [key, value] array + return keyValueString.split('='); + }); + const filteredKeyValuesPairs = keyValuePairs.filter(keyValuePair => { + return ignoreUrlParametersMatching.every(ignoredRegex => { + // Return true iff the key doesn't match any of the regexes. + return !ignoredRegex.test(keyValuePair[0]); + }); + }); + const filteredStrings = filteredKeyValuesPairs.map(keyValuePair => { + // Join each [key, value] array into a 'key=value' string + return keyValuePair.join('='); + }); + + // Join the array of 'key=value' strings into a string with '&' in + // between each + const urlClone = new URL(origUrlObject); + urlClone.search = filteredStrings.join('&'); + return urlClone; + }; + + /** + * This function will take the request URL and manipulate it based on the + * configuration options. + * + * @param {string} url + * @param {Object} options + * @return {string|null} Returns the URL in the cache that matches the request + * if available, other null. + * + * @private + */ + const _getPrecachedUrl = (url, { + ignoreUrlParametersMatching = [/^utm_/], + directoryIndex = 'index.html', + cleanUrls = true, + urlManipulation = null + } = {}) => { + const urlObject = new URL(url, location); + + // Change '/some-url#123' => '/some-url' + urlObject.hash = ''; + + const urlWithoutIgnoredParams = _removeIgnoreUrlParams(urlObject, ignoreUrlParametersMatching); + + let urlsToAttempt = [ + // Test the URL that was fetched + urlObject, + // Test the URL without search params + urlWithoutIgnoredParams]; + + // Test the URL with a directory index + if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) { + const directoryUrl = new URL(urlWithoutIgnoredParams); + directoryUrl.pathname += directoryIndex; + urlsToAttempt.push(directoryUrl); + } + + // Test the URL with a '.html' extension + if (cleanUrls) { + const cleanUrl = new URL(urlWithoutIgnoredParams); + cleanUrl.pathname += '.html'; + urlsToAttempt.push(cleanUrl); + } + + if (urlManipulation) { + const additionalUrls = urlManipulation({ url: urlObject }); + urlsToAttempt = urlsToAttempt.concat(additionalUrls); + } + + const cachedUrls = precacheController.getCachedUrls(); + for (const possibleUrl of urlsToAttempt) { + if (cachedUrls.indexOf(possibleUrl.href) !== -1) { + // It's a perfect match + { + logger_mjs.logger.debug(`Precaching found a match for ` + getFriendlyURL_mjs.getFriendlyURL(possibleUrl.toString())); + } + return possibleUrl.href; + } + } + + return null; + }; + + const moduleExports = {}; + + /** + * Add items to the precache list, removing any duplicates and + * store the files in the + * ["precache cache"]{@link module:workbox-core.cacheNames} when the service + * worker installs. + * + * This method can be called multiple times. + * + * Please note: This method **will not** serve any of the cached files for you, + * it only precaches files. To respond to a network request you call + * [addRoute()]{@link module:workbox-precaching.addRoute}. + * + * If you have a single array of files to precache, you can just call + * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}. + * + * @param {Array} entries Array of entries to precache. + * + * @alias workbox.precaching.precache + */ + moduleExports.precache = entries => { + precacheController.addToCacheList(entries); + + if (installActivateListenersAdded || entries.length <= 0) { + return; + } + + installActivateListenersAdded = true; + self.addEventListener('install', event => { + event.waitUntil(precacheController.install({ + event, + plugins, + suppressWarnings + })); + }); + self.addEventListener('activate', event => { + event.waitUntil(precacheController.activate({ + event, + plugins + })); + }); + }; + + /** + * Add a `fetch` listener to the service worker that will + * respond to + * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests} + * with precached assets. + * + * Requests for assets that aren't precached, the `FetchEvent` will not be + * responded to, allowing the event to fall through to other `fetch` event + * listeners. + * + * @param {Object} options + * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will + * check cache entries for a URLs ending with '/' to see if there is a hit when + * appending the `directoryIndex` value. + * @param {Array} [options.ignoreUrlParametersMatching=[/^utm_/]] An + * array of regex's to remove search params when looking for a cache match. + * @param {boolean} [options.cleanUrls=true] The `cleanUrls` option will + * check the cache for the URL with a `.html` added to the end of the end. + * @param {workbox.precaching~urlManipulation} [options.urlManipulation] + * This is a function that should take a URL and return an array of + * alternative URL's that should be checked for precache matches. + * + * @alias workbox.precaching.addRoute + */ + moduleExports.addRoute = options => { + if (fetchListenersAdded) { + // TODO: Throw error here. + return; + } + + fetchListenersAdded = true; + self.addEventListener('fetch', event => { + const precachedUrl = _getPrecachedUrl(event.request.url, options); + if (!precachedUrl) { + { + logger_mjs.logger.debug(`Precaching found no match for ` + getFriendlyURL_mjs.getFriendlyURL(event.request.url)); + } + return; + } + + let responsePromise = caches.open(cacheName).then(cache => { + return cache.match(precachedUrl); + }).then(cachedResponse => { + if (cachedResponse) { + return cachedResponse; + } + + // Fall back to the network if we don't have a cached response (perhaps + // due to manual cache cleanup). + { + logger_mjs.logger.debug(`The precached response for ` + `${getFriendlyURL_mjs.getFriendlyURL(precachedUrl)} in ${cacheName} was not found. ` + `Falling back to the network instead.`); + } + + return fetch(precachedUrl); + }); + + { + responsePromise = responsePromise.then(response => { + // Workbox is going to handle the route. + // print the routing details to the console. + logger_mjs.logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL_mjs.getFriendlyURL(event.request.url)); + logger_mjs.logger.log(`Serving the precached url: ${precachedUrl}`); + + // The Request and Response objects contains a great deal of + // information, hide it under a group in case developers want to see it. + logger_mjs.logger.groupCollapsed(`View request details here.`); + logger_mjs.logger.unprefixed.log(event.request); + logger_mjs.logger.groupEnd(); + + logger_mjs.logger.groupCollapsed(`View response details here.`); + logger_mjs.logger.unprefixed.log(response); + logger_mjs.logger.groupEnd(); + + logger_mjs.logger.groupEnd(); + return response; + }); + } + event.respondWith(responsePromise); + }); + }; + + /** + * This method will add entries to the precache list and add a route to + * respond to fetch events. + * + * This is a convenience method that will call + * [precache()]{@link module:workbox-precaching.precache} and + * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call. + * + * @param {Array} entries Array of entries to precache. + * @param {Object} options See + * [addRoute() options]{@link module:workbox-precaching.addRoute}. + * + * @alias workbox.precaching.precacheAndRoute + */ + moduleExports.precacheAndRoute = (entries, options) => { + moduleExports.precache(entries); + moduleExports.addRoute(options); + }; + + /** + * Warnings will be logged if any of the precached assets are entered without + * a `revision` property. This is extremely dangerous if the URL's aren't + * revisioned. However, the warnings can be supressed with this method. + * + * @param {boolean} suppress + * + * @alias workbox.precaching.suppressWarnings + */ + moduleExports.suppressWarnings = suppress => { + suppressWarnings = suppress; + }; + + /** + * Add plugins to precaching. + * + * @param {Array} newPlugins + * + * @alias workbox.precaching.addPlugins + */ + moduleExports.addPlugins = newPlugins => { + plugins = plugins.concat(newPlugins); + }; + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const finalExport = Object.assign(moduleExports, publicAPI); + + return finalExport; + +}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-precaching.dev.js.map diff --git a/workbox-v3.6.3/workbox-precaching.dev.js.map b/workbox-v3.6.3/workbox-precaching.dev.js.map new file mode 100644 index 0000000..5ffbac1 --- /dev/null +++ b/workbox-v3.6.3/workbox-precaching.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-precaching/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.precaching = (function (DBWrapper_mjs,logger_mjs,cacheNames_mjs,WorkboxError_mjs,fetchWrapper_mjs,cacheWrapper_mjs,assert_mjs,getFriendlyURL_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:precaching:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Used as a consistent way of referencing a URL to precache.\n *\n * @private\n * @memberof module:workbox-precaching\n */\n class PrecacheEntry {\n /**\n * This class ensures all cache list entries are consistent and\n * adds cache busting if required.\n *\n * @param {*} originalInput\n * @param {string} url\n * @param {string} revision\n * @param {boolean} shouldCacheBust\n */\n constructor(originalInput, url, revision, shouldCacheBust) {\n this._originalInput = originalInput;\n this._entryId = url;\n this._revision = revision;\n const requestAsCacheKey = new Request(url, { credentials: 'same-origin' });\n this._cacheRequest = requestAsCacheKey;\n this._networkRequest = shouldCacheBust ? this._cacheBustRequest(requestAsCacheKey) : requestAsCacheKey;\n }\n\n /**\n * This method will either use Request.cache option OR append a cache\n * busting parameter to the URL.\n *\n * @param {Request} request The request to cache bust\n * @return {Request} A cachebusted Request\n *\n * @private\n */\n _cacheBustRequest(request) {\n let url = request.url;\n const requestOptions = {\n credentials: 'same-origin'\n };\n if ('cache' in Request.prototype) {\n // Make use of the Request cache mode where we can.\n // Reload skips the HTTP cache for outgoing requests and updates\n // the cache with the returned response.\n requestOptions.cache = 'reload';\n } else {\n const parsedURL = new URL(url, location);\n\n // This is done so the minifier can mangle 'global.encodeURIComponent'\n const _encodeURIComponent = encodeURIComponent;\n\n parsedURL.search += (parsedURL.search ? '&' : '') + _encodeURIComponent(`_workbox-cache-bust`) + '=' + _encodeURIComponent(this._revision);\n url = parsedURL.toString();\n }\n\n return new Request(url, requestOptions);\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n // Allows minifier to mangle this name\n const REVISON_IDB_FIELD = 'revision';\n const URL_IDB_FIELD = 'url';\n const DB_STORE_NAME = 'precached-details-models';\n /**\n * This model will track the relevant information of entries that\n * are cached and their matching revision details.\n *\n * @private\n */\n class PrecachedDetailsModel {\n /**\n * Construct a new model for a specific cache.\n *\n * @param {string} dbName\n * @private\n */\n constructor(dbName) {\n // This ensures the db name contains only letters, numbers, '-', '_' and '$'\n const filteredDBName = dbName.replace(/[^\\w-]/g, '_');\n this._db = new DBWrapper_mjs.DBWrapper(filteredDBName, 2, {\n onupgradeneeded: this._handleUpgrade\n });\n }\n\n /**\n * Should perform an upgrade of indexedDB.\n *\n * @param {Event} evt\n *\n * @private\n */\n _handleUpgrade(evt) {\n const db = evt.target.result;\n if (evt.oldVersion < 2) {\n // IndexedDB version 1 used both 'workbox-precaching' and\n // 'precached-details-model' before upgrading to version 2.\n // Delete them and create a new store with latest schema.\n if (db.objectStoreNames.contains('workbox-precaching')) {\n db.deleteObjectStore('workbox-precaching');\n }\n if (db.objectStoreNames.contains(DB_STORE_NAME)) {\n db.deleteObjectStore(DB_STORE_NAME);\n }\n }\n db.createObjectStore(DB_STORE_NAME);\n }\n\n /**\n * Check if an entry is already cached. Returns false if\n * the entry isn't cached or the revision has changed.\n *\n * @param {string} cacheName\n * @param {PrecacheEntry} precacheEntry\n * @return {boolean}\n *\n * @private\n */\n _isEntryCached(cacheName, precacheEntry) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const revisionDetails = yield _this._getRevision(precacheEntry._entryId);\n if (revisionDetails !== precacheEntry._revision) {\n return false;\n }\n\n const openCache = yield caches.open(cacheName);\n const cachedResponse = yield openCache.match(precacheEntry._cacheRequest);\n return !!cachedResponse;\n })();\n }\n\n /**\n * @return {Promise}\n *\n * @private\n */\n _getAllEntries() {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n return yield _this2._db.getAllMatching(DB_STORE_NAME, {\n includeKeys: true\n });\n })();\n }\n\n /**\n * Get the current revision details.\n *\n * @param {Object} entryId\n * @return {Promise}\n *\n * @private\n */\n _getRevision(entryId) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const data = yield _this3._db.get(DB_STORE_NAME, entryId);\n return data ? data[REVISON_IDB_FIELD] : null;\n })();\n }\n\n /**\n * Add an entry to the details model.\n *\n * @param {PrecacheEntry} precacheEntry\n *\n * @private\n */\n _addEntry(precacheEntry) {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this4._db.put(DB_STORE_NAME, {\n [REVISON_IDB_FIELD]: precacheEntry._revision,\n [URL_IDB_FIELD]: precacheEntry._cacheRequest.url\n }, precacheEntry._entryId);\n })();\n }\n\n /**\n * Delete entry from details model.\n *\n * @param {string} entryId\n *\n * @private\n */\n _deleteEntry(entryId) {\n var _this5 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n yield _this5._db.delete(DB_STORE_NAME, entryId);\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * This method will print out a warning if a precache entry doesn't have\n * a `revision` value.\n *\n * This is common if the asset if revisioned in the url like `index.1234.css`.\n *\n * @param {Map} entriesMap\n *\n * @private\n * @memberof module:workbox-preaching\n */\n var showWarningsIfNeeded = (entriesMap => {\n const urlOnlyEntries = [];\n entriesMap.forEach(entry => {\n if (typeof entry === 'string' || !entry._originalInput.revision) {\n urlOnlyEntries.push(entry._originalInput);\n }\n });\n\n if (urlOnlyEntries.length === 0) {\n // No warnings needed.\n return;\n }\n\n logger_mjs.logger.groupCollapsed('Are your precached assets revisioned?');\n\n const urlsList = urlOnlyEntries.map(urlOnlyEntry => {\n return ` - ${JSON.stringify(urlOnlyEntry)}`;\n }).join(`\\n`);\n\n logger_mjs.logger.warn(`The following precache entries might not be revisioned:` + `\\n\\n` + urlsList + `\\n\\n`);\n\n logger_mjs.logger.unprefixed.warn(`You can learn more about why this might be a ` + `problem here: https://developers.google.com/web/tools/workbox/modules/workbox-precaching`);\n\n logger_mjs.logger.groupEnd();\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @param {string} groupTitle\n * @param {Array} entries\n *\n * @private\n */\n const _nestedGroup = (groupTitle, entries) => {\n if (entries.length === 0) {\n return;\n }\n\n logger_mjs.logger.groupCollapsed(groupTitle);\n\n entries.forEach(entry => {\n logger_mjs.logger.log(entry._originalInput);\n });\n\n logger_mjs.logger.groupEnd();\n };\n\n /**\n * @param {Array} entriesToPrecache\n * @param {Array} alreadyPrecachedEntries\n *\n * @private\n * @memberof module:workbox-precachig\n */\n var printInstallDetails = ((entriesToPrecache, alreadyPrecachedEntries) => {\n // Goal is to print the message:\n // Precaching X files.\n // Or:\n // Precaching X files. Y files were cached and up-to-date.\n\n const precachedCount = entriesToPrecache.length;\n const alreadyPrecachedCount = alreadyPrecachedEntries.length;\n let printText = `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`;\n if (alreadyPrecachedCount > 0) {\n printText += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`;\n }\n\n logger_mjs.logger.groupCollapsed(printText);\n\n _nestedGroup(`View precached URLs.`, entriesToPrecache);\n _nestedGroup(`View URLs that were already precached.`, alreadyPrecachedEntries);\n logger_mjs.logger.groupEnd();\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const logGroup = (groupTitle, urls) => {\n logger_mjs.logger.groupCollapsed(groupTitle);\n\n urls.forEach(url => {\n logger_mjs.logger.log(url);\n });\n\n logger_mjs.logger.groupEnd();\n };\n\n /**\n * @param {Array} deletedCacheRequests\n * @param {Array} deletedRevisionDetails\n *\n * @private\n * @memberof module:workbox-precachig\n */\n var printCleanupDetails = ((deletedCacheRequests, deletedRevisionDetails) => {\n if (deletedCacheRequests.length === 0 && deletedRevisionDetails.length === 0) {\n return;\n }\n\n const cacheDeleteCount = deletedCacheRequests.length;\n const revisionDeleteCount = deletedRevisionDetails.length;\n\n const cacheDeleteText = `${cacheDeleteCount} cached ` + `request${cacheDeleteCount === 1 ? ' was' : 's were'} deleted`;\n const revisionDeleteText = `${revisionDeleteCount} ` + `${revisionDeleteCount === 1 ? 'entry' : 'entries'} ` + `${revisionDeleteCount === 1 ? 'was' : 'were'} deleted from IndexedDB.`;\n\n logger_mjs.logger.groupCollapsed(`During precaching cleanup, ${cacheDeleteText} and ${revisionDeleteText}`);\n\n logGroup('Deleted Cache Requests', deletedCacheRequests);\n logGroup('Revision Details Deleted from DB', deletedRevisionDetails);\n\n logger_mjs.logger.groupEnd();\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @param {Response} response\n * @return {Response}\n *\n * @private\n * @memberof module:workbox-precaching\n */\n const cleanRedirect = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* (response) {\n const clonedResponse = response.clone();\n\n // Not all browsers support the Response.body stream, so fall back\n // to reading the entire body into memory as a blob.\n const bodyPromise = 'body' in clonedResponse ? Promise.resolve(clonedResponse.body) : clonedResponse.blob();\n\n const body = yield bodyPromise;\n\n // new Response() is happy when passed either a stream or a Blob.\n return new Response(body, {\n headers: clonedResponse.headers,\n status: clonedResponse.status,\n statusText: clonedResponse.statusText\n });\n });\n\n return function cleanRedirect(_x) {\n return _ref.apply(this, arguments);\n };\n })();\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Performs efficient precaching of assets.\n *\n * @memberof workbox.precaching\n */\n class PrecacheController {\n /**\n * Create a new PrecacheController.\n *\n * @param {string} cacheName\n */\n constructor(cacheName) {\n this._cacheName = cacheNames_mjs.cacheNames.getPrecacheName(cacheName);\n this._entriesToCacheMap = new Map();\n this._precacheDetailsModel = new PrecachedDetailsModel(this._cacheName);\n }\n\n /**\n * This method will add items to the precache list, removing duplicates\n * and ensuring the information is valid.\n *\n * @param {\n * Array\n * } entries Array of entries to\n * precache.\n */\n addToCacheList(entries) {\n {\n assert_mjs.assert.isArray(entries, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'addToCacheList',\n paramName: 'entries'\n });\n }\n\n entries.map(userEntry => {\n this._addEntryToCacheList(this._parseEntry(userEntry));\n });\n }\n\n /**\n * This method returns a precache entry.\n *\n * @private\n * @param {string|Object} input\n * @return {PrecacheEntry}\n */\n _parseEntry(input) {\n switch (typeof input) {\n case 'string':\n {\n {\n if (input.length === 0) {\n throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', {\n entry: input\n });\n }\n }\n\n return new PrecacheEntry(input, input, input);\n }\n case 'object':\n {\n {\n if (!input || !input.url) {\n throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', {\n entry: input\n });\n }\n }\n\n return new PrecacheEntry(input, input.url, input.revision || input.url, !!input.revision);\n }\n default:\n throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', {\n entry: input\n });\n }\n }\n\n /**\n * Adds an entry to the precache list, accounting for possible duplicates.\n *\n * @private\n * @param {PrecacheEntry} entryToAdd\n */\n _addEntryToCacheList(entryToAdd) {\n // Check if the entry is already part of the map\n const existingEntry = this._entriesToCacheMap.get(entryToAdd._entryId);\n if (!existingEntry) {\n this._entriesToCacheMap.set(entryToAdd._entryId, entryToAdd);\n return;\n }\n\n // Duplicates are fine, but make sure the revision information\n // is the same.\n if (existingEntry._revision !== entryToAdd._revision) {\n throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-conflicting-entries', {\n firstEntry: existingEntry._originalInput,\n secondEntry: entryToAdd._originalInput\n });\n }\n }\n\n /**\n * Call this method from a service work install event to start\n * precaching assets.\n *\n * @param {Object} options\n * @param {boolean} [options.suppressWarnings] Suppress warning messages.\n * @param {Event} [options.event] The install event (if needed).\n * @param {Array} [options.plugins] Plugins to be used for fetching\n * and caching during install.\n * @return {Promise}\n */\n install({ suppressWarnings = false, event, plugins } = {}) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n if (suppressWarnings !== true) {\n showWarningsIfNeeded(_this._entriesToCacheMap);\n }\n\n if (plugins) {\n assert_mjs.assert.isArray(plugins, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'install',\n paramName: 'plugins'\n });\n }\n }\n\n // Empty the temporary cache.\n // NOTE: We remove all entries instead of deleting the cache as the cache\n // may be marked for deletion but still exist until a later stage\n // resulting in unexpected behavior of being deletect when all references\n // are dropped.\n // https://github.com/GoogleChrome/workbox/issues/1368\n const tempCache = yield caches.open(_this._getTempCacheName());\n const requests = yield tempCache.keys();\n yield Promise.all(requests.map(function (request) {\n return tempCache.delete(request);\n }));\n\n const entriesToPrecache = [];\n const entriesAlreadyPrecached = [];\n\n for (const precacheEntry of _this._entriesToCacheMap.values()) {\n if (yield _this._precacheDetailsModel._isEntryCached(_this._cacheName, precacheEntry)) {\n entriesAlreadyPrecached.push(precacheEntry);\n } else {\n entriesToPrecache.push(precacheEntry);\n }\n }\n\n // Wait for all requests to be cached.\n yield Promise.all(entriesToPrecache.map(function (precacheEntry) {\n return _this._cacheEntryInTemp({ event, plugins, precacheEntry });\n }));\n\n {\n printInstallDetails(entriesToPrecache, entriesAlreadyPrecached);\n }\n\n return {\n updatedEntries: entriesToPrecache,\n notUpdatedEntries: entriesAlreadyPrecached\n };\n })();\n }\n\n /**\n * Takes the current set of temporary files and moves them to the final\n * cache, deleting the temporary cache once copying is complete.\n *\n * @param {Object} options\n * @param {Array} options.plugins Plugins to be used for fetching\n * and caching during install.\n * @return {\n * Promise}\n * Resolves with an object containing details of the deleted cache requests\n * and precache revision details.\n */\n activate(options = {}) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const tempCache = yield caches.open(_this2._getTempCacheName());\n\n const requests = yield tempCache.keys();\n // Process each request/response one at a time, deleting the temporary entry\n // when done, to help avoid triggering quota errors.\n for (const request of requests) {\n const response = yield tempCache.match(request);\n yield cacheWrapper_mjs.cacheWrapper.put({\n cacheName: _this2._cacheName,\n request,\n response,\n plugins: options.plugins\n });\n yield tempCache.delete(request);\n }\n\n return _this2._cleanup();\n })();\n }\n\n /**\n * Returns the name of the temporary cache.\n *\n * @return {string}\n *\n * @private\n */\n _getTempCacheName() {\n return `${this._cacheName}-temp`;\n }\n\n /**\n * Requests the entry and saves it to the cache if the response\n * is valid.\n *\n * @private\n * @param {Object} options\n * @param {BaseCacheEntry} options.precacheEntry The entry to fetch and cache.\n * @param {Event} [options.event] The install event (if passed).\n * @param {Array} [options.plugins] An array of plugins to apply to\n * fetch and caching.\n * @return {Promise} Returns a promise that resolves once the entry\n * has been fetched and cached or skipped if no update is needed. The\n * promise resolves with true if the entry was cached / updated and\n * false if the entry is already cached and up-to-date.\n */\n _cacheEntryInTemp({ precacheEntry, event, plugins }) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n let response = yield fetchWrapper_mjs.fetchWrapper.fetch({\n request: precacheEntry._networkRequest,\n event,\n fetchOptions: null,\n plugins\n });\n\n if (response.redirected) {\n response = yield cleanRedirect(response);\n }\n\n yield cacheWrapper_mjs.cacheWrapper.put({\n cacheName: _this3._getTempCacheName(),\n request: precacheEntry._cacheRequest,\n response,\n event,\n plugins\n });\n\n yield _this3._precacheDetailsModel._addEntry(precacheEntry);\n\n return true;\n })();\n }\n\n /**\n * Compare the URLs and determines which assets are no longer required\n * in the cache.\n *\n * This should be called in the service worker activate event.\n *\n * @return {\n * Promise}\n * Resolves with an object containing details of the deleted cache requests\n * and precache revision details.\n *\n * @private\n */\n _cleanup() {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const expectedCacheUrls = [];\n _this4._entriesToCacheMap.forEach(function (entry) {\n const fullUrl = new URL(entry._cacheRequest.url, location).toString();\n expectedCacheUrls.push(fullUrl);\n });\n\n const [deletedCacheRequests, deletedRevisionDetails] = yield Promise.all([_this4._cleanupCache(expectedCacheUrls), _this4._cleanupDetailsModel(expectedCacheUrls)]);\n\n {\n printCleanupDetails(deletedCacheRequests, deletedRevisionDetails);\n }\n\n return {\n deletedCacheRequests,\n deletedRevisionDetails\n };\n })();\n }\n\n /**\n * Goes through all the cache entries and removes any that are\n * outdated.\n *\n * @private\n * @param {Array} expectedCacheUrls Array of URLs that are\n * expected to be cached.\n * @return {Promise>} Resolves to an array of URLs\n * of cached requests that were deleted.\n */\n _cleanupCache(expectedCacheUrls) {\n var _this5 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (!(yield caches.has(_this5._cacheName))) {\n // Cache doesn't exist, so nothing to delete\n return [];\n }\n\n const cache = yield caches.open(_this5._cacheName);\n const cachedRequests = yield cache.keys();\n const cachedRequestsToDelete = cachedRequests.filter(function (cachedRequest) {\n return !expectedCacheUrls.includes(new URL(cachedRequest.url, location).toString());\n });\n\n yield Promise.all(cachedRequestsToDelete.map(function (cacheUrl) {\n return cache.delete(cacheUrl);\n }));\n\n return cachedRequestsToDelete.map(function (request) {\n return request.url;\n });\n })();\n }\n\n /**\n * Goes through all entries in indexedDB and removes any that are outdated.\n *\n * @private\n * @param {Array} expectedCacheUrls Array of URLs that are\n * expected to be cached.\n * @return {Promise>} Resolves to an array of URLs removed\n * from indexedDB.\n */\n _cleanupDetailsModel(expectedCacheUrls) {\n var _this6 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const revisionedEntries = yield _this6._precacheDetailsModel._getAllEntries();\n const detailsToDelete = revisionedEntries.filter(function (entry) {\n const fullUrl = new URL(entry.value.url, location).toString();\n return !expectedCacheUrls.includes(fullUrl);\n });\n\n yield Promise.all(detailsToDelete.map(function (entry) {\n return _this6._precacheDetailsModel._deleteEntry(entry.primaryKey);\n }));\n return detailsToDelete.map(function (entry) {\n return entry.value.url;\n });\n })();\n }\n\n /**\n * Returns an array of fully qualified URL's that will be precached.\n *\n * @return {Array} An array of URLs.\n */\n getCachedUrls() {\n return Array.from(this._entriesToCacheMap.keys()).map(url => new URL(url, location).href);\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var publicAPI = /*#__PURE__*/Object.freeze({\n PrecacheController: PrecacheController\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n {\n assert_mjs.assert.isSwEnv('workbox-precaching');\n }\n\n let installActivateListenersAdded = false;\n let fetchListenersAdded = false;\n let suppressWarnings = false;\n let plugins = [];\n\n const cacheName = cacheNames_mjs.cacheNames.getPrecacheName();\n const precacheController = new PrecacheController(cacheName);\n\n const _removeIgnoreUrlParams = (origUrlObject, ignoreUrlParametersMatching) => {\n // Exclude initial '?'\n const searchString = origUrlObject.search.slice(1);\n\n // Split into an array of 'key=value' strings\n const keyValueStrings = searchString.split('&');\n const keyValuePairs = keyValueStrings.map(keyValueString => {\n // Split each 'key=value' string into a [key, value] array\n return keyValueString.split('=');\n });\n const filteredKeyValuesPairs = keyValuePairs.filter(keyValuePair => {\n return ignoreUrlParametersMatching.every(ignoredRegex => {\n // Return true iff the key doesn't match any of the regexes.\n return !ignoredRegex.test(keyValuePair[0]);\n });\n });\n const filteredStrings = filteredKeyValuesPairs.map(keyValuePair => {\n // Join each [key, value] array into a 'key=value' string\n return keyValuePair.join('=');\n });\n\n // Join the array of 'key=value' strings into a string with '&' in\n // between each\n const urlClone = new URL(origUrlObject);\n urlClone.search = filteredStrings.join('&');\n return urlClone;\n };\n\n /**\n * This function will take the request URL and manipulate it based on the\n * configuration options.\n *\n * @param {string} url\n * @param {Object} options\n * @return {string|null} Returns the URL in the cache that matches the request\n * if available, other null.\n *\n * @private\n */\n const _getPrecachedUrl = (url, {\n ignoreUrlParametersMatching = [/^utm_/],\n directoryIndex = 'index.html',\n cleanUrls = true,\n urlManipulation = null\n } = {}) => {\n const urlObject = new URL(url, location);\n\n // Change '/some-url#123' => '/some-url'\n urlObject.hash = '';\n\n const urlWithoutIgnoredParams = _removeIgnoreUrlParams(urlObject, ignoreUrlParametersMatching);\n\n let urlsToAttempt = [\n // Test the URL that was fetched\n urlObject,\n // Test the URL without search params\n urlWithoutIgnoredParams];\n\n // Test the URL with a directory index\n if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {\n const directoryUrl = new URL(urlWithoutIgnoredParams);\n directoryUrl.pathname += directoryIndex;\n urlsToAttempt.push(directoryUrl);\n }\n\n // Test the URL with a '.html' extension\n if (cleanUrls) {\n const cleanUrl = new URL(urlWithoutIgnoredParams);\n cleanUrl.pathname += '.html';\n urlsToAttempt.push(cleanUrl);\n }\n\n if (urlManipulation) {\n const additionalUrls = urlManipulation({ url: urlObject });\n urlsToAttempt = urlsToAttempt.concat(additionalUrls);\n }\n\n const cachedUrls = precacheController.getCachedUrls();\n for (const possibleUrl of urlsToAttempt) {\n if (cachedUrls.indexOf(possibleUrl.href) !== -1) {\n // It's a perfect match\n {\n logger_mjs.logger.debug(`Precaching found a match for ` + getFriendlyURL_mjs.getFriendlyURL(possibleUrl.toString()));\n }\n return possibleUrl.href;\n }\n }\n\n return null;\n };\n\n const moduleExports = {};\n\n /**\n * Add items to the precache list, removing any duplicates and\n * store the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * Please note: This method **will not** serve any of the cached files for you,\n * it only precaches files. To respond to a network request you call\n * [addRoute()]{@link module:workbox-precaching.addRoute}.\n *\n * If you have a single array of files to precache, you can just call\n * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}.\n *\n * @param {Array} entries Array of entries to precache.\n *\n * @alias workbox.precaching.precache\n */\n moduleExports.precache = entries => {\n precacheController.addToCacheList(entries);\n\n if (installActivateListenersAdded || entries.length <= 0) {\n return;\n }\n\n installActivateListenersAdded = true;\n self.addEventListener('install', event => {\n event.waitUntil(precacheController.install({\n event,\n plugins,\n suppressWarnings\n }));\n });\n self.addEventListener('activate', event => {\n event.waitUntil(precacheController.activate({\n event,\n plugins\n }));\n });\n };\n\n /**\n * Add a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * @param {Object} options\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreUrlParametersMatching=[/^utm_/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanUrls=true] The `cleanUrls` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {workbox.precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URL's that should be checked for precache matches.\n *\n * @alias workbox.precaching.addRoute\n */\n moduleExports.addRoute = options => {\n if (fetchListenersAdded) {\n // TODO: Throw error here.\n return;\n }\n\n fetchListenersAdded = true;\n self.addEventListener('fetch', event => {\n const precachedUrl = _getPrecachedUrl(event.request.url, options);\n if (!precachedUrl) {\n {\n logger_mjs.logger.debug(`Precaching found no match for ` + getFriendlyURL_mjs.getFriendlyURL(event.request.url));\n }\n return;\n }\n\n let responsePromise = caches.open(cacheName).then(cache => {\n return cache.match(precachedUrl);\n }).then(cachedResponse => {\n if (cachedResponse) {\n return cachedResponse;\n }\n\n // Fall back to the network if we don't have a cached response (perhaps\n // due to manual cache cleanup).\n {\n logger_mjs.logger.debug(`The precached response for ` + `${getFriendlyURL_mjs.getFriendlyURL(precachedUrl)} in ${cacheName} was not found. ` + `Falling back to the network instead.`);\n }\n\n return fetch(precachedUrl);\n });\n\n {\n responsePromise = responsePromise.then(response => {\n // Workbox is going to handle the route.\n // print the routing details to the console.\n logger_mjs.logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL_mjs.getFriendlyURL(event.request.url));\n logger_mjs.logger.log(`Serving the precached url: ${precachedUrl}`);\n\n // The Request and Response objects contains a great deal of\n // information, hide it under a group in case developers want to see it.\n logger_mjs.logger.groupCollapsed(`View request details here.`);\n logger_mjs.logger.unprefixed.log(event.request);\n logger_mjs.logger.groupEnd();\n\n logger_mjs.logger.groupCollapsed(`View response details here.`);\n logger_mjs.logger.unprefixed.log(response);\n logger_mjs.logger.groupEnd();\n\n logger_mjs.logger.groupEnd();\n return response;\n });\n }\n event.respondWith(responsePromise);\n });\n };\n\n /**\n * This method will add entries to the precache list and add a route to\n * respond to fetch events.\n *\n * This is a convenience method that will call\n * [precache()]{@link module:workbox-precaching.precache} and\n * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call.\n *\n * @param {Array} entries Array of entries to precache.\n * @param {Object} options See\n * [addRoute() options]{@link module:workbox-precaching.addRoute}.\n *\n * @alias workbox.precaching.precacheAndRoute\n */\n moduleExports.precacheAndRoute = (entries, options) => {\n moduleExports.precache(entries);\n moduleExports.addRoute(options);\n };\n\n /**\n * Warnings will be logged if any of the precached assets are entered without\n * a `revision` property. This is extremely dangerous if the URL's aren't\n * revisioned. However, the warnings can be supressed with this method.\n *\n * @param {boolean} suppress\n *\n * @alias workbox.precaching.suppressWarnings\n */\n moduleExports.suppressWarnings = suppress => {\n suppressWarnings = suppress;\n };\n\n /**\n * Add plugins to precaching.\n *\n * @param {Array} newPlugins\n *\n * @alias workbox.precaching.addPlugins\n */\n moduleExports.addPlugins = newPlugins => {\n plugins = plugins.concat(newPlugins);\n };\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const finalExport = Object.assign(moduleExports, publicAPI);\n\n return finalExport;\n\n}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-precaching.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-precaching.prod.js b/workbox-v3.6.3/workbox-precaching.prod.js new file mode 100644 index 0000000..ba9e3f8 --- /dev/null +++ b/workbox-v3.6.3/workbox-precaching.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.precaching=function(e,t,n,r,s){"use strict";try{self.workbox.v["workbox:precaching:3.6.3"]=1}catch(e){}class i{constructor(e,t,n,r){this.e=e,this.t=t,this.n=n;const s=new Request(t,{credentials:"same-origin"});this.r=s,this.s=r?this.i(s):s}i(e){let t=e.url;const n={credentials:"same-origin"};if("cache"in Request.prototype)n.cache="reload";else{const e=new URL(t,location),n=encodeURIComponent;e.search+=(e.search?"&":"")+n("_workbox-cache-bust")+"="+n(this.n),t=e.toString()}return new Request(t,n)}}const c="revision",o="url",l="precached-details-models";class a{constructor(t){const n=t.replace(/[^\w-]/g,"_");this.c=new e.DBWrapper(n,2,{onupgradeneeded:this.o})}o(e){const t=e.target.result;e.oldVersion<2&&(t.objectStoreNames.contains("workbox-precaching")&&t.deleteObjectStore("workbox-precaching"),t.objectStoreNames.contains(l)&&t.deleteObjectStore(l)),t.createObjectStore(l)}l(e,t){var n=this;return babelHelpers.asyncToGenerator(function*(){return(yield n.a(t.t))===t.n&&!!(yield(yield caches.open(e)).match(t.r))})()}u(){var e=this;return babelHelpers.asyncToGenerator(function*(){return yield e.c.getAllMatching(l,{includeKeys:!0})})()}a(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const n=yield t.c.get(l,e);return n?n[c]:null})()}d(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.c.put(l,{[c]:e.n,[o]:e.r.url},e.t)})()}h(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.c.delete(l,e)})()}}const u=(d=babelHelpers.asyncToGenerator(function*(e){const t=e.clone(),n=yield"body"in t?Promise.resolve(t.body):t.blob();return new Response(n,{headers:t.headers,status:t.status,statusText:t.statusText})}),function(e){return d.apply(this,arguments)});var d;class h{constructor(e){this.p=t.cacheNames.getPrecacheName(e),this.f=new Map,this.y=new a(this.p)}addToCacheList(e){e.map(e=>{this.b(this.w(e))})}w(e){switch(typeof e){case"string":return new i(e,e,e);case"object":return new i(e,e.url,e.revision||e.url,!!e.revision);default:throw new n.WorkboxError("add-to-cache-list-unexpected-type",{entry:e})}}b(e){const t=this.f.get(e.t);if(t){if(t.n!==e.n)throw new n.WorkboxError("add-to-cache-list-conflicting-entries",{firstEntry:t.e,secondEntry:e.e})}else this.f.set(e.t,e)}install({suppressWarnings:e=!1,event:t,plugins:n}={}){var r=this;return babelHelpers.asyncToGenerator(function*(){const e=yield caches.open(r.g()),s=yield e.keys();yield Promise.all(s.map(function(t){return e.delete(t)}));const i=[],c=[];for(const e of r.f.values())(yield r.y.l(r.p,e))?c.push(e):i.push(e);return yield Promise.all(i.map(function(e){return r.m({event:t,plugins:n,precacheEntry:e})})),{updatedEntries:i,notUpdatedEntries:c}})()}activate(e={}){var t=this;return babelHelpers.asyncToGenerator(function*(){const n=yield caches.open(t.g()),r=yield n.keys();for(const i of r){const r=yield n.match(i);yield s.cacheWrapper.put({cacheName:t.p,request:i,response:r,plugins:e.plugins}),yield n.delete(i)}return t.R()})()}g(){return`${this.p}-temp`}m({precacheEntry:e,event:t,plugins:n}){var i=this;return babelHelpers.asyncToGenerator(function*(){let c=yield r.fetchWrapper.fetch({request:e.s,event:t,fetchOptions:null,plugins:n});return c.redirected&&(c=yield u(c)),yield s.cacheWrapper.put({cacheName:i.g(),request:e.r,response:c,event:t,plugins:n}),yield i.y.d(e),!0})()}R(){var e=this;return babelHelpers.asyncToGenerator(function*(){const t=[];e.f.forEach(function(e){const n=new URL(e.r.url,location).toString();t.push(n)});const[n,r]=yield Promise.all([e._(t),e.U(t)]);return{deletedCacheRequests:n,deletedRevisionDetails:r}})()}_(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!(yield caches.has(t.p)))return[];const n=yield caches.open(t.p),r=(yield n.keys()).filter(function(t){return!e.includes(new URL(t.url,location).toString())});return yield Promise.all(r.map(function(e){return n.delete(e)})),r.map(function(e){return e.url})})()}U(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const n=(yield t.y.u()).filter(function(t){const n=new URL(t.value.url,location).toString();return!e.includes(n)});return yield Promise.all(n.map(function(e){return t.y.h(e.primaryKey)})),n.map(function(e){return e.value.url})})()}getCachedUrls(){return Array.from(this.f.keys()).map(e=>new URL(e,location).href)}}var p=Object.freeze({PrecacheController:h});let f=!1,y=!1,b=!1,w=[];const g=t.cacheNames.getPrecacheName(),v=new h(g),m=(e,{ignoreUrlParametersMatching:t=[/^utm_/],directoryIndex:n="index.html",cleanUrls:r=!0,urlManipulation:s=null}={})=>{const i=new URL(e,location);i.hash="";const c=((e,t)=>{const n=e.search.slice(1).split("&").map(e=>e.split("=")).filter(e=>t.every(t=>!t.test(e[0]))).map(e=>e.join("=")),r=new URL(e);return r.search=n.join("&"),r})(i,t);let o=[i,c];if(n&&c.pathname.endsWith("/")){const e=new URL(c);e.pathname+=n,o.push(e)}if(r){const e=new URL(c);e.pathname+=".html",o.push(e)}if(s){const e=s({url:i});o=o.concat(e)}const l=v.getCachedUrls();for(const e of o)if(-1!==l.indexOf(e.href))return e.href;return null},R={precache:e=>{v.addToCacheList(e),f||e.length<=0||(f=!0,self.addEventListener("install",e=>{e.waitUntil(v.install({event:e,plugins:w,suppressWarnings:b}))}),self.addEventListener("activate",e=>{e.waitUntil(v.activate({event:e,plugins:w}))}))},addRoute:e=>{y||(y=!0,self.addEventListener("fetch",t=>{const n=m(t.request.url,e);if(!n)return;let r=caches.open(g).then(e=>e.match(n)).then(e=>e||fetch(n));t.respondWith(r)}))},precacheAndRoute:(e,t)=>{R.precache(e),R.addRoute(t)},suppressWarnings:e=>{b=e},addPlugins:e=>{w=w.concat(e)}};return Object.assign(R,p)}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private); + +//# sourceMappingURL=workbox-precaching.prod.js.map diff --git a/workbox-v3.6.3/workbox-precaching.prod.js.map b/workbox-v3.6.3/workbox-precaching.prod.js.map new file mode 100644 index 0000000..65469ab --- /dev/null +++ b/workbox-v3.6.3/workbox-precaching.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-precaching/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.precaching=function(e,t,n,r,s){\"use strict\";try{self.workbox.v[\"workbox:precaching:3.6.3\"]=1}catch(e){}class i{constructor(e,t,n,r){this.e=e,this.t=t,this.n=n;const s=new Request(t,{credentials:\"same-origin\"});this.r=s,this.s=r?this.i(s):s}i(e){let t=e.url;const n={credentials:\"same-origin\"};if(\"cache\"in Request.prototype)n.cache=\"reload\";else{const e=new URL(t,location),n=encodeURIComponent;e.search+=(e.search?\"&\":\"\")+n(\"_workbox-cache-bust\")+\"=\"+n(this.n),t=e.toString()}return new Request(t,n)}}const c=\"revision\",o=\"url\",l=\"precached-details-models\";class a{constructor(t){const n=t.replace(/[^\\w-]/g,\"_\");this.c=new e.DBWrapper(n,2,{onupgradeneeded:this.o})}o(e){const t=e.target.result;e.oldVersion<2&&(t.objectStoreNames.contains(\"workbox-precaching\")&&t.deleteObjectStore(\"workbox-precaching\"),t.objectStoreNames.contains(l)&&t.deleteObjectStore(l)),t.createObjectStore(l)}l(e,t){var n=this;return babelHelpers.asyncToGenerator(function*(){return(yield n.a(t.t))===t.n&&!!(yield(yield caches.open(e)).match(t.r))})()}u(){var e=this;return babelHelpers.asyncToGenerator(function*(){return yield e.c.getAllMatching(l,{includeKeys:!0})})()}a(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const n=yield t.c.get(l,e);return n?n[c]:null})()}d(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.c.put(l,{[c]:e.n,[o]:e.r.url},e.t)})()}h(e){var t=this;return babelHelpers.asyncToGenerator(function*(){yield t.c.delete(l,e)})()}}const u=(d=babelHelpers.asyncToGenerator(function*(e){const t=e.clone(),n=yield\"body\"in t?Promise.resolve(t.body):t.blob();return new Response(n,{headers:t.headers,status:t.status,statusText:t.statusText})}),function(e){return d.apply(this,arguments)});var d;class h{constructor(e){this.p=t.cacheNames.getPrecacheName(e),this.f=new Map,this.y=new a(this.p)}addToCacheList(e){e.map(e=>{this.b(this.w(e))})}w(e){switch(typeof e){case\"string\":return new i(e,e,e);case\"object\":return new i(e,e.url,e.revision||e.url,!!e.revision);default:throw new n.WorkboxError(\"add-to-cache-list-unexpected-type\",{entry:e})}}b(e){const t=this.f.get(e.t);if(t){if(t.n!==e.n)throw new n.WorkboxError(\"add-to-cache-list-conflicting-entries\",{firstEntry:t.e,secondEntry:e.e})}else this.f.set(e.t,e)}install({suppressWarnings:e=!1,event:t,plugins:n}={}){var r=this;return babelHelpers.asyncToGenerator(function*(){const e=yield caches.open(r.g()),s=yield e.keys();yield Promise.all(s.map(function(t){return e.delete(t)}));const i=[],c=[];for(const e of r.f.values())(yield r.y.l(r.p,e))?c.push(e):i.push(e);return yield Promise.all(i.map(function(e){return r.m({event:t,plugins:n,precacheEntry:e})})),{updatedEntries:i,notUpdatedEntries:c}})()}activate(e={}){var t=this;return babelHelpers.asyncToGenerator(function*(){const n=yield caches.open(t.g()),r=yield n.keys();for(const i of r){const r=yield n.match(i);yield s.cacheWrapper.put({cacheName:t.p,request:i,response:r,plugins:e.plugins}),yield n.delete(i)}return t.R()})()}g(){return`${this.p}-temp`}m({precacheEntry:e,event:t,plugins:n}){var i=this;return babelHelpers.asyncToGenerator(function*(){let c=yield r.fetchWrapper.fetch({request:e.s,event:t,fetchOptions:null,plugins:n});return c.redirected&&(c=yield u(c)),yield s.cacheWrapper.put({cacheName:i.g(),request:e.r,response:c,event:t,plugins:n}),yield i.y.d(e),!0})()}R(){var e=this;return babelHelpers.asyncToGenerator(function*(){const t=[];e.f.forEach(function(e){const n=new URL(e.r.url,location).toString();t.push(n)});const[n,r]=yield Promise.all([e._(t),e.U(t)]);return{deletedCacheRequests:n,deletedRevisionDetails:r}})()}_(e){var t=this;return babelHelpers.asyncToGenerator(function*(){if(!(yield caches.has(t.p)))return[];const n=yield caches.open(t.p),r=(yield n.keys()).filter(function(t){return!e.includes(new URL(t.url,location).toString())});return yield Promise.all(r.map(function(e){return n.delete(e)})),r.map(function(e){return e.url})})()}U(e){var t=this;return babelHelpers.asyncToGenerator(function*(){const n=(yield t.y.u()).filter(function(t){const n=new URL(t.value.url,location).toString();return!e.includes(n)});return yield Promise.all(n.map(function(e){return t.y.h(e.primaryKey)})),n.map(function(e){return e.value.url})})()}getCachedUrls(){return Array.from(this.f.keys()).map(e=>new URL(e,location).href)}}var p=Object.freeze({PrecacheController:h});let f=!1,y=!1,b=!1,w=[];const g=t.cacheNames.getPrecacheName(),v=new h(g),m=(e,{ignoreUrlParametersMatching:t=[/^utm_/],directoryIndex:n=\"index.html\",cleanUrls:r=!0,urlManipulation:s=null}={})=>{const i=new URL(e,location);i.hash=\"\";const c=((e,t)=>{const n=e.search.slice(1).split(\"&\").map(e=>e.split(\"=\")).filter(e=>t.every(t=>!t.test(e[0]))).map(e=>e.join(\"=\")),r=new URL(e);return r.search=n.join(\"&\"),r})(i,t);let o=[i,c];if(n&&c.pathname.endsWith(\"/\")){const e=new URL(c);e.pathname+=n,o.push(e)}if(r){const e=new URL(c);e.pathname+=\".html\",o.push(e)}if(s){const e=s({url:i});o=o.concat(e)}const l=v.getCachedUrls();for(const e of o)if(-1!==l.indexOf(e.href))return e.href;return null},R={precache:e=>{v.addToCacheList(e),f||e.length<=0||(f=!0,self.addEventListener(\"install\",e=>{e.waitUntil(v.install({event:e,plugins:w,suppressWarnings:b}))}),self.addEventListener(\"activate\",e=>{e.waitUntil(v.activate({event:e,plugins:w}))}))},addRoute:e=>{y||(y=!0,self.addEventListener(\"fetch\",t=>{const n=m(t.request.url,e);if(!n)return;let r=caches.open(g).then(e=>e.match(n)).then(e=>e||fetch(n));t.respondWith(r)}))},precacheAndRoute:(e,t)=>{R.precache(e),R.addRoute(t)},suppressWarnings:e=>{b=e},addPlugins:e=>{w=w.concat(e)}};return Object.assign(R,p)}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private);\n"],"file":"workbox-precaching.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-range-requests.dev.js b/workbox-v3.6.3/workbox-range-requests.dev.js new file mode 100644 index 0000000..6f36438 --- /dev/null +++ b/workbox-v3.6.3/workbox-range-requests.dev.js @@ -0,0 +1,299 @@ +this.workbox = this.workbox || {}; +this.workbox.rangeRequests = (function (exports,WorkboxError_mjs,assert_mjs,logger_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:range-requests:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @param {Blob} blob A source blob. + * @param {number|null} start The offset to use as the start of the + * slice. + * @param {number|null} end The offset to use as the end of the slice. + * @return {Object} An object with `start` and `end` properties, reflecting + * the effective boundaries to use given the size of the blob. + * + * @private + */ + function calculateEffectiveBoundaries(blob, start, end) { + { + assert_mjs.assert.isInstance(blob, Blob, { + moduleName: 'workbox-range-requests', + funcName: 'calculateEffectiveBoundaries', + paramName: 'blob' + }); + } + + const blobSize = blob.size; + + if (end > blobSize || start < 0) { + throw new WorkboxError_mjs.WorkboxError('range-not-satisfiable', { + size: blobSize, + end, + start + }); + } + + let effectiveStart; + let effectiveEnd; + + if (start === null) { + effectiveStart = blobSize - end; + effectiveEnd = blobSize; + } else if (end === null) { + effectiveStart = start; + effectiveEnd = blobSize; + } else { + effectiveStart = start; + // Range values are inclusive, so add 1 to the value. + effectiveEnd = end + 1; + } + + return { + start: effectiveStart, + end: effectiveEnd + }; + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @param {string} rangeHeader A Range: header value. + * @return {Object} An object with `start` and `end` properties, reflecting + * the parsed value of the Range: header. If either the `start` or `end` are + * omitted, then `null` will be returned. + * + * @private + */ + function parseRangeHeader(rangeHeader) { + { + assert_mjs.assert.isType(rangeHeader, 'string', { + moduleName: 'workbox-range-requests', + funcName: 'parseRangeHeader', + paramName: 'rangeHeader' + }); + } + + const normalizedRangeHeader = rangeHeader.trim().toLowerCase(); + if (!normalizedRangeHeader.startsWith('bytes=')) { + throw new WorkboxError_mjs.WorkboxError('unit-must-be-bytes', { normalizedRangeHeader }); + } + + // Specifying multiple ranges separate by commas is valid syntax, but this + // library only attempts to handle a single, contiguous sequence of bytes. + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax + if (normalizedRangeHeader.includes(',')) { + throw new WorkboxError_mjs.WorkboxError('single-range-only', { normalizedRangeHeader }); + } + + const rangeParts = /(\d*)-(\d*)/.exec(normalizedRangeHeader); + // We need either at least one of the start or end values. + if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) { + throw new WorkboxError_mjs.WorkboxError('invalid-range-values', { normalizedRangeHeader }); + } + + return { + start: rangeParts[1] === '' ? null : Number(rangeParts[1]), + end: rangeParts[2] === '' ? null : Number(rangeParts[2]) + }; + } + + /** + * Given a `Request` and `Response` objects as input, this will return a + * promise for a new `Response`. + * + * @param {Request} request A request, which should contain a Range: + * header. + * @param {Response} originalResponse An original response containing the full + * content. + * @return {Promise} Either a `206 Partial Content` response, with + * the response body set to the slice of content specified by the request's + * `Range:` header, or a `416 Range Not Satisfiable` response if the + * conditions of the `Range:` header can't be met. + * + * @memberof workbox.rangeRequests + */ + let createPartialResponse = (() => { + var _ref = babelHelpers.asyncToGenerator(function* (request, originalResponse) { + try { + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-range-requests', + funcName: 'createPartialResponse', + paramName: 'request' + }); + + assert_mjs.assert.isInstance(originalResponse, Response, { + moduleName: 'workbox-range-requests', + funcName: 'createPartialResponse', + paramName: 'originalResponse' + }); + } + + const rangeHeader = request.headers.get('range'); + if (!rangeHeader) { + throw new WorkboxError_mjs.WorkboxError('no-range-header'); + } + + const boundaries = parseRangeHeader(rangeHeader); + const originalBlob = yield originalResponse.blob(); + + const effectiveBoundaries = calculateEffectiveBoundaries(originalBlob, boundaries.start, boundaries.end); + + const slicedBlob = originalBlob.slice(effectiveBoundaries.start, effectiveBoundaries.end); + const slicedBlobSize = slicedBlob.size; + + const slicedResponse = new Response(slicedBlob, { + // Status code 206 is for a Partial Content response. + // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206 + status: 206, + statusText: 'Partial Content', + headers: originalResponse.headers + }); + + slicedResponse.headers.set('Content-Length', slicedBlobSize); + slicedResponse.headers.set('Content-Range', `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` + originalBlob.size); + + return slicedResponse; + } catch (error) { + { + logger_mjs.logger.warn(`Unable to construct a partial response; returning a ` + `416 Range Not Satisfiable response instead.`); + logger_mjs.logger.groupCollapsed(`View details here.`); + logger_mjs.logger.unprefixed.log(error); + logger_mjs.logger.unprefixed.log(request); + logger_mjs.logger.unprefixed.log(originalResponse); + logger_mjs.logger.groupEnd(); + } + + return new Response('', { + status: 416, + statusText: 'Range Not Satisfiable' + }); + } + }); + + return function createPartialResponse(_x, _x2) { + return _ref.apply(this, arguments); + }; + })(); + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * The range request plugin makes it easy for a request with a 'Range' header to + * be fulfilled by a cached response. + * + * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback + * and returning the appropriate subset of the cached response body. + * + * @memberof workbox.rangeRequests + */ + class Plugin { + /** + * @param {Object} options + * @param {Request} options.request The original request, which may or may not + * contain a Range: header. + * @param {Response} options.cachedResponse The complete cached response. + * @return {Promise} If request contains a 'Range' header, then a + * new response with status 206 whose body is a subset of `cachedResponse` is + * returned. Otherwise, `cachedResponse` is returned as-is. + * + * @private + */ + cachedResponseWillBeUsed({ request, cachedResponse }) { + return babelHelpers.asyncToGenerator(function* () { + // Only return a sliced response if there's something valid in the cache, + // and there's a Range: header in the request. + if (cachedResponse && request.headers.has('range')) { + return yield createPartialResponse(request, cachedResponse); + } + + // If there was no Range: header, or if cachedResponse wasn't valid, just + // pass it through as-is. + return cachedResponse; + })(); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.createPartialResponse = createPartialResponse; + exports.Plugin = Plugin; + + return exports; + +}({},workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-range-requests.dev.js.map diff --git a/workbox-v3.6.3/workbox-range-requests.dev.js.map b/workbox-v3.6.3/workbox-range-requests.dev.js.map new file mode 100644 index 0000000..353692d --- /dev/null +++ b/workbox-v3.6.3/workbox-range-requests.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-range-requests/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.rangeRequests = (function (exports,WorkboxError_mjs,assert_mjs,logger_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:range-requests:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @param {Blob} blob A source blob.\n * @param {number|null} start The offset to use as the start of the\n * slice.\n * @param {number|null} end The offset to use as the end of the slice.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the effective boundaries to use given the size of the blob.\n *\n * @private\n */\n function calculateEffectiveBoundaries(blob, start, end) {\n {\n assert_mjs.assert.isInstance(blob, Blob, {\n moduleName: 'workbox-range-requests',\n funcName: 'calculateEffectiveBoundaries',\n paramName: 'blob'\n });\n }\n\n const blobSize = blob.size;\n\n if (end > blobSize || start < 0) {\n throw new WorkboxError_mjs.WorkboxError('range-not-satisfiable', {\n size: blobSize,\n end,\n start\n });\n }\n\n let effectiveStart;\n let effectiveEnd;\n\n if (start === null) {\n effectiveStart = blobSize - end;\n effectiveEnd = blobSize;\n } else if (end === null) {\n effectiveStart = start;\n effectiveEnd = blobSize;\n } else {\n effectiveStart = start;\n // Range values are inclusive, so add 1 to the value.\n effectiveEnd = end + 1;\n }\n\n return {\n start: effectiveStart,\n end: effectiveEnd\n };\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @param {string} rangeHeader A Range: header value.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the parsed value of the Range: header. If either the `start` or `end` are\n * omitted, then `null` will be returned.\n *\n * @private\n */\n function parseRangeHeader(rangeHeader) {\n {\n assert_mjs.assert.isType(rangeHeader, 'string', {\n moduleName: 'workbox-range-requests',\n funcName: 'parseRangeHeader',\n paramName: 'rangeHeader'\n });\n }\n\n const normalizedRangeHeader = rangeHeader.trim().toLowerCase();\n if (!normalizedRangeHeader.startsWith('bytes=')) {\n throw new WorkboxError_mjs.WorkboxError('unit-must-be-bytes', { normalizedRangeHeader });\n }\n\n // Specifying multiple ranges separate by commas is valid syntax, but this\n // library only attempts to handle a single, contiguous sequence of bytes.\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax\n if (normalizedRangeHeader.includes(',')) {\n throw new WorkboxError_mjs.WorkboxError('single-range-only', { normalizedRangeHeader });\n }\n\n const rangeParts = /(\\d*)-(\\d*)/.exec(normalizedRangeHeader);\n // We need either at least one of the start or end values.\n if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) {\n throw new WorkboxError_mjs.WorkboxError('invalid-range-values', { normalizedRangeHeader });\n }\n\n return {\n start: rangeParts[1] === '' ? null : Number(rangeParts[1]),\n end: rangeParts[2] === '' ? null : Number(rangeParts[2])\n };\n }\n\n /**\n * Given a `Request` and `Response` objects as input, this will return a\n * promise for a new `Response`.\n *\n * @param {Request} request A request, which should contain a Range:\n * header.\n * @param {Response} originalResponse An original response containing the full\n * content.\n * @return {Promise} Either a `206 Partial Content` response, with\n * the response body set to the slice of content specified by the request's\n * `Range:` header, or a `416 Range Not Satisfiable` response if the\n * conditions of the `Range:` header can't be met.\n *\n * @memberof workbox.rangeRequests\n */\n let createPartialResponse = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* (request, originalResponse) {\n try {\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'request'\n });\n\n assert_mjs.assert.isInstance(originalResponse, Response, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'originalResponse'\n });\n }\n\n const rangeHeader = request.headers.get('range');\n if (!rangeHeader) {\n throw new WorkboxError_mjs.WorkboxError('no-range-header');\n }\n\n const boundaries = parseRangeHeader(rangeHeader);\n const originalBlob = yield originalResponse.blob();\n\n const effectiveBoundaries = calculateEffectiveBoundaries(originalBlob, boundaries.start, boundaries.end);\n\n const slicedBlob = originalBlob.slice(effectiveBoundaries.start, effectiveBoundaries.end);\n const slicedBlobSize = slicedBlob.size;\n\n const slicedResponse = new Response(slicedBlob, {\n // Status code 206 is for a Partial Content response.\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206\n status: 206,\n statusText: 'Partial Content',\n headers: originalResponse.headers\n });\n\n slicedResponse.headers.set('Content-Length', slicedBlobSize);\n slicedResponse.headers.set('Content-Range', `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` + originalBlob.size);\n\n return slicedResponse;\n } catch (error) {\n {\n logger_mjs.logger.warn(`Unable to construct a partial response; returning a ` + `416 Range Not Satisfiable response instead.`);\n logger_mjs.logger.groupCollapsed(`View details here.`);\n logger_mjs.logger.unprefixed.log(error);\n logger_mjs.logger.unprefixed.log(request);\n logger_mjs.logger.unprefixed.log(originalResponse);\n logger_mjs.logger.groupEnd();\n }\n\n return new Response('', {\n status: 416,\n statusText: 'Range Not Satisfiable'\n });\n }\n });\n\n return function createPartialResponse(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n })();\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n http://www.apache.org/licenses/LICENSE-2.0\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * The range request plugin makes it easy for a request with a 'Range' header to\n * be fulfilled by a cached response.\n *\n * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback\n * and returning the appropriate subset of the cached response body.\n *\n * @memberof workbox.rangeRequests\n */\n class Plugin {\n /**\n * @param {Object} options\n * @param {Request} options.request The original request, which may or may not\n * contain a Range: header.\n * @param {Response} options.cachedResponse The complete cached response.\n * @return {Promise} If request contains a 'Range' header, then a\n * new response with status 206 whose body is a subset of `cachedResponse` is\n * returned. Otherwise, `cachedResponse` is returned as-is.\n *\n * @private\n */\n cachedResponseWillBeUsed({ request, cachedResponse }) {\n return babelHelpers.asyncToGenerator(function* () {\n // Only return a sliced response if there's something valid in the cache,\n // and there's a Range: header in the request.\n if (cachedResponse && request.headers.has('range')) {\n return yield createPartialResponse(request, cachedResponse);\n }\n\n // If there was no Range: header, or if cachedResponse wasn't valid, just\n // pass it through as-is.\n return cachedResponse;\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.createPartialResponse = createPartialResponse;\n exports.Plugin = Plugin;\n\n return exports;\n\n}({},workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-range-requests.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-range-requests.prod.js b/workbox-v3.6.3/workbox-range-requests.prod.js new file mode 100644 index 0000000..28c9903 --- /dev/null +++ b/workbox-v3.6.3/workbox-range-requests.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.rangeRequests=function(e,n){"use strict";try{self.workbox.v["workbox:range-requests:3.6.3"]=1}catch(e){}let t=(r=babelHelpers.asyncToGenerator(function*(e,t){try{const r=e.headers.get("range");if(!r)throw new n.WorkboxError("no-range-header");const s=function(e){const t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new n.WorkboxError("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new n.WorkboxError("single-range-only",{normalizedRangeHeader:t});const r=/(\d*)-(\d*)/.exec(t);if(null===r||!r[1]&&!r[2])throw new n.WorkboxError("invalid-range-values",{normalizedRangeHeader:t});return{start:""===r[1]?null:Number(r[1]),end:""===r[2]?null:Number(r[2])}}(r),a=yield t.blob(),i=function(e,t,r){const s=e.size;if(r>s||t<0)throw new n.WorkboxError("range-not-satisfiable",{size:s,end:r,start:t});let a,i;return null===t?(a=s-r,i=s):null===r?(a=t,i=s):(a=t,i=r+1),{start:a,end:i}}(a,s.start,s.end),l=a.slice(i.start,i.end),o=l.size,u=new Response(l,{status:206,statusText:"Partial Content",headers:t.headers});return u.headers.set("Content-Length",o),u.headers.set("Content-Range",`bytes ${i.start}-${i.end-1}/`+a.size),u}catch(e){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}),function(e,n){return r.apply(this,arguments)});var r;return e.createPartialResponse=t,e.Plugin=class{cachedResponseWillBeUsed({request:e,cachedResponse:n}){return babelHelpers.asyncToGenerator(function*(){return n&&e.headers.has("range")?yield t(e,n):n})()}},e}({},workbox.core._private); + +//# sourceMappingURL=workbox-range-requests.prod.js.map diff --git a/workbox-v3.6.3/workbox-range-requests.prod.js.map b/workbox-v3.6.3/workbox-range-requests.prod.js.map new file mode 100644 index 0000000..e0d9235 --- /dev/null +++ b/workbox-v3.6.3/workbox-range-requests.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-range-requests/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.rangeRequests=function(e,n){\"use strict\";try{self.workbox.v[\"workbox:range-requests:3.6.3\"]=1}catch(e){}let t=(r=babelHelpers.asyncToGenerator(function*(e,t){try{const r=e.headers.get(\"range\");if(!r)throw new n.WorkboxError(\"no-range-header\");const s=function(e){const t=e.trim().toLowerCase();if(!t.startsWith(\"bytes=\"))throw new n.WorkboxError(\"unit-must-be-bytes\",{normalizedRangeHeader:t});if(t.includes(\",\"))throw new n.WorkboxError(\"single-range-only\",{normalizedRangeHeader:t});const r=/(\\d*)-(\\d*)/.exec(t);if(null===r||!r[1]&&!r[2])throw new n.WorkboxError(\"invalid-range-values\",{normalizedRangeHeader:t});return{start:\"\"===r[1]?null:Number(r[1]),end:\"\"===r[2]?null:Number(r[2])}}(r),a=yield t.blob(),i=function(e,t,r){const s=e.size;if(r>s||t<0)throw new n.WorkboxError(\"range-not-satisfiable\",{size:s,end:r,start:t});let a,i;return null===t?(a=s-r,i=s):null===r?(a=t,i=s):(a=t,i=r+1),{start:a,end:i}}(a,s.start,s.end),l=a.slice(i.start,i.end),o=l.size,u=new Response(l,{status:206,statusText:\"Partial Content\",headers:t.headers});return u.headers.set(\"Content-Length\",o),u.headers.set(\"Content-Range\",`bytes ${i.start}-${i.end-1}/`+a.size),u}catch(e){return new Response(\"\",{status:416,statusText:\"Range Not Satisfiable\"})}}),function(e,n){return r.apply(this,arguments)});var r;return e.createPartialResponse=t,e.Plugin=class{cachedResponseWillBeUsed({request:e,cachedResponse:n}){return babelHelpers.asyncToGenerator(function*(){return n&&e.headers.has(\"range\")?yield t(e,n):n})()}},e}({},workbox.core._private);\n"],"file":"workbox-range-requests.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-routing.dev.js b/workbox-v3.6.3/workbox-routing.dev.js new file mode 100644 index 0000000..33dc4f0 --- /dev/null +++ b/workbox-v3.6.3/workbox-routing.dev.js @@ -0,0 +1,863 @@ +this.workbox = this.workbox || {}; +this.workbox.routing = (function (assert_mjs,logger_mjs,WorkboxError_mjs,getFriendlyURL_mjs,cacheNames_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:routing:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + const defaultMethod = 'GET'; + + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + var normalizeHandler = (handler => { + if (handler && typeof handler === 'object') { + { + assert_mjs.assert.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return handler; + } else { + { + assert_mjs.assert.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return { handle: handler }; + } + }); + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox.routing + */ + class Route { + /** + * Constructor for Route class. + * + * @param {workbox.routing.Route~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method) { + { + assert_mjs.assert.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + + if (method) { + assert_mjs.assert.isOneOf(method, validMethods, { paramName: 'method' }); + } + } + + // These values are referenced directly by Router so cannot be + // altered by minifification. + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method || defaultMethod; + } + } + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * RegExpRoute makes it easy to create a regular expression based + * [Route]{@link workbox.routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing} + * + * @memberof workbox.routing + * @extends workbox.routing.Route + */ + class RegExpRoute extends Route { + /** + * If the regulard expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * th ecaptured values will be passed to the + * [handler's]{@link workbox.routing.Route~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + assert_mjs.assert.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + + const match = ({ url }) => { + const result = regExp.exec(url.href); + + // Return null immediately if there's no match. + if (!result) { + return null; + } + + // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + if (url.origin !== location.origin && result.index !== 0) { + { + logger_mjs.logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + + return null; + } + + // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + return result.slice(1); + }; + + super(match, handler, method); + } + } + + /* + Copyright 2017 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * The Router can be used to process a FetchEvent through one or more + * [Routes]{@link workbox.routing.Route} responding with a Request if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox.routing + */ + class Router { + /** + * Initializes a new Router. + */ + constructor() { + // _routes will contain a mapping of HTTP method name ('GET', etc.) to an + // array of all the corresponding Route instances that are registered. + this._routes = new Map(); + } + + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {FetchEvent} event The event from a service worker's 'fetch' event + * listener. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the FetchEvent's request. If there is no + * matching route and there's no `defaultHandler`, `undefined` is returned. + */ + handleRequest(event) { + { + assert_mjs.assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'event' + }); + } + + const url = new URL(event.request.url); + if (!url.protocol.startsWith('http')) { + { + logger_mjs.logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + return; + } + + let route = null; + let handler = null; + let params = null; + let debugMessages = []; + + const result = this._findHandlerAndParams(event, url); + handler = result.handler; + params = result.params; + route = result.route; + { + if (handler) { + debugMessages.push([`Found a route to handle this request:`, route]); + + if (params) { + debugMessages.push([`Passing the following params to the route's handler:`, params]); + } + } + } + + // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + if (!handler && this._defaultHandler) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler.`); + + // This is used for debugging in logs in the case of an error. + route = '[Default Handler]'; + } + handler = this._defaultHandler; + } + + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger_mjs.logger.debug(`No route found for: ${getFriendlyURL_mjs.getFriendlyURL(url)}`); + } + return; + } + + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger_mjs.logger.groupCollapsed(`Router is responding to: ${getFriendlyURL_mjs.getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger_mjs.logger.log(...msg); + } else { + logger_mjs.logger.log(msg); + } + }); + + // The Request and Response objects contains a great deal of information, + // hide it under a group in case developers want to see it. + logger_mjs.logger.groupCollapsed(`View request details here.`); + logger_mjs.logger.unprefixed.log(event.request); + logger_mjs.logger.groupEnd(); + + logger_mjs.logger.groupEnd(); + } + + // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + let responsePromise; + try { + responsePromise = handler.handle({ url, event, params }); + } catch (err) { + responsePromise = Promise.reject(err); + } + + if (responsePromise && this._catchHandler) { + responsePromise = responsePromise.catch(err => { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger_mjs.logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL_mjs.getFriendlyURL(url)}. Falling back to Catch Handler.`); + logger_mjs.logger.unprefixed.error(`Error thrown by:`, route); + logger_mjs.logger.unprefixed.error(err); + logger_mjs.logger.groupEnd(); + } + return this._catchHandler.handle({ url, event, err }); + }); + } + + return responsePromise; + } + + /** + * Checks the incoming `event.request` against the registered routes, and if + * there's a match, returns the corresponding handler along with any params + * generated by the match. + * + * @param {FetchEvent} event + * @param {URL} url + * @return {Object} Returns an object with `handler` and `params` properties. + * They are populated if a matching route was found or `undefined` otherwise. + * + * @private + */ + _findHandlerAndParams(event, url) { + const routes = this._routes.get(event.request.method) || []; + for (const route of routes) { + let matchResult = route.match({ url, event }); + if (matchResult) { + if (Array.isArray(matchResult) && matchResult.length === 0) { + // Instead of passing an empty array in as params, use undefined. + matchResult = undefined; + } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0 || matchResult === true) { + // Instead of passing an empty object in as params, use undefined. + matchResult = undefined; + } + + // Break out of the loop and return the appropriate values as soon as + // we have a match. + return { + route, + params: matchResult, + handler: route.handler + }; + } + } + + // If we didn't have a match, then return undefined values. + return { handler: undefined, params: undefined }; + } + + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setDefaultHandler(handler) { + this._defaultHandler = normalizeHandler(handler); + } + + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + + /** + * Registers a route with the router. + * + * @param {workbox.routing.Route} route The route to register. + */ + registerRoute(route) { + { + assert_mjs.assert.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + + assert_mjs.assert.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + + assert_mjs.assert.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + + assert_mjs.assert.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler' + }); + + assert_mjs.assert.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method' + }); + } + + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } + + // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + this._routes.get(route.method).push(route); + } + + /** + * Unregisters a route with the router. + * + * @param {workbox.routing.Route} route The route to unregister. + */ + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError_mjs.WorkboxError('unregister-route-but-not-found-with-method', { + method: route.method + }); + } + + const routeIndex = this._routes.get(route.method).indexOf(route); + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError_mjs.WorkboxError('unregister-route-route-not-registered'); + } + } + } + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * NavigationRoute makes it easy to create a [Route]{@link + * workbox.routing.Route} that matches for browser + * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}. + * + * It will only match incoming Requests whose + * [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode} + * is set to `navigate`. + * + * You can optionally only apply this route to a subset of navigation requests + * by using one or both of the `blacklist` and `whitelist` parameters. + * + * @memberof workbox.routing + * @extends workbox.routing.Route + */ + class NavigationRoute extends Route { + /** + * If both `blacklist` and `whiltelist` are provided, the `blacklist` will + * take precedence and the request will not match this route. + * + * The regular expressions in `whitelist` and `blacklist` + * are matched against the concatenated + * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname} + * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search} + * portions of the requested URL. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {Object} options + * @param {Array} [options.blacklist] If any of these patterns match, + * the route will not handle the request (even if a whitelist RegExp matches). + * @param {Array} [options.whitelist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the blacklist doesn't match). + */ + constructor(handler, { whitelist = [/./], blacklist = [] } = {}) { + { + assert_mjs.assert.isArrayOfClass(whitelist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.whitelist' + }); + assert_mjs.assert.isArrayOfClass(blacklist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.blacklist' + }); + } + + super((...args) => this._match(...args), handler); + + this._whitelist = whitelist; + this._blacklist = blacklist; + } + + /** + * Routes match handler. + * + * @param {Object} options + * @param {FetchEvent} options.event + * @param {URL} options.url + * @return {boolean} + * + * @private + */ + _match({ event, url }) { + if (event.request.mode !== 'navigate') { + return false; + } + + const pathnameAndSearch = url.pathname + url.search; + + if (this._blacklist.some(regExp => regExp.test(pathnameAndSearch))) { + { + logger_mjs.logger.debug(`The navigation route is not being used, since the ` + `request URL matches both the whitelist and blacklist.`); + } + return false; + } + + if (this._whitelist.some(regExp => regExp.test(pathnameAndSearch))) { + { + logger_mjs.logger.debug(`The navigation route is being used.`); + } + return true; + } else { + { + logger_mjs.logger.debug(`The navigation route is not being used, since the ` + `URL being navigated to doesn't match the whitelist.`); + } + } + + return false; + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var publicAPI = /*#__PURE__*/Object.freeze({ + RegExpRoute: RegExpRoute, + Route: Route, + Router: Router, + NavigationRoute: NavigationRoute + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + { + assert_mjs.assert.isSwEnv('workbox-routing'); + } + + /** + * @private + */ + class DefaultRouter extends Router { + /** + * Easily register a RegExp, string, or function with a caching + * strategy to the Router. + * + * This method will generate a Route for you if needed and + * call [Router.registerRoute()]{@link + * workbox.routing.Router#registerRoute}. + * + * @param { + * RegExp| + * string| + * workbox.routing.Route~matchCallback| + * workbox.routing.Route + * } capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox.routing.Route} The generated `Route`(Useful for + * unregistering). + * + * @alias workbox.routing.registerRoute + */ + registerRoute(capture, handler, method = 'GET') { + let route; + + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location); + + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError_mjs.WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + className: 'DefaultRouter', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + + // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; + // See https://github.com/pillarjs/path-to-regexp#parameters + const wildcards = '[*:?+]'; + if (valueToCheck.match(new RegExp(`${wildcards}`))) { + logger_mjs.logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); + } + } + + const matchCallback = ({ url }) => { + { + if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger_mjs.logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + + return url.href === captureUrl.href; + }; + + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError_mjs.WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + className: 'DefaultRouter', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + + super.registerRoute(route); + return route; + } + + /** + * Register a route that will return a precached file for a navigation + * request. This is useful for the + * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}. + * + * This method will generate a + * [NavigationRoute]{@link workbox.routing.NavigationRoute} + * and call + * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute} + * . + * + * @param {string} cachedAssetUrl + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to precache cache name provided by + * [workbox-core.cacheNames]{@link workbox.core.cacheNames}. + * @param {Array} [options.blacklist=[]] If any of these patterns + * match, the route will not handle the request (even if a whitelist entry + * matches). + * @param {Array} [options.whitelist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the blacklist doesn't match). + * @return {workbox.routing.NavigationRoute} Returns the generated + * Route. + * + * @alias workbox.routing.registerNavigationRoute + */ + registerNavigationRoute(cachedAssetUrl, options = {}) { + { + assert_mjs.assert.isType(cachedAssetUrl, 'string', { + moduleName: 'workbox-routing', + className: '[default export]', + funcName: 'registerNavigationRoute', + paramName: 'cachedAssetUrl' + }); + } + + const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(options.cacheName); + const handler = () => caches.match(cachedAssetUrl, { cacheName }).then(response => { + if (response) { + return response; + } + // This shouldn't normally happen, but there are edge cases: + // https://github.com/GoogleChrome/workbox/issues/1441 + throw new Error(`The cache ${cacheName} did not have an entry for ` + `${cachedAssetUrl}.`); + }).catch(error => { + // If there's either a cache miss, or the caches.match() call threw + // an exception, then attempt to fulfill the navigation request with + // a response from the network rather than leaving the user with a + // failed navigation. + { + logger_mjs.logger.debug(`Unable to respond to navigation request with cached ` + `response: ${error.message}. Falling back to network.`); + } + + // This might still fail if the browser is offline... + return fetch(cachedAssetUrl); + }); + + const route = new NavigationRoute(handler, { + whitelist: options.whitelist, + blacklist: options.blacklist + }); + super.registerRoute(route); + + return route; + } + } + + const router = new DefaultRouter(); + + // By default, register a fetch event listener that will respond to a request + // only if there's a matching route. + self.addEventListener('fetch', event => { + const responsePromise = router.handleRequest(event); + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const finalExport = Object.assign(router, publicAPI); + + return finalExport; + +}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-routing.dev.js.map diff --git a/workbox-v3.6.3/workbox-routing.dev.js.map b/workbox-v3.6.3/workbox-routing.dev.js.map new file mode 100644 index 0000000..375e4f3 --- /dev/null +++ b/workbox-v3.6.3/workbox-routing.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-routing/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.routing = (function (assert_mjs,logger_mjs,WorkboxError_mjs,getFriendlyURL_mjs,cacheNames_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:routing:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\n const defaultMethod = 'GET';\n\n /**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\n const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT'];\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\n var normalizeHandler = (handler => {\n if (handler && typeof handler === 'object') {\n {\n assert_mjs.assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler'\n });\n }\n return handler;\n } else {\n {\n assert_mjs.assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler'\n });\n }\n return { handle: handler };\n }\n });\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof workbox.routing\n */\n class Route {\n /**\n * Constructor for Route class.\n *\n * @param {workbox.routing.Route~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method) {\n {\n assert_mjs.assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match'\n });\n\n if (method) {\n assert_mjs.assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n\n // These values are referenced directly by Router so cannot be\n // altered by minifification.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method || defaultMethod;\n }\n }\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link workbox.routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof workbox.routing\n * @extends workbox.routing.Route\n */\n class RegExpRoute extends Route {\n /**\n * If the regulard expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * th ecaptured values will be passed to the\n * [handler's]{@link workbox.routing.Route~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n {\n assert_mjs.assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern'\n });\n }\n\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n\n // Return null immediately if there's no match.\n if (!result) {\n return null;\n }\n\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if (url.origin !== location.origin && result.index !== 0) {\n {\n logger_mjs.logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`);\n }\n\n return null;\n }\n\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n\n super(match, handler, method);\n }\n }\n\n /*\n Copyright 2017 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link workbox.routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof workbox.routing\n */\n class Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n // _routes will contain a mapping of HTTP method name ('GET', etc.) to an\n // array of all the corresponding Route instances that are registered.\n this._routes = new Map();\n }\n\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {FetchEvent} event The event from a service worker's 'fetch' event\n * listener.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the FetchEvent's request. If there is no\n * matching route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest(event) {\n {\n assert_mjs.assert.isInstance(event, FetchEvent, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'event'\n });\n }\n\n const url = new URL(event.request.url);\n if (!url.protocol.startsWith('http')) {\n {\n logger_mjs.logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n\n let route = null;\n let handler = null;\n let params = null;\n let debugMessages = [];\n\n const result = this._findHandlerAndParams(event, url);\n handler = result.handler;\n params = result.params;\n route = result.route;\n {\n if (handler) {\n debugMessages.push([`Found a route to handle this request:`, route]);\n\n if (params) {\n debugMessages.push([`Passing the following params to the route's handler:`, params]);\n }\n }\n }\n\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n if (!handler && this._defaultHandler) {\n {\n debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler.`);\n\n // This is used for debugging in logs in the case of an error.\n route = '[Default Handler]';\n }\n handler = this._defaultHandler;\n }\n\n if (!handler) {\n {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger_mjs.logger.debug(`No route found for: ${getFriendlyURL_mjs.getFriendlyURL(url)}`);\n }\n return;\n }\n\n {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger_mjs.logger.groupCollapsed(`Router is responding to: ${getFriendlyURL_mjs.getFriendlyURL(url)}`);\n debugMessages.forEach(msg => {\n if (Array.isArray(msg)) {\n logger_mjs.logger.log(...msg);\n } else {\n logger_mjs.logger.log(msg);\n }\n });\n\n // The Request and Response objects contains a great deal of information,\n // hide it under a group in case developers want to see it.\n logger_mjs.logger.groupCollapsed(`View request details here.`);\n logger_mjs.logger.unprefixed.log(event.request);\n logger_mjs.logger.groupEnd();\n\n logger_mjs.logger.groupEnd();\n }\n\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, event, params });\n } catch (err) {\n responsePromise = Promise.reject(err);\n }\n\n if (responsePromise && this._catchHandler) {\n responsePromise = responsePromise.catch(err => {\n {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger_mjs.logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL_mjs.getFriendlyURL(url)}. Falling back to Catch Handler.`);\n logger_mjs.logger.unprefixed.error(`Error thrown by:`, route);\n logger_mjs.logger.unprefixed.error(err);\n logger_mjs.logger.groupEnd();\n }\n return this._catchHandler.handle({ url, event, err });\n });\n }\n\n return responsePromise;\n }\n\n /**\n * Checks the incoming `event.request` against the registered routes, and if\n * there's a match, returns the corresponding handler along with any params\n * generated by the match.\n *\n * @param {FetchEvent} event\n * @param {URL} url\n * @return {Object} Returns an object with `handler` and `params` properties.\n * They are populated if a matching route was found or `undefined` otherwise.\n *\n * @private\n */\n _findHandlerAndParams(event, url) {\n const routes = this._routes.get(event.request.method) || [];\n for (const route of routes) {\n let matchResult = route.match({ url, event });\n if (matchResult) {\n if (Array.isArray(matchResult) && matchResult.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n matchResult = undefined;\n } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0 || matchResult === true) {\n // Instead of passing an empty object in as params, use undefined.\n matchResult = undefined;\n }\n\n // Break out of the loop and return the appropriate values as soon as\n // we have a match.\n return {\n route,\n params: matchResult,\n handler: route.handler\n };\n }\n }\n\n // If we didn't have a match, then return undefined values.\n return { handler: undefined, params: undefined };\n }\n\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setDefaultHandler(handler) {\n this._defaultHandler = normalizeHandler(handler);\n }\n\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n\n /**\n * Registers a route with the router.\n *\n * @param {workbox.routing.Route} route The route to register.\n */\n registerRoute(route) {\n {\n assert_mjs.assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route'\n });\n\n assert_mjs.assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route'\n });\n\n assert_mjs.assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route'\n });\n\n assert_mjs.assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler'\n });\n\n assert_mjs.assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method'\n });\n }\n\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n\n /**\n * Unregisters a route with the router.\n *\n * @param {workbox.routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError_mjs.WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method\n });\n }\n\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n } else {\n throw new WorkboxError_mjs.WorkboxError('unregister-route-route-not-registered');\n }\n }\n }\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * NavigationRoute makes it easy to create a [Route]{@link\n * workbox.routing.Route} that matches for browser\n * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}.\n *\n * It will only match incoming Requests whose\n * [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode}\n * is set to `navigate`.\n *\n * You can optionally only apply this route to a subset of navigation requests\n * by using one or both of the `blacklist` and `whitelist` parameters.\n *\n * @memberof workbox.routing\n * @extends workbox.routing.Route\n */\n class NavigationRoute extends Route {\n /**\n * If both `blacklist` and `whiltelist` are provided, the `blacklist` will\n * take precedence and the request will not match this route.\n *\n * The regular expressions in `whitelist` and `blacklist`\n * are matched against the concatenated\n * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname}\n * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search}\n * portions of the requested URL.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {Object} options\n * @param {Array} [options.blacklist] If any of these patterns match,\n * the route will not handle the request (even if a whitelist RegExp matches).\n * @param {Array} [options.whitelist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the blacklist doesn't match).\n */\n constructor(handler, { whitelist = [/./], blacklist = [] } = {}) {\n {\n assert_mjs.assert.isArrayOfClass(whitelist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.whitelist'\n });\n assert_mjs.assert.isArrayOfClass(blacklist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.blacklist'\n });\n }\n\n super((...args) => this._match(...args), handler);\n\n this._whitelist = whitelist;\n this._blacklist = blacklist;\n }\n\n /**\n * Routes match handler.\n *\n * @param {Object} options\n * @param {FetchEvent} options.event\n * @param {URL} options.url\n * @return {boolean}\n *\n * @private\n */\n _match({ event, url }) {\n if (event.request.mode !== 'navigate') {\n return false;\n }\n\n const pathnameAndSearch = url.pathname + url.search;\n\n if (this._blacklist.some(regExp => regExp.test(pathnameAndSearch))) {\n {\n logger_mjs.logger.debug(`The navigation route is not being used, since the ` + `request URL matches both the whitelist and blacklist.`);\n }\n return false;\n }\n\n if (this._whitelist.some(regExp => regExp.test(pathnameAndSearch))) {\n {\n logger_mjs.logger.debug(`The navigation route is being used.`);\n }\n return true;\n } else {\n {\n logger_mjs.logger.debug(`The navigation route is not being used, since the ` + `URL being navigated to doesn't match the whitelist.`);\n }\n }\n\n return false;\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var publicAPI = /*#__PURE__*/Object.freeze({\n RegExpRoute: RegExpRoute,\n Route: Route,\n Router: Router,\n NavigationRoute: NavigationRoute\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n {\n assert_mjs.assert.isSwEnv('workbox-routing');\n }\n\n /**\n * @private\n */\n class DefaultRouter extends Router {\n /**\n * Easily register a RegExp, string, or function with a caching\n * strategy to the Router.\n *\n * This method will generate a Route for you if needed and\n * call [Router.registerRoute()]{@link\n * workbox.routing.Router#registerRoute}.\n *\n * @param {\n * RegExp|\n * string|\n * workbox.routing.Route~matchCallback|\n * workbox.routing.Route\n * } capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {workbox.routing.Route} The generated `Route`(Useful for\n * unregistering).\n *\n * @alias workbox.routing.registerRoute\n */\n registerRoute(capture, handler, method = 'GET') {\n let route;\n\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location);\n\n {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError_mjs.WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n className: 'DefaultRouter',\n funcName: 'registerRoute',\n paramName: 'capture'\n });\n }\n\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture;\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if (valueToCheck.match(new RegExp(`${wildcards}`))) {\n logger_mjs.logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`);\n }\n }\n\n const matchCallback = ({ url }) => {\n {\n if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {\n logger_mjs.logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`);\n }\n }\n\n return url.href === captureUrl.href;\n };\n\n route = new Route(matchCallback, handler, method);\n } else if (capture instanceof RegExp) {\n route = new RegExpRoute(capture, handler, method);\n } else if (typeof capture === 'function') {\n route = new Route(capture, handler, method);\n } else if (capture instanceof Route) {\n route = capture;\n } else {\n throw new WorkboxError_mjs.WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n className: 'DefaultRouter',\n funcName: 'registerRoute',\n paramName: 'capture'\n });\n }\n\n super.registerRoute(route);\n return route;\n }\n\n /**\n * Register a route that will return a precached file for a navigation\n * request. This is useful for the\n * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}.\n *\n * This method will generate a\n * [NavigationRoute]{@link workbox.routing.NavigationRoute}\n * and call\n * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute}\n * .\n *\n * @param {string} cachedAssetUrl\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to precache cache name provided by\n * [workbox-core.cacheNames]{@link workbox.core.cacheNames}.\n * @param {Array} [options.blacklist=[]] If any of these patterns\n * match, the route will not handle the request (even if a whitelist entry\n * matches).\n * @param {Array} [options.whitelist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the blacklist doesn't match).\n * @return {workbox.routing.NavigationRoute} Returns the generated\n * Route.\n *\n * @alias workbox.routing.registerNavigationRoute\n */\n registerNavigationRoute(cachedAssetUrl, options = {}) {\n {\n assert_mjs.assert.isType(cachedAssetUrl, 'string', {\n moduleName: 'workbox-routing',\n className: '[default export]',\n funcName: 'registerNavigationRoute',\n paramName: 'cachedAssetUrl'\n });\n }\n\n const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(options.cacheName);\n const handler = () => caches.match(cachedAssetUrl, { cacheName }).then(response => {\n if (response) {\n return response;\n }\n // This shouldn't normally happen, but there are edge cases:\n // https://github.com/GoogleChrome/workbox/issues/1441\n throw new Error(`The cache ${cacheName} did not have an entry for ` + `${cachedAssetUrl}.`);\n }).catch(error => {\n // If there's either a cache miss, or the caches.match() call threw\n // an exception, then attempt to fulfill the navigation request with\n // a response from the network rather than leaving the user with a\n // failed navigation.\n {\n logger_mjs.logger.debug(`Unable to respond to navigation request with cached ` + `response: ${error.message}. Falling back to network.`);\n }\n\n // This might still fail if the browser is offline...\n return fetch(cachedAssetUrl);\n });\n\n const route = new NavigationRoute(handler, {\n whitelist: options.whitelist,\n blacklist: options.blacklist\n });\n super.registerRoute(route);\n\n return route;\n }\n }\n\n const router = new DefaultRouter();\n\n // By default, register a fetch event listener that will respond to a request\n // only if there's a matching route.\n self.addEventListener('fetch', event => {\n const responsePromise = router.handleRequest(event);\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const finalExport = Object.assign(router, publicAPI);\n\n return finalExport;\n\n}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-routing.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-routing.prod.js b/workbox-v3.6.3/workbox-routing.prod.js new file mode 100644 index 0000000..250d5c7 --- /dev/null +++ b/workbox-v3.6.3/workbox-routing.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.routing=function(t,e){"use strict";try{self.workbox.v["workbox:routing:3.6.3"]=1}catch(t){}const r="GET";var s=t=>t&&"object"==typeof t?t:{handle:t};class n{constructor(t,e,n){this.handler=s(e),this.match=t,this.method=n||r}}class o extends n{constructor(t,e,r){super(({url:e})=>{const r=t.exec(e.href);return r?e.origin!==location.origin&&0!==r.index?null:r.slice(1):null},e,r)}}class i{constructor(){this.t=new Map}handleRequest(t){const e=new URL(t.request.url);if(!e.protocol.startsWith("http"))return;let r=null,s=null,n=null;const o=this.e(t,e);if(s=o.handler,n=o.params,r=o.route,!s&&this.r&&(s=this.r),!s)return;let i;try{i=s.handle({url:e,event:t,params:n})}catch(t){i=Promise.reject(t)}return i&&this.s&&(i=i.catch(r=>this.s.handle({url:e,event:t,err:r}))),i}e(t,e){const r=this.t.get(t.request.method)||[];for(const s of r){let r=s.match({url:e,event:t});if(r)return Array.isArray(r)&&0===r.length?r=void 0:(r.constructor===Object&&0===Object.keys(r).length||!0===r)&&(r=void 0),{route:s,params:r,handler:s.handler}}return{handler:void 0,params:void 0}}setDefaultHandler(t){this.r=s(t)}setCatchHandler(t){this.s=s(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(e){if(!this.t.has(e.method))throw new t.WorkboxError("unregister-route-but-not-found-with-method",{method:e.method});const r=this.t.get(e.method).indexOf(e);if(!(r>-1))throw new t.WorkboxError("unregister-route-route-not-registered");this.t.get(e.method).splice(r,1)}}class u extends n{constructor(t,{whitelist:e=[/./],blacklist:r=[]}={}){super((...t)=>this.n(...t),t),this.o=e,this.i=r}n({event:t,url:e}){if("navigate"!==t.request.mode)return!1;const r=e.pathname+e.search;return!this.i.some(t=>t.test(r))&&!!this.o.some(t=>t.test(r))}}var a=Object.freeze({RegExpRoute:o,Route:n,Router:i,NavigationRoute:u});const c=new class extends i{registerRoute(e,r,s="GET"){let i;if("string"==typeof e){const t=new URL(e,location);i=new n(({url:e})=>e.href===t.href,r,s)}else if(e instanceof RegExp)i=new o(e,r,s);else if("function"==typeof e)i=new n(e,r,s);else{if(!(e instanceof n))throw new t.WorkboxError("unsupported-route-type",{moduleName:"workbox-routing",className:"DefaultRouter",funcName:"registerRoute",paramName:"capture"});i=e}return super.registerRoute(i),i}registerNavigationRoute(t,r={}){const s=e.cacheNames.getPrecacheName(r.cacheName),n=new u(()=>caches.match(t,{cacheName:s}).then(e=>{if(e)return e;throw new Error(`The cache ${s} did not have an entry for `+`${t}.`)}).catch(e=>fetch(t)),{whitelist:r.whitelist,blacklist:r.blacklist});return super.registerRoute(n),n}};return self.addEventListener("fetch",t=>{const e=c.handleRequest(t);e&&t.respondWith(e)}),Object.assign(c,a)}(workbox.core._private,workbox.core._private); + +//# sourceMappingURL=workbox-routing.prod.js.map diff --git a/workbox-v3.6.3/workbox-routing.prod.js.map b/workbox-v3.6.3/workbox-routing.prod.js.map new file mode 100644 index 0000000..aa27f1a --- /dev/null +++ b/workbox-v3.6.3/workbox-routing.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-routing/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.routing=function(t,e){\"use strict\";try{self.workbox.v[\"workbox:routing:3.6.3\"]=1}catch(t){}const r=\"GET\";var s=t=>t&&\"object\"==typeof t?t:{handle:t};class n{constructor(t,e,n){this.handler=s(e),this.match=t,this.method=n||r}}class o extends n{constructor(t,e,r){super(({url:e})=>{const r=t.exec(e.href);return r?e.origin!==location.origin&&0!==r.index?null:r.slice(1):null},e,r)}}class i{constructor(){this.t=new Map}handleRequest(t){const e=new URL(t.request.url);if(!e.protocol.startsWith(\"http\"))return;let r=null,s=null,n=null;const o=this.e(t,e);if(s=o.handler,n=o.params,r=o.route,!s&&this.r&&(s=this.r),!s)return;let i;try{i=s.handle({url:e,event:t,params:n})}catch(t){i=Promise.reject(t)}return i&&this.s&&(i=i.catch(r=>this.s.handle({url:e,event:t,err:r}))),i}e(t,e){const r=this.t.get(t.request.method)||[];for(const s of r){let r=s.match({url:e,event:t});if(r)return Array.isArray(r)&&0===r.length?r=void 0:(r.constructor===Object&&0===Object.keys(r).length||!0===r)&&(r=void 0),{route:s,params:r,handler:s.handler}}return{handler:void 0,params:void 0}}setDefaultHandler(t){this.r=s(t)}setCatchHandler(t){this.s=s(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(e){if(!this.t.has(e.method))throw new t.WorkboxError(\"unregister-route-but-not-found-with-method\",{method:e.method});const r=this.t.get(e.method).indexOf(e);if(!(r>-1))throw new t.WorkboxError(\"unregister-route-route-not-registered\");this.t.get(e.method).splice(r,1)}}class u extends n{constructor(t,{whitelist:e=[/./],blacklist:r=[]}={}){super((...t)=>this.n(...t),t),this.o=e,this.i=r}n({event:t,url:e}){if(\"navigate\"!==t.request.mode)return!1;const r=e.pathname+e.search;return!this.i.some(t=>t.test(r))&&!!this.o.some(t=>t.test(r))}}var a=Object.freeze({RegExpRoute:o,Route:n,Router:i,NavigationRoute:u});const c=new class extends i{registerRoute(e,r,s=\"GET\"){let i;if(\"string\"==typeof e){const t=new URL(e,location);i=new n(({url:e})=>e.href===t.href,r,s)}else if(e instanceof RegExp)i=new o(e,r,s);else if(\"function\"==typeof e)i=new n(e,r,s);else{if(!(e instanceof n))throw new t.WorkboxError(\"unsupported-route-type\",{moduleName:\"workbox-routing\",className:\"DefaultRouter\",funcName:\"registerRoute\",paramName:\"capture\"});i=e}return super.registerRoute(i),i}registerNavigationRoute(t,r={}){const s=e.cacheNames.getPrecacheName(r.cacheName),n=new u(()=>caches.match(t,{cacheName:s}).then(e=>{if(e)return e;throw new Error(`The cache ${s} did not have an entry for `+`${t}.`)}).catch(e=>fetch(t)),{whitelist:r.whitelist,blacklist:r.blacklist});return super.registerRoute(n),n}};return self.addEventListener(\"fetch\",t=>{const e=c.handleRequest(t);e&&t.respondWith(e)}),Object.assign(c,a)}(workbox.core._private,workbox.core._private);\n"],"file":"workbox-routing.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-strategies.dev.js b/workbox-v3.6.3/workbox-strategies.dev.js new file mode 100644 index 0000000..30e9210 --- /dev/null +++ b/workbox-v3.6.3/workbox-strategies.dev.js @@ -0,0 +1,1172 @@ +this.workbox = this.workbox || {}; +this.workbox.strategies = (function (logger_mjs,assert_mjs,cacheNames_mjs,cacheWrapper_mjs,fetchWrapper_mjs,getFriendlyURL_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:strategies:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const getFriendlyURL = url => { + const urlObj = new URL(url, location); + if (urlObj.origin === location.origin) { + return urlObj.pathname; + } + return urlObj.href; + }; + + var messages = { + strategyStart: (strategyName, request) => `Using ${strategyName} to ` + `respond to '${getFriendlyURL(request.url)}'`, + printFinalResponse: response => { + if (response) { + logger_mjs.logger.groupCollapsed(`View the final response here.`); + logger_mjs.logger.unprefixed.log(response); + logger_mjs.logger.groupEnd(); + } + } + }; + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network} + * request strategy. + * + * A cache first strategy is useful for assets that have been revisioned, + * such as URLs like `/styles/example.a8f5f1.css`, since they + * can be cached for long periods of time. + * + * @memberof workbox.strategies + */ + class CacheFirst { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + this._fetchOptions = options.fetchOptions || null; + this._matchOptions = options.matchOptions || null; + } + + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {FetchEvent} options.event The fetch event to run this strategy + * against. + * @return {Promise} + */ + handle({ event }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-strategies', + className: 'CacheFirst', + funcName: 'handle', + paramName: 'event' + }); + } + + return _this.makeRequest({ + event, + request: event.request + }); + })(); + } + + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + makeRequest({ event, request }) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + const logs = []; + + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'CacheFirst', + funcName: 'makeRequest', + paramName: 'request' + }); + } + + let response = yield cacheWrapper_mjs.cacheWrapper.match({ + cacheName: _this2._cacheName, + request, + event, + matchOptions: _this2._matchOptions, + plugins: _this2._plugins + }); + + let error; + if (!response) { + { + logs.push(`No response found in the '${_this2._cacheName}' cache. ` + `Will respond with a network request.`); + } + try { + response = yield _this2._getFromNetwork(request, event); + } catch (err) { + error = err; + } + + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network.`); + } + } + } else { + { + logs.push(`Found a cached response in the '${_this2._cacheName}' cache.`); + } + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheFirst', request)); + for (let log of logs) { + logger_mjs.logger.log(log); + } + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + if (error) { + // Don't swallow error as we'll want it to throw and enable catch + // handlers in router. + throw error; + } + + return response; + })(); + } + + /** + * Handles the network and cache part of CacheFirst. + * + * @param {Request} request + * @param {FetchEvent} [event] + * @return {Promise} + * + * @private + */ + _getFromNetwork(request, event) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + const response = yield fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: _this3._fetchOptions, + plugins: _this3._plugins + }); + + // Keep the service worker while we put the request to the cache + const responseClone = response.clone(); + const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({ + cacheName: _this3._cacheName, + request, + response: responseClone, + event, + plugins: _this3._plugins + }); + + if (event) { + try { + event.waitUntil(cachePutPromise); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`); + } + } + } + + return response; + })(); + } + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * An implementation of a + * [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only} + * request strategy. + * + * This class is useful if you want to take advantage of any [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. + * + * @memberof workbox.strategies + */ + class CacheOnly { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + this._matchOptions = options.matchOptions || null; + } + + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {FetchEvent} options.event The fetch event to run this strategy + * against. + * @return {Promise} + */ + handle({ event }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-strategies', + className: 'CacheOnly', + funcName: 'handle', + paramName: 'event' + }); + } + + return _this.makeRequest({ + event, + request: event.request + }); + })(); + } + + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + makeRequest({ event, request }) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'CacheOnly', + funcName: 'makeRequest', + paramName: 'request' + }); + } + + const response = yield cacheWrapper_mjs.cacheWrapper.match({ + cacheName: _this2._cacheName, + request, + event, + matchOptions: _this2._matchOptions, + plugins: _this2._plugins + }); + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheOnly', request)); + if (response) { + logger_mjs.logger.log(`Found a cached response in the '${_this2._cacheName}'` + ` cache.`); + messages.printFinalResponse(response); + } else { + logger_mjs.logger.log(`No response found in the '${_this2._cacheName}' cache.`); + } + logger_mjs.logger.groupEnd(); + } + + return response; + })(); + } + } + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var cacheOkAndOpaquePlugin = { + /** + * Return return a response (i.e. allow caching) if the + * response is ok (i.e. 200) or is opaque. + * + * @param {Object} options + * @param {Response} options.response + * @return {Response|null} + * + * @private + */ + cacheWillUpdate: ({ response }) => { + if (response.ok || response.status === 0) { + return response; + } + return null; + } + }; + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * An implementation of a + * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache} + * request strategy. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS]{@link https://enable-cors.org/}. + * + * @memberof workbox.strategies + */ + class NetworkFirst { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + * @param {number} options.networkTimeoutSeconds If set, any network requests + * that fail to respond within the timeout will fallback to the cache. + * + * This option can be used to combat + * "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" + * scenarios. + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + + if (options.plugins) { + let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); + this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; + } else { + // No plugins passed in, use the default plugin. + this._plugins = [cacheOkAndOpaquePlugin]; + } + + this._networkTimeoutSeconds = options.networkTimeoutSeconds; + { + if (this._networkTimeoutSeconds) { + assert_mjs.assert.isType(this._networkTimeoutSeconds, 'number', { + moduleName: 'workbox-strategies', + className: 'NetworkFirst', + funcName: 'constructor', + paramName: 'networkTimeoutSeconds' + }); + } + } + + this._fetchOptions = options.fetchOptions || null; + this._matchOptions = options.matchOptions || null; + } + + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {FetchEvent} options.event The fetch event to run this strategy + * against. + * @return {Promise} + */ + handle({ event }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-strategies', + className: 'NetworkFirst', + funcName: 'handle', + paramName: 'event' + }); + } + + return _this.makeRequest({ + event, + request: event.request + }); + })(); + } + + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + makeRequest({ event, request }) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + const logs = []; + + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'NetworkFirst', + funcName: 'handle', + paramName: 'makeRequest' + }); + } + + const promises = []; + let timeoutId; + + if (_this2._networkTimeoutSeconds) { + const { id, promise } = _this2._getTimeoutPromise({ request, event, logs }); + timeoutId = id; + promises.push(promise); + } + + const networkPromise = _this2._getNetworkPromise({ timeoutId, request, event, logs }); + promises.push(networkPromise); + + // Promise.race() will resolve as soon as the first promise resolves. + let response = yield Promise.race(promises); + // If Promise.race() resolved with null, it might be due to a network + // timeout + a cache miss. If that were to happen, we'd rather wait until + // the networkPromise resolves instead of returning null. + // Note that it's fine to await an already-resolved promise, so we don't + // have to check to see if it's still "in flight". + if (!response) { + response = yield networkPromise; + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkFirst', request)); + for (let log of logs) { + logger_mjs.logger.log(log); + } + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + return response; + })(); + } + + /** + * @param {Object} options + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs array + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + _getTimeoutPromise({ request, logs, event }) { + var _this3 = this; + + let timeoutId; + const timeoutPromise = new Promise(resolve => { + const onNetworkTimeout = (() => { + var _ref = babelHelpers.asyncToGenerator(function* () { + { + logs.push(`Timing out the network response at ` + `${_this3._networkTimeoutSeconds} seconds.`); + } + + resolve((yield _this3._respondFromCache({ request, event }))); + }); + + return function onNetworkTimeout() { + return _ref.apply(this, arguments); + }; + })(); + + timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); + }); + + return { + promise: timeoutPromise, + id: timeoutId + }; + } + + /** + * @param {Object} options + * @param {number|undefined} options.timeoutId + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs Array. + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + _getNetworkPromise({ timeoutId, request, logs, event }) { + var _this4 = this; + + return babelHelpers.asyncToGenerator(function* () { + let error; + let response; + try { + response = yield fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: _this4._fetchOptions, + plugins: _this4._plugins + }); + } catch (err) { + error = err; + } + + if (timeoutId) { + clearTimeout(timeoutId); + } + + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); + } + } + + if (error || !response) { + response = yield _this4._respondFromCache({ request, event }); + { + if (response) { + logs.push(`Found a cached response in the '${_this4._cacheName}'` + ` cache.`); + } else { + logs.push(`No response found in the '${_this4._cacheName}' cache.`); + } + } + } else { + // Keep the service worker alive while we put the request in the cache + const responseClone = response.clone(); + const cachePut = cacheWrapper_mjs.cacheWrapper.put({ + cacheName: _this4._cacheName, + request, + response: responseClone, + event, + plugins: _this4._plugins + }); + + if (event) { + try { + // The event has been responded to so we can keep the SW alive to + // respond to the request + event.waitUntil(cachePut); + } catch (err) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`); + } + } + } + } + + return response; + })(); + } + + /** + * Used if the network timeouts or fails to make the request. + * + * @param {Object} options + * @param {Request} request The request to match in the cache + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + _respondFromCache({ event, request }) { + return cacheWrapper_mjs.cacheWrapper.match({ + cacheName: this._cacheName, + request, + event, + matchOptions: this._matchOptions, + plugins: this._plugins + }); + } + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * An implementation of a + * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only} + * request strategy. + * + * This class is useful if you want to take advantage of any [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. + * + * @memberof workbox.strategies + */ + class NetworkOnly { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + this._fetchOptions = options.fetchOptions || null; + } + + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {FetchEvent} options.event The fetch event to run this strategy + * against. + * @return {Promise} + */ + handle({ event }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-strategies', + className: 'NetworkOnly', + funcName: 'handle', + paramName: 'event' + }); + } + + return _this.makeRequest({ + event, + request: event.request + }); + })(); + } + + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + makeRequest({ event, request }) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'NetworkOnly', + funcName: 'handle', + paramName: 'request' + }); + } + + let error; + let response; + try { + response = yield fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: _this2._fetchOptions, + plugins: _this2._plugins + }); + } catch (err) { + error = err; + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkOnly', request)); + if (response) { + logger_mjs.logger.log(`Got response from network.`); + } else { + logger_mjs.logger.log(`Unable to get a response from the network.`); + } + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + // If there was an error thrown, re-throw it to ensure the Routers + // catch handler is triggered. + if (error) { + throw error; + } + + return response; + })(); + } + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * An implementation of a + * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate} + * request strategy. + * + * Resources are requested from both the cache and the network in parallel. + * The strategy will respond with the cached version if available, otherwise + * wait for the network response. The cache is updated with the network response + * with each successful request. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS]{@link https://enable-cors.org/}. + * + * @memberof workbox.strategies + */ + class StaleWhileRevalidate { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + + if (options.plugins) { + let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); + this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; + } else { + // No plugins passed in, use the default plugin. + this._plugins = [cacheOkAndOpaquePlugin]; + } + + this._fetchOptions = options.fetchOptions || null; + this._matchOptions = options.matchOptions || null; + } + + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {FetchEvent} options.event The fetch event to run this strategy + * against. + * @return {Promise} + */ + handle({ event }) { + var _this = this; + + return babelHelpers.asyncToGenerator(function* () { + { + assert_mjs.assert.isInstance(event, FetchEvent, { + moduleName: 'workbox-strategies', + className: 'StaleWhileRevalidate', + funcName: 'handle', + paramName: 'event' + }); + } + + return _this.makeRequest({ + event, + request: event.request + }); + })(); + } + + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + makeRequest({ event, request }) { + var _this2 = this; + + return babelHelpers.asyncToGenerator(function* () { + const logs = []; + + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'StaleWhileRevalidate', + funcName: 'handle', + paramName: 'request' + }); + } + + const fetchAndCachePromise = _this2._getFromNetwork({ request, event }); + + let response = yield cacheWrapper_mjs.cacheWrapper.match({ + cacheName: _this2._cacheName, + request, + event, + matchOptions: _this2._matchOptions, + plugins: _this2._plugins + }); + + if (response) { + { + logs.push(`Found a cached response in the '${_this2._cacheName}'` + ` cache. Will update with the network response in the background.`); + } + + if (event) { + try { + event.waitUntil(fetchAndCachePromise); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`); + } + } + } + } else { + { + logs.push(`No response found in the '${_this2._cacheName}' cache. ` + `Will wait for the network response.`); + } + response = yield fetchAndCachePromise; + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('StaleWhileRevalidate', request)); + for (let log of logs) { + logger_mjs.logger.log(log); + } + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + return response; + })(); + } + + /** + * @param {Object} options + * @param {Request} options.request + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + _getFromNetwork({ request, event }) { + var _this3 = this; + + return babelHelpers.asyncToGenerator(function* () { + const response = yield fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: _this3._fetchOptions, + plugins: _this3._plugins + }); + + const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({ + cacheName: _this3._cacheName, + request, + response: response.clone(), + event, + plugins: _this3._plugins + }); + + if (event) { + try { + event.waitUntil(cachePutPromise); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`); + } + } + } + + return response; + })(); + } + } + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + var publicAPI = /*#__PURE__*/Object.freeze({ + CacheFirst: CacheFirst, + CacheOnly: CacheOnly, + NetworkFirst: NetworkFirst, + NetworkOnly: NetworkOnly, + StaleWhileRevalidate: StaleWhileRevalidate + }); + + /* + Copyright 2016 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * @function workbox.strategies.cacheFirst + * @param {Object} options See the {@link workbox.strategies.CacheFirst} + * constructor for more info. + */ + + /** + * @function workbox.strategies.cacheOnly + * @param {Object} options See the {@link workbox.strategies.CacheOnly} + * constructor for more info. + */ + + /** + * @function workbox.strategies.networkFirst + * @param {Object} options See the {@link workbox.strategies.NetworkFirst} + * constructor for more info. + */ + + /** + * @function workbox.strategies.networkOnly + * @param {Object} options See the {@link workbox.strategies.NetworkOnly} + * constructor for more info. + */ + + /** + * @function workbox.strategies.staleWhileRevalidate + * @param {Object} options See the + * {@link workbox.strategies.StaleWhileRevalidate} constructor for more info. + */ + + const mapping = { + cacheFirst: CacheFirst, + cacheOnly: CacheOnly, + networkFirst: NetworkFirst, + networkOnly: NetworkOnly, + staleWhileRevalidate: StaleWhileRevalidate + }; + + const defaultExport = {}; + Object.keys(mapping).forEach(keyName => { + defaultExport[keyName] = (options = {}) => { + const StrategyClass = mapping[keyName]; + return new StrategyClass(Object.assign(options)); + }; + }); + + /* + Copyright 2017 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + const finalExport = Object.assign(defaultExport, publicAPI); + + return finalExport; + +}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-strategies.dev.js.map diff --git a/workbox-v3.6.3/workbox-strategies.dev.js.map b/workbox-v3.6.3/workbox-strategies.dev.js.map new file mode 100644 index 0000000..b865587 --- /dev/null +++ b/workbox-v3.6.3/workbox-strategies.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-strategies/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.strategies = (function (logger_mjs,assert_mjs,cacheNames_mjs,cacheWrapper_mjs,fetchWrapper_mjs,getFriendlyURL_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:strategies:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const getFriendlyURL = url => {\n const urlObj = new URL(url, location);\n if (urlObj.origin === location.origin) {\n return urlObj.pathname;\n }\n return urlObj.href;\n };\n\n var messages = {\n strategyStart: (strategyName, request) => `Using ${strategyName} to ` + `respond to '${getFriendlyURL(request.url)}'`,\n printFinalResponse: response => {\n if (response) {\n logger_mjs.logger.groupCollapsed(`View the final response here.`);\n logger_mjs.logger.unprefixed.log(response);\n logger_mjs.logger.groupEnd();\n }\n }\n };\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network}\n * request strategy.\n *\n * A cache first strategy is useful for assets that have been revisioned,\n * such as URLs like `/styles/example.a8f5f1.css`, since they\n * can be cached for long periods of time.\n *\n * @memberof workbox.strategies\n */\n class CacheFirst {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {FetchEvent} options.event The fetch event to run this strategy\n * against.\n * @return {Promise}\n */\n handle({ event }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isInstance(event, FetchEvent, {\n moduleName: 'workbox-strategies',\n className: 'CacheFirst',\n funcName: 'handle',\n paramName: 'event'\n });\n }\n\n return _this.makeRequest({\n event,\n request: event.request\n });\n })();\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n makeRequest({ event, request }) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'CacheFirst',\n funcName: 'makeRequest',\n paramName: 'request'\n });\n }\n\n let response = yield cacheWrapper_mjs.cacheWrapper.match({\n cacheName: _this2._cacheName,\n request,\n event,\n matchOptions: _this2._matchOptions,\n plugins: _this2._plugins\n });\n\n let error;\n if (!response) {\n {\n logs.push(`No response found in the '${_this2._cacheName}' cache. ` + `Will respond with a network request.`);\n }\n try {\n response = yield _this2._getFromNetwork(request, event);\n } catch (err) {\n error = err;\n }\n\n {\n if (response) {\n logs.push(`Got response from network.`);\n } else {\n logs.push(`Unable to get a response from the network.`);\n }\n }\n } else {\n {\n logs.push(`Found a cached response in the '${_this2._cacheName}' cache.`);\n }\n }\n\n {\n logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheFirst', request));\n for (let log of logs) {\n logger_mjs.logger.log(log);\n }\n messages.printFinalResponse(response);\n logger_mjs.logger.groupEnd();\n }\n\n if (error) {\n // Don't swallow error as we'll want it to throw and enable catch\n // handlers in router.\n throw error;\n }\n\n return response;\n })();\n }\n\n /**\n * Handles the network and cache part of CacheFirst.\n *\n * @param {Request} request\n * @param {FetchEvent} [event]\n * @return {Promise}\n *\n * @private\n */\n _getFromNetwork(request, event) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const response = yield fetchWrapper_mjs.fetchWrapper.fetch({\n request,\n event,\n fetchOptions: _this3._fetchOptions,\n plugins: _this3._plugins\n });\n\n // Keep the service worker while we put the request to the cache\n const responseClone = response.clone();\n const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({\n cacheName: _this3._cacheName,\n request,\n response: responseClone,\n event,\n plugins: _this3._plugins\n });\n\n if (event) {\n try {\n event.waitUntil(cachePutPromise);\n } catch (error) {\n {\n logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n\n return response;\n })();\n }\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * An implementation of a\n * [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * @memberof workbox.strategies\n */\n class CacheOnly {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {FetchEvent} options.event The fetch event to run this strategy\n * against.\n * @return {Promise}\n */\n handle({ event }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isInstance(event, FetchEvent, {\n moduleName: 'workbox-strategies',\n className: 'CacheOnly',\n funcName: 'handle',\n paramName: 'event'\n });\n }\n\n return _this.makeRequest({\n event,\n request: event.request\n });\n })();\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n makeRequest({ event, request }) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'CacheOnly',\n funcName: 'makeRequest',\n paramName: 'request'\n });\n }\n\n const response = yield cacheWrapper_mjs.cacheWrapper.match({\n cacheName: _this2._cacheName,\n request,\n event,\n matchOptions: _this2._matchOptions,\n plugins: _this2._plugins\n });\n\n {\n logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheOnly', request));\n if (response) {\n logger_mjs.logger.log(`Found a cached response in the '${_this2._cacheName}'` + ` cache.`);\n messages.printFinalResponse(response);\n } else {\n logger_mjs.logger.log(`No response found in the '${_this2._cacheName}' cache.`);\n }\n logger_mjs.logger.groupEnd();\n }\n\n return response;\n })();\n }\n }\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var cacheOkAndOpaquePlugin = {\n /**\n * Return return a response (i.e. allow caching) if the\n * response is ok (i.e. 200) or is opaque.\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: ({ response }) => {\n if (response.ok || response.status === 0) {\n return response;\n }\n return null;\n }\n };\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * @memberof workbox.strategies\n */\n class NetworkFirst {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} options.networkTimeoutSeconds If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName);\n\n if (options.plugins) {\n let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate);\n this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];\n } else {\n // No plugins passed in, use the default plugin.\n this._plugins = [cacheOkAndOpaquePlugin];\n }\n\n this._networkTimeoutSeconds = options.networkTimeoutSeconds;\n {\n if (this._networkTimeoutSeconds) {\n assert_mjs.assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds'\n });\n }\n }\n\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {FetchEvent} options.event The fetch event to run this strategy\n * against.\n * @return {Promise}\n */\n handle({ event }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isInstance(event, FetchEvent, {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'handle',\n paramName: 'event'\n });\n }\n\n return _this.makeRequest({\n event,\n request: event.request\n });\n })();\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n makeRequest({ event, request }) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'handle',\n paramName: 'makeRequest'\n });\n }\n\n const promises = [];\n let timeoutId;\n\n if (_this2._networkTimeoutSeconds) {\n const { id, promise } = _this2._getTimeoutPromise({ request, event, logs });\n timeoutId = id;\n promises.push(promise);\n }\n\n const networkPromise = _this2._getNetworkPromise({ timeoutId, request, event, logs });\n promises.push(networkPromise);\n\n // Promise.race() will resolve as soon as the first promise resolves.\n let response = yield Promise.race(promises);\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n if (!response) {\n response = yield networkPromise;\n }\n\n {\n logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkFirst', request));\n for (let log of logs) {\n logger_mjs.logger.log(log);\n }\n messages.printFinalResponse(response);\n logger_mjs.logger.groupEnd();\n }\n\n return response;\n })();\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, event }) {\n var _this3 = this;\n\n let timeoutId;\n const timeoutPromise = new Promise(resolve => {\n const onNetworkTimeout = (() => {\n var _ref = babelHelpers.asyncToGenerator(function* () {\n {\n logs.push(`Timing out the network response at ` + `${_this3._networkTimeoutSeconds} seconds.`);\n }\n\n resolve((yield _this3._respondFromCache({ request, event })));\n });\n\n return function onNetworkTimeout() {\n return _ref.apply(this, arguments);\n };\n })();\n\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n\n return {\n promise: timeoutPromise,\n id: timeoutId\n };\n }\n\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _getNetworkPromise({ timeoutId, request, logs, event }) {\n var _this4 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n let error;\n let response;\n try {\n response = yield fetchWrapper_mjs.fetchWrapper.fetch({\n request,\n event,\n fetchOptions: _this4._fetchOptions,\n plugins: _this4._plugins\n });\n } catch (err) {\n error = err;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n {\n if (response) {\n logs.push(`Got response from network.`);\n } else {\n logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`);\n }\n }\n\n if (error || !response) {\n response = yield _this4._respondFromCache({ request, event });\n {\n if (response) {\n logs.push(`Found a cached response in the '${_this4._cacheName}'` + ` cache.`);\n } else {\n logs.push(`No response found in the '${_this4._cacheName}' cache.`);\n }\n }\n } else {\n // Keep the service worker alive while we put the request in the cache\n const responseClone = response.clone();\n const cachePut = cacheWrapper_mjs.cacheWrapper.put({\n cacheName: _this4._cacheName,\n request,\n response: responseClone,\n event,\n plugins: _this4._plugins\n });\n\n if (event) {\n try {\n // The event has been responded to so we can keep the SW alive to\n // respond to the request\n event.waitUntil(cachePut);\n } catch (err) {\n {\n logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n }\n\n return response;\n })();\n }\n\n /**\n * Used if the network timeouts or fails to make the request.\n *\n * @param {Object} options\n * @param {Request} request The request to match in the cache\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _respondFromCache({ event, request }) {\n return cacheWrapper_mjs.cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins\n });\n }\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * An implementation of a\n * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * @memberof workbox.strategies\n */\n class NetworkOnly {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n */\n constructor(options = {}) {\n this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._fetchOptions = options.fetchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {FetchEvent} options.event The fetch event to run this strategy\n * against.\n * @return {Promise}\n */\n handle({ event }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isInstance(event, FetchEvent, {\n moduleName: 'workbox-strategies',\n className: 'NetworkOnly',\n funcName: 'handle',\n paramName: 'event'\n });\n }\n\n return _this.makeRequest({\n event,\n request: event.request\n });\n })();\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n makeRequest({ event, request }) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'NetworkOnly',\n funcName: 'handle',\n paramName: 'request'\n });\n }\n\n let error;\n let response;\n try {\n response = yield fetchWrapper_mjs.fetchWrapper.fetch({\n request,\n event,\n fetchOptions: _this2._fetchOptions,\n plugins: _this2._plugins\n });\n } catch (err) {\n error = err;\n }\n\n {\n logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkOnly', request));\n if (response) {\n logger_mjs.logger.log(`Got response from network.`);\n } else {\n logger_mjs.logger.log(`Unable to get a response from the network.`);\n }\n messages.printFinalResponse(response);\n logger_mjs.logger.groupEnd();\n }\n\n // If there was an error thrown, re-throw it to ensure the Routers\n // catch handler is triggered.\n if (error) {\n throw error;\n }\n\n return response;\n })();\n }\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * An implementation of a\n * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate}\n * request strategy.\n *\n * Resources are requested from both the cache and the network in parallel.\n * The strategy will respond with the cached version if available, otherwise\n * wait for the network response. The cache is updated with the network response\n * with each successful request.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * @memberof workbox.strategies\n */\n class StaleWhileRevalidate {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n\n if (options.plugins) {\n let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate);\n this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];\n } else {\n // No plugins passed in, use the default plugin.\n this._plugins = [cacheOkAndOpaquePlugin];\n }\n\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {FetchEvent} options.event The fetch event to run this strategy\n * against.\n * @return {Promise}\n */\n handle({ event }) {\n var _this = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n {\n assert_mjs.assert.isInstance(event, FetchEvent, {\n moduleName: 'workbox-strategies',\n className: 'StaleWhileRevalidate',\n funcName: 'handle',\n paramName: 'event'\n });\n }\n\n return _this.makeRequest({\n event,\n request: event.request\n });\n })();\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n makeRequest({ event, request }) {\n var _this2 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n {\n assert_mjs.assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'StaleWhileRevalidate',\n funcName: 'handle',\n paramName: 'request'\n });\n }\n\n const fetchAndCachePromise = _this2._getFromNetwork({ request, event });\n\n let response = yield cacheWrapper_mjs.cacheWrapper.match({\n cacheName: _this2._cacheName,\n request,\n event,\n matchOptions: _this2._matchOptions,\n plugins: _this2._plugins\n });\n\n if (response) {\n {\n logs.push(`Found a cached response in the '${_this2._cacheName}'` + ` cache. Will update with the network response in the background.`);\n }\n\n if (event) {\n try {\n event.waitUntil(fetchAndCachePromise);\n } catch (error) {\n {\n logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n } else {\n {\n logs.push(`No response found in the '${_this2._cacheName}' cache. ` + `Will wait for the network response.`);\n }\n response = yield fetchAndCachePromise;\n }\n\n {\n logger_mjs.logger.groupCollapsed(messages.strategyStart('StaleWhileRevalidate', request));\n for (let log of logs) {\n logger_mjs.logger.log(log);\n }\n messages.printFinalResponse(response);\n logger_mjs.logger.groupEnd();\n }\n\n return response;\n })();\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _getFromNetwork({ request, event }) {\n var _this3 = this;\n\n return babelHelpers.asyncToGenerator(function* () {\n const response = yield fetchWrapper_mjs.fetchWrapper.fetch({\n request,\n event,\n fetchOptions: _this3._fetchOptions,\n plugins: _this3._plugins\n });\n\n const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({\n cacheName: _this3._cacheName,\n request,\n response: response.clone(),\n event,\n plugins: _this3._plugins\n });\n\n if (event) {\n try {\n event.waitUntil(cachePutPromise);\n } catch (error) {\n {\n logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n\n return response;\n })();\n }\n }\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n var publicAPI = /*#__PURE__*/Object.freeze({\n CacheFirst: CacheFirst,\n CacheOnly: CacheOnly,\n NetworkFirst: NetworkFirst,\n NetworkOnly: NetworkOnly,\n StaleWhileRevalidate: StaleWhileRevalidate\n });\n\n /*\n Copyright 2016 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * @function workbox.strategies.cacheFirst\n * @param {Object} options See the {@link workbox.strategies.CacheFirst}\n * constructor for more info.\n */\n\n /**\n * @function workbox.strategies.cacheOnly\n * @param {Object} options See the {@link workbox.strategies.CacheOnly}\n * constructor for more info.\n */\n\n /**\n * @function workbox.strategies.networkFirst\n * @param {Object} options See the {@link workbox.strategies.NetworkFirst}\n * constructor for more info.\n */\n\n /**\n * @function workbox.strategies.networkOnly\n * @param {Object} options See the {@link workbox.strategies.NetworkOnly}\n * constructor for more info.\n */\n\n /**\n * @function workbox.strategies.staleWhileRevalidate\n * @param {Object} options See the\n * {@link workbox.strategies.StaleWhileRevalidate} constructor for more info.\n */\n\n const mapping = {\n cacheFirst: CacheFirst,\n cacheOnly: CacheOnly,\n networkFirst: NetworkFirst,\n networkOnly: NetworkOnly,\n staleWhileRevalidate: StaleWhileRevalidate\n };\n\n const defaultExport = {};\n Object.keys(mapping).forEach(keyName => {\n defaultExport[keyName] = (options = {}) => {\n const StrategyClass = mapping[keyName];\n return new StrategyClass(Object.assign(options));\n };\n });\n\n /*\n Copyright 2017 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n const finalExport = Object.assign(defaultExport, publicAPI);\n\n return finalExport;\n\n}(workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private));\n"],"file":"workbox-strategies.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-strategies.prod.js b/workbox-v3.6.3/workbox-strategies.prod.js new file mode 100644 index 0000000..9cdefea --- /dev/null +++ b/workbox-v3.6.3/workbox-strategies.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.strategies=function(e,t,s){"use strict";try{self.workbox.v["workbox:strategies:3.6.3"]=1}catch(e){}class r{constructor(t={}){this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],this.s=t.fetchOptions||null,this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:s}){var r=this;return babelHelpers.asyncToGenerator(function*(){"string"==typeof s&&(s=new Request(s));let n,i=yield t.cacheWrapper.match({cacheName:r.e,request:s,event:e,matchOptions:r.r,plugins:r.t});if(!i)try{i=yield r.n(s,e)}catch(e){n=e}if(n)throw n;return i})()}n(e,r){var n=this;return babelHelpers.asyncToGenerator(function*(){const i=yield s.fetchWrapper.fetch({request:e,event:r,fetchOptions:n.s,plugins:n.t}),u=i.clone(),l=t.cacheWrapper.put({cacheName:n.e,request:e,response:u,event:r,plugins:n.t});if(r)try{r.waitUntil(l)}catch(e){}return i})()}}class n{constructor(t={}){this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:s}){var r=this;return babelHelpers.asyncToGenerator(function*(){return"string"==typeof s&&(s=new Request(s)),yield t.cacheWrapper.match({cacheName:r.e,request:s,event:e,matchOptions:r.r,plugins:r.t})})()}}var i={cacheWillUpdate:({response:e})=>e.ok||0===e.status?e:null};class u{constructor(t={}){if(this.e=e.cacheNames.getRuntimeName(t.cacheName),t.plugins){let e=t.plugins.some(e=>!!e.cacheWillUpdate);this.t=e?t.plugins:[i,...t.plugins]}else this.t=[i];this.i=t.networkTimeoutSeconds,this.s=t.fetchOptions||null,this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:t}){var s=this;return babelHelpers.asyncToGenerator(function*(){const r=[];"string"==typeof t&&(t=new Request(t));const n=[];let i;if(s.i){const{id:u,promise:l}=s.u({request:t,event:e,logs:r});i=u,n.push(l)}const u=s.l({timeoutId:i,request:t,event:e,logs:r});n.push(u);let l=yield Promise.race(n);return l||(l=yield u),l})()}u({request:e,logs:t,event:s}){var r=this;let n;var i;return{promise:new Promise(t=>{const u=(i=babelHelpers.asyncToGenerator(function*(){t(yield r.c({request:e,event:s}))}),function(){return i.apply(this,arguments)});n=setTimeout(u,1e3*this.i)}),id:n}}l({timeoutId:e,request:r,logs:n,event:i}){var u=this;return babelHelpers.asyncToGenerator(function*(){let n,l;try{l=yield s.fetchWrapper.fetch({request:r,event:i,fetchOptions:u.s,plugins:u.t})}catch(e){n=e}if(e&&clearTimeout(e),n||!l)l=yield u.c({request:r,event:i});else{const e=l.clone(),s=t.cacheWrapper.put({cacheName:u.e,request:r,response:e,event:i,plugins:u.t});if(i)try{i.waitUntil(s)}catch(e){}}return l})()}c({event:e,request:s}){return t.cacheWrapper.match({cacheName:this.e,request:s,event:e,matchOptions:this.r,plugins:this.t})}}class l{constructor(t={}){this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],this.s=t.fetchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:t}){var r=this;return babelHelpers.asyncToGenerator(function*(){let n,i;"string"==typeof t&&(t=new Request(t));try{i=yield s.fetchWrapper.fetch({request:t,event:e,fetchOptions:r.s,plugins:r.t})}catch(e){n=e}if(n)throw n;return i})()}}class c{constructor(t={}){if(this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],t.plugins){let e=t.plugins.some(e=>!!e.cacheWillUpdate);this.t=e?t.plugins:[i,...t.plugins]}else this.t=[i];this.s=t.fetchOptions||null,this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:s}){var r=this;return babelHelpers.asyncToGenerator(function*(){"string"==typeof s&&(s=new Request(s));const n=r.n({request:s,event:e});let i=yield t.cacheWrapper.match({cacheName:r.e,request:s,event:e,matchOptions:r.r,plugins:r.t});if(i){if(e)try{e.waitUntil(n)}catch(e){}}else i=yield n;return i})()}n({request:e,event:r}){var n=this;return babelHelpers.asyncToGenerator(function*(){const i=yield s.fetchWrapper.fetch({request:e,event:r,fetchOptions:n.s,plugins:n.t}),u=t.cacheWrapper.put({cacheName:n.e,request:e,response:i.clone(),event:r,plugins:n.t});if(r)try{r.waitUntil(u)}catch(e){}return i})()}}var o=Object.freeze({CacheFirst:r,CacheOnly:n,NetworkFirst:u,NetworkOnly:l,StaleWhileRevalidate:c});const a={cacheFirst:r,cacheOnly:n,networkFirst:u,networkOnly:l,staleWhileRevalidate:c},h={};return Object.keys(a).forEach(e=>{h[e]=((t={})=>{return new(0,a[e])(Object.assign(t))})}),Object.assign(h,o)}(workbox.core._private,workbox.core._private,workbox.core._private); + +//# sourceMappingURL=workbox-strategies.prod.js.map diff --git a/workbox-v3.6.3/workbox-strategies.prod.js.map b/workbox-v3.6.3/workbox-strategies.prod.js.map new file mode 100644 index 0000000..3e527ea --- /dev/null +++ b/workbox-v3.6.3/workbox-strategies.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-strategies/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.strategies=function(e,t,s){\"use strict\";try{self.workbox.v[\"workbox:strategies:3.6.3\"]=1}catch(e){}class r{constructor(t={}){this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],this.s=t.fetchOptions||null,this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:s}){var r=this;return babelHelpers.asyncToGenerator(function*(){\"string\"==typeof s&&(s=new Request(s));let n,i=yield t.cacheWrapper.match({cacheName:r.e,request:s,event:e,matchOptions:r.r,plugins:r.t});if(!i)try{i=yield r.n(s,e)}catch(e){n=e}if(n)throw n;return i})()}n(e,r){var n=this;return babelHelpers.asyncToGenerator(function*(){const i=yield s.fetchWrapper.fetch({request:e,event:r,fetchOptions:n.s,plugins:n.t}),u=i.clone(),l=t.cacheWrapper.put({cacheName:n.e,request:e,response:u,event:r,plugins:n.t});if(r)try{r.waitUntil(l)}catch(e){}return i})()}}class n{constructor(t={}){this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:s}){var r=this;return babelHelpers.asyncToGenerator(function*(){return\"string\"==typeof s&&(s=new Request(s)),yield t.cacheWrapper.match({cacheName:r.e,request:s,event:e,matchOptions:r.r,plugins:r.t})})()}}var i={cacheWillUpdate:({response:e})=>e.ok||0===e.status?e:null};class u{constructor(t={}){if(this.e=e.cacheNames.getRuntimeName(t.cacheName),t.plugins){let e=t.plugins.some(e=>!!e.cacheWillUpdate);this.t=e?t.plugins:[i,...t.plugins]}else this.t=[i];this.i=t.networkTimeoutSeconds,this.s=t.fetchOptions||null,this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:t}){var s=this;return babelHelpers.asyncToGenerator(function*(){const r=[];\"string\"==typeof t&&(t=new Request(t));const n=[];let i;if(s.i){const{id:u,promise:l}=s.u({request:t,event:e,logs:r});i=u,n.push(l)}const u=s.l({timeoutId:i,request:t,event:e,logs:r});n.push(u);let l=yield Promise.race(n);return l||(l=yield u),l})()}u({request:e,logs:t,event:s}){var r=this;let n;var i;return{promise:new Promise(t=>{const u=(i=babelHelpers.asyncToGenerator(function*(){t(yield r.c({request:e,event:s}))}),function(){return i.apply(this,arguments)});n=setTimeout(u,1e3*this.i)}),id:n}}l({timeoutId:e,request:r,logs:n,event:i}){var u=this;return babelHelpers.asyncToGenerator(function*(){let n,l;try{l=yield s.fetchWrapper.fetch({request:r,event:i,fetchOptions:u.s,plugins:u.t})}catch(e){n=e}if(e&&clearTimeout(e),n||!l)l=yield u.c({request:r,event:i});else{const e=l.clone(),s=t.cacheWrapper.put({cacheName:u.e,request:r,response:e,event:i,plugins:u.t});if(i)try{i.waitUntil(s)}catch(e){}}return l})()}c({event:e,request:s}){return t.cacheWrapper.match({cacheName:this.e,request:s,event:e,matchOptions:this.r,plugins:this.t})}}class l{constructor(t={}){this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],this.s=t.fetchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:t}){var r=this;return babelHelpers.asyncToGenerator(function*(){let n,i;\"string\"==typeof t&&(t=new Request(t));try{i=yield s.fetchWrapper.fetch({request:t,event:e,fetchOptions:r.s,plugins:r.t})}catch(e){n=e}if(n)throw n;return i})()}}class c{constructor(t={}){if(this.e=e.cacheNames.getRuntimeName(t.cacheName),this.t=t.plugins||[],t.plugins){let e=t.plugins.some(e=>!!e.cacheWillUpdate);this.t=e?t.plugins:[i,...t.plugins]}else this.t=[i];this.s=t.fetchOptions||null,this.r=t.matchOptions||null}handle({event:e}){var t=this;return babelHelpers.asyncToGenerator(function*(){return t.makeRequest({event:e,request:e.request})})()}makeRequest({event:e,request:s}){var r=this;return babelHelpers.asyncToGenerator(function*(){\"string\"==typeof s&&(s=new Request(s));const n=r.n({request:s,event:e});let i=yield t.cacheWrapper.match({cacheName:r.e,request:s,event:e,matchOptions:r.r,plugins:r.t});if(i){if(e)try{e.waitUntil(n)}catch(e){}}else i=yield n;return i})()}n({request:e,event:r}){var n=this;return babelHelpers.asyncToGenerator(function*(){const i=yield s.fetchWrapper.fetch({request:e,event:r,fetchOptions:n.s,plugins:n.t}),u=t.cacheWrapper.put({cacheName:n.e,request:e,response:i.clone(),event:r,plugins:n.t});if(r)try{r.waitUntil(u)}catch(e){}return i})()}}var o=Object.freeze({CacheFirst:r,CacheOnly:n,NetworkFirst:u,NetworkOnly:l,StaleWhileRevalidate:c});const a={cacheFirst:r,cacheOnly:n,networkFirst:u,networkOnly:l,staleWhileRevalidate:c},h={};return Object.keys(a).forEach(e=>{h[e]=((t={})=>{return new(0,a[e])(Object.assign(t))})}),Object.assign(h,o)}(workbox.core._private,workbox.core._private,workbox.core._private);\n"],"file":"workbox-strategies.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-streams.dev.js b/workbox-v3.6.3/workbox-streams.dev.js new file mode 100644 index 0000000..136c707 --- /dev/null +++ b/workbox-v3.6.3/workbox-streams.dev.js @@ -0,0 +1,380 @@ +this.workbox = this.workbox || {}; +this.workbox.streams = (function (exports,logger_mjs,assert_mjs) { + 'use strict'; + + try { + self.workbox.v['workbox:streams:3.6.3'] = 1; + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Takes either a Response, a ReadableStream, or a + * [BodyInit](https://fetch.spec.whatwg.org/#bodyinit) and returns the + * ReadableStreamReader object associated with it. + * + * @param {workbox.streams.StreamSource} source + * @return {ReadableStreamReader} + * @private + */ + function _getReaderFromSource(source) { + if (source.body && source.body.getReader) { + return source.body.getReader(); + } + + if (source.getReader) { + return source.getReader(); + } + + // TODO: This should be possible to do by constructing a ReadableStream, but + // I can't get it to work. As a hack, construct a new Response, and use the + // reader associated with its body. + return new Response(source).body.getReader(); + } + + /** + * Takes multiple source Promises, each of which could resolve to a Response, a + * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit). + * + * Returns an object exposing a ReadableStream with each individual stream's + * data returned in sequence, along with a Promise which signals when the + * stream is finished (useful for passing to a FetchEvent's waitUntil()). + * + * @param {Array>} sourcePromises + * @return {Object<{done: Promise, stream: ReadableStream}>} + * + * @memberof workbox.streams + */ + function concatenate(sourcePromises) { + { + assert_mjs.assert.isArray(sourcePromises, { + moduleName: 'workbox-streams', + funcName: 'concatenate', + paramName: 'sourcePromises' + }); + } + + const readerPromises = sourcePromises.map(sourcePromise => { + return Promise.resolve(sourcePromise).then(source => { + return _getReaderFromSource(source); + }); + }); + + let fullyStreamedResolve; + let fullyStreamedReject; + const done = new Promise((resolve, reject) => { + fullyStreamedResolve = resolve; + fullyStreamedReject = reject; + }); + + let i = 0; + const logMessages = []; + const stream = new ReadableStream({ + pull(controller) { + return readerPromises[i].then(reader => reader.read()).then(result => { + if (result.done) { + { + logMessages.push(['Reached the end of source:', sourcePromises[i]]); + } + + i++; + if (i >= readerPromises.length) { + // Log all the messages in the group at once in a single group. + { + logger_mjs.logger.groupCollapsed(`Concatenating ${readerPromises.length} sources.`); + for (const message of logMessages) { + if (Array.isArray(message)) { + logger_mjs.logger.log(...message); + } else { + logger_mjs.logger.log(message); + } + } + logger_mjs.logger.log('Finished reading all sources.'); + logger_mjs.logger.groupEnd(); + } + + controller.close(); + fullyStreamedResolve(); + return; + } + + return this.pull(controller); + } else { + controller.enqueue(result.value); + } + }).catch(error => { + { + logger_mjs.logger.error('An error occurred:', error); + } + fullyStreamedReject(error); + throw error; + }); + }, + + cancel() { + { + logger_mjs.logger.warn('The ReadableStream was cancelled.'); + } + + fullyStreamedResolve(); + } + }); + + return { done, stream }; + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * This is a utility method that determines whether the current browser supports + * the features required to create streamed responses. Currently, it checks if + * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream) + * is available. + * + * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified, + * `'text/html'` will be used by default. + * @return {boolean} `true`, if the current browser meets the requirements for + * streaming responses, and `false` otherwise. + * + * @memberof workbox.streams + */ + function createHeaders(headersInit = {}) { + // See https://github.com/GoogleChrome/workbox/issues/1461 + const headers = new Headers(headersInit); + if (!headers.has('content-type')) { + headers.set('content-type', 'text/html'); + } + return headers; + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * Takes multiple source Promises, each of which could resolve to a Response, a + * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit), + * along with a + * [HeadersInit](https://fetch.spec.whatwg.org/#typedefdef-headersinit). + * + * Returns an object exposing a Response whose body consists of each individual + * stream's data returned in sequence, along with a Promise which signals when + * the stream is finished (useful for passing to a FetchEvent's waitUntil()). + * + * @param {Array>} sourcePromises + * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified, + * `'text/html'` will be used by default. + * @return {Object<{done: Promise, response: Response}>} + * + * @memberof workbox.streams + */ + function concatenateToResponse(sourcePromises, headersInit) { + const { done, stream } = concatenate(sourcePromises); + + const headers = createHeaders(headersInit); + const response = new Response(stream, { headers }); + + return { done, response }; + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + let cachedIsSupported = undefined; + + /** + * This is a utility method that determines whether the current browser supports + * the features required to create streamed responses. Currently, it checks if + * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream) + * can be created. + * + * @return {boolean} `true`, if the current browser meets the requirements for + * streaming responses, and `false` otherwise. + * + * @memberof workbox.streams + */ + function isSupported() { + if (cachedIsSupported === undefined) { + // See https://github.com/GoogleChrome/workbox/issues/1473 + try { + new ReadableStream({ start() {} }); + cachedIsSupported = true; + } catch (error) { + cachedIsSupported = false; + } + } + + return cachedIsSupported; + } + + /* + Copyright 2018 Google Inc. All Rights Reserved. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /** + * A shortcut to create a strategy that could be dropped-in to Workbox's router. + * + * On browsers that do not support constructing new `ReadableStream`s, this + * strategy will automatically wait for all the `sourceFunctions` to complete, + * and create a final response that concatenates their values together. + * + * @param { + * Array} sourceFunctions + * Each function should return a {@link workbox.streams.StreamSource} (or a + * Promise which resolves to one). + * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified, + * `'text/html'` will be used by default. + * @return {workbox.routing.Route~handlerCallback} + * + * @memberof workbox.streams + */ + function strategy(sourceFunctions, headersInit) { + return (() => { + var _ref = babelHelpers.asyncToGenerator(function* ({ event, url, params }) { + if (isSupported()) { + const { done, response } = concatenateToResponse(sourceFunctions.map(function (sourceFunction) { + return sourceFunction({ event, url, params }); + }), headersInit); + event.waitUntil(done); + return response; + } + + { + logger_mjs.logger.log(`The current browser doesn't support creating response ` + `streams. Falling back to non-streaming response instead.`); + } + + // Fallback to waiting for everything to finish, and concatenating the + // responses. + const parts = yield Promise.all(sourceFunctions.map(function (sourceFunction) { + return sourceFunction({ event, url, params }); + }).map((() => { + var _ref2 = babelHelpers.asyncToGenerator(function* (responsePromise) { + const response = yield responsePromise; + if (response instanceof Response) { + return response.blob(); + } + + // Otherwise, assume it's something like a string which can be used + // as-is when constructing the final composite blob. + return response; + }); + + return function (_x2) { + return _ref2.apply(this, arguments); + }; + })())); + + const headers = createHeaders(headersInit); + // Constructing a new Response from a Blob source is well-supported. + // So is constructing a new Blob from multiple source Blobs or strings. + return new Response(new Blob(parts), { headers }); + }); + + return function (_x) { + return _ref.apply(this, arguments); + }; + })(); + } + + /* + Copyright 2018 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + /* + Copyright 2018 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + exports.concatenate = concatenate; + exports.concatenateToResponse = concatenateToResponse; + exports.isSupported = isSupported; + exports.strategy = strategy; + + return exports; + +}({},workbox.core._private,workbox.core._private)); + +//# sourceMappingURL=workbox-streams.dev.js.map diff --git a/workbox-v3.6.3/workbox-streams.dev.js.map b/workbox-v3.6.3/workbox-streams.dev.js.map new file mode 100644 index 0000000..4022187 --- /dev/null +++ b/workbox-v3.6.3/workbox-streams.dev.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-streams/browser.mjs"],"sourcesContent":["this.workbox = this.workbox || {};\nthis.workbox.streams = (function (exports,logger_mjs,assert_mjs) {\n 'use strict';\n\n try {\n self.workbox.v['workbox:streams:3.6.3'] = 1;\n } catch (e) {} // eslint-disable-line\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Takes either a Response, a ReadableStream, or a\n * [BodyInit](https://fetch.spec.whatwg.org/#bodyinit) and returns the\n * ReadableStreamReader object associated with it.\n *\n * @param {workbox.streams.StreamSource} source\n * @return {ReadableStreamReader}\n * @private\n */\n function _getReaderFromSource(source) {\n if (source.body && source.body.getReader) {\n return source.body.getReader();\n }\n\n if (source.getReader) {\n return source.getReader();\n }\n\n // TODO: This should be possible to do by constructing a ReadableStream, but\n // I can't get it to work. As a hack, construct a new Response, and use the\n // reader associated with its body.\n return new Response(source).body.getReader();\n }\n\n /**\n * Takes multiple source Promises, each of which could resolve to a Response, a\n * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit).\n *\n * Returns an object exposing a ReadableStream with each individual stream's\n * data returned in sequence, along with a Promise which signals when the\n * stream is finished (useful for passing to a FetchEvent's waitUntil()).\n *\n * @param {Array>} sourcePromises\n * @return {Object<{done: Promise, stream: ReadableStream}>}\n *\n * @memberof workbox.streams\n */\n function concatenate(sourcePromises) {\n {\n assert_mjs.assert.isArray(sourcePromises, {\n moduleName: 'workbox-streams',\n funcName: 'concatenate',\n paramName: 'sourcePromises'\n });\n }\n\n const readerPromises = sourcePromises.map(sourcePromise => {\n return Promise.resolve(sourcePromise).then(source => {\n return _getReaderFromSource(source);\n });\n });\n\n let fullyStreamedResolve;\n let fullyStreamedReject;\n const done = new Promise((resolve, reject) => {\n fullyStreamedResolve = resolve;\n fullyStreamedReject = reject;\n });\n\n let i = 0;\n const logMessages = [];\n const stream = new ReadableStream({\n pull(controller) {\n return readerPromises[i].then(reader => reader.read()).then(result => {\n if (result.done) {\n {\n logMessages.push(['Reached the end of source:', sourcePromises[i]]);\n }\n\n i++;\n if (i >= readerPromises.length) {\n // Log all the messages in the group at once in a single group.\n {\n logger_mjs.logger.groupCollapsed(`Concatenating ${readerPromises.length} sources.`);\n for (const message of logMessages) {\n if (Array.isArray(message)) {\n logger_mjs.logger.log(...message);\n } else {\n logger_mjs.logger.log(message);\n }\n }\n logger_mjs.logger.log('Finished reading all sources.');\n logger_mjs.logger.groupEnd();\n }\n\n controller.close();\n fullyStreamedResolve();\n return;\n }\n\n return this.pull(controller);\n } else {\n controller.enqueue(result.value);\n }\n }).catch(error => {\n {\n logger_mjs.logger.error('An error occurred:', error);\n }\n fullyStreamedReject(error);\n throw error;\n });\n },\n\n cancel() {\n {\n logger_mjs.logger.warn('The ReadableStream was cancelled.');\n }\n\n fullyStreamedResolve();\n }\n });\n\n return { done, stream };\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * This is a utility method that determines whether the current browser supports\n * the features required to create streamed responses. Currently, it checks if\n * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)\n * is available.\n *\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {boolean} `true`, if the current browser meets the requirements for\n * streaming responses, and `false` otherwise.\n *\n * @memberof workbox.streams\n */\n function createHeaders(headersInit = {}) {\n // See https://github.com/GoogleChrome/workbox/issues/1461\n const headers = new Headers(headersInit);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'text/html');\n }\n return headers;\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * Takes multiple source Promises, each of which could resolve to a Response, a\n * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit),\n * along with a\n * [HeadersInit](https://fetch.spec.whatwg.org/#typedefdef-headersinit).\n *\n * Returns an object exposing a Response whose body consists of each individual\n * stream's data returned in sequence, along with a Promise which signals when\n * the stream is finished (useful for passing to a FetchEvent's waitUntil()).\n *\n * @param {Array>} sourcePromises\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {Object<{done: Promise, response: Response}>}\n *\n * @memberof workbox.streams\n */\n function concatenateToResponse(sourcePromises, headersInit) {\n const { done, stream } = concatenate(sourcePromises);\n\n const headers = createHeaders(headersInit);\n const response = new Response(stream, { headers });\n\n return { done, response };\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n let cachedIsSupported = undefined;\n\n /**\n * This is a utility method that determines whether the current browser supports\n * the features required to create streamed responses. Currently, it checks if\n * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)\n * can be created.\n *\n * @return {boolean} `true`, if the current browser meets the requirements for\n * streaming responses, and `false` otherwise.\n *\n * @memberof workbox.streams\n */\n function isSupported() {\n if (cachedIsSupported === undefined) {\n // See https://github.com/GoogleChrome/workbox/issues/1473\n try {\n new ReadableStream({ start() {} });\n cachedIsSupported = true;\n } catch (error) {\n cachedIsSupported = false;\n }\n }\n\n return cachedIsSupported;\n }\n\n /*\n Copyright 2018 Google Inc. All Rights Reserved.\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /**\n * A shortcut to create a strategy that could be dropped-in to Workbox's router.\n *\n * On browsers that do not support constructing new `ReadableStream`s, this\n * strategy will automatically wait for all the `sourceFunctions` to complete,\n * and create a final response that concatenates their values together.\n *\n * @param {\n * Array} sourceFunctions\n * Each function should return a {@link workbox.streams.StreamSource} (or a\n * Promise which resolves to one).\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {workbox.routing.Route~handlerCallback}\n *\n * @memberof workbox.streams\n */\n function strategy(sourceFunctions, headersInit) {\n return (() => {\n var _ref = babelHelpers.asyncToGenerator(function* ({ event, url, params }) {\n if (isSupported()) {\n const { done, response } = concatenateToResponse(sourceFunctions.map(function (sourceFunction) {\n return sourceFunction({ event, url, params });\n }), headersInit);\n event.waitUntil(done);\n return response;\n }\n\n {\n logger_mjs.logger.log(`The current browser doesn't support creating response ` + `streams. Falling back to non-streaming response instead.`);\n }\n\n // Fallback to waiting for everything to finish, and concatenating the\n // responses.\n const parts = yield Promise.all(sourceFunctions.map(function (sourceFunction) {\n return sourceFunction({ event, url, params });\n }).map((() => {\n var _ref2 = babelHelpers.asyncToGenerator(function* (responsePromise) {\n const response = yield responsePromise;\n if (response instanceof Response) {\n return response.blob();\n }\n\n // Otherwise, assume it's something like a string which can be used\n // as-is when constructing the final composite blob.\n return response;\n });\n\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n })()));\n\n const headers = createHeaders(headersInit);\n // Constructing a new Response from a Blob source is well-supported.\n // So is constructing a new Blob from multiple source Blobs or strings.\n return new Response(new Blob(parts), { headers });\n });\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n })();\n }\n\n /*\n Copyright 2018 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n /*\n Copyright 2018 Google Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n https://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n exports.concatenate = concatenate;\n exports.concatenateToResponse = concatenateToResponse;\n exports.isSupported = isSupported;\n exports.strategy = strategy;\n\n return exports;\n\n}({},workbox.core._private,workbox.core._private));\n"],"file":"workbox-streams.dev.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-streams.prod.js b/workbox-v3.6.3/workbox-streams.prod.js new file mode 100644 index 0000000..96f8d4d --- /dev/null +++ b/workbox-v3.6.3/workbox-streams.prod.js @@ -0,0 +1,3 @@ +this.workbox=this.workbox||{},this.workbox.streams=function(e){"use strict";try{self.workbox.v["workbox:streams:3.6.3"]=1}catch(e){}function n(e){const n=e.map(e=>Promise.resolve(e).then(e=>(e=e).body&&e.body.getReader?e.body.getReader():e.getReader?e.getReader():new Response(e).body.getReader()));var t;let r,s;let o=0;return{done:new Promise((e,n)=>{r=e,s=n}),stream:new ReadableStream({pull(e){return n[o].then(e=>e.read()).then(t=>{if(t.done)return++o>=n.length?(e.close(),void r()):this.pull(e);e.enqueue(t.value)}).catch(e=>{throw s(e),e})},cancel(){r()}})}}function t(e={}){const n=new Headers(e);return n.has("content-type")||n.set("content-type","text/html"),n}function r(e,r){const{done:s,stream:o}=n(e),u=t(r);return{done:s,response:new Response(o,{headers:u})}}let s=void 0;function o(){if(void 0===s)try{new ReadableStream({start(){}}),s=!0}catch(e){s=!1}return s}return e.concatenate=n,e.concatenateToResponse=r,e.isSupported=o,e.strategy=function(e,n){return s=babelHelpers.asyncToGenerator(function*({event:s,url:u,params:i}){if(o()){const{done:t,response:o}=r(e.map(function(e){return e({event:s,url:u,params:i})}),n);return s.waitUntil(t),o}const c=yield Promise.all(e.map(function(e){return e({event:s,url:u,params:i})}).map((a=babelHelpers.asyncToGenerator(function*(e){const n=yield e;return n instanceof Response?n.blob():n}),function(e){return a.apply(this,arguments)})));var a;const l=t(n);return new Response(new Blob(c),{headers:l})}),function(e){return s.apply(this,arguments)};var s},e}({}); + +//# sourceMappingURL=workbox-streams.prod.js.map diff --git a/workbox-v3.6.3/workbox-streams.prod.js.map b/workbox-v3.6.3/workbox-streams.prod.js.map new file mode 100644 index 0000000..5adf675 --- /dev/null +++ b/workbox-v3.6.3/workbox-streams.prod.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-streams/browser.mjs"],"sourcesContent":["this.workbox=this.workbox||{},this.workbox.streams=function(e){\"use strict\";try{self.workbox.v[\"workbox:streams:3.6.3\"]=1}catch(e){}function n(e){const n=e.map(e=>Promise.resolve(e).then(e=>(e=e).body&&e.body.getReader?e.body.getReader():e.getReader?e.getReader():new Response(e).body.getReader()));var t;let r,s;let o=0;return{done:new Promise((e,n)=>{r=e,s=n}),stream:new ReadableStream({pull(e){return n[o].then(e=>e.read()).then(t=>{if(t.done)return++o>=n.length?(e.close(),void r()):this.pull(e);e.enqueue(t.value)}).catch(e=>{throw s(e),e})},cancel(){r()}})}}function t(e={}){const n=new Headers(e);return n.has(\"content-type\")||n.set(\"content-type\",\"text/html\"),n}function r(e,r){const{done:s,stream:o}=n(e),u=t(r);return{done:s,response:new Response(o,{headers:u})}}let s=void 0;function o(){if(void 0===s)try{new ReadableStream({start(){}}),s=!0}catch(e){s=!1}return s}return e.concatenate=n,e.concatenateToResponse=r,e.isSupported=o,e.strategy=function(e,n){return s=babelHelpers.asyncToGenerator(function*({event:s,url:u,params:i}){if(o()){const{done:t,response:o}=r(e.map(function(e){return e({event:s,url:u,params:i})}),n);return s.waitUntil(t),o}const c=yield Promise.all(e.map(function(e){return e({event:s,url:u,params:i})}).map((a=babelHelpers.asyncToGenerator(function*(e){const n=yield e;return n instanceof Response?n.blob():n}),function(e){return a.apply(this,arguments)})));var a;const l=t(n);return new Response(new Blob(c),{headers:l})}),function(e){return s.apply(this,arguments)};var s},e}({});\n"],"file":"workbox-streams.prod.js"} \ No newline at end of file diff --git a/workbox-v3.6.3/workbox-sw.js b/workbox-v3.6.3/workbox-sw.js new file mode 100644 index 0000000..b03e1c4 --- /dev/null +++ b/workbox-v3.6.3/workbox-sw.js @@ -0,0 +1,3 @@ +var workbox=function(){"use strict";try{self.workbox.v["workbox:sw:3.6.3"]=1}catch(t){}const t="https://storage.googleapis.com/workbox-cdn/releases/3.6.3",e={backgroundSync:"background-sync",broadcastUpdate:"broadcast-cache-update",cacheableResponse:"cacheable-response",core:"core",expiration:"cache-expiration",googleAnalytics:"google-analytics",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};return new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.e=this.t.debug?"dev":"prod",this.s=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.s)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.e=this.t.debug?"dev":"prod"}skipWaiting(){self.addEventListener("install",()=>self.skipWaiting())}clientsClaim(){self.addEventListener("activate",()=>self.clients.claim())}loadModule(t){const e=this.o(t);try{importScripts(e),this.s=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}o(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.e}.js`,r=this.t.modulePathPrefix;return r&&""===(s=r.split("/"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join("/")}}}(); + +//# sourceMappingURL=workbox-sw.js.map diff --git a/workbox-v3.6.3/workbox-sw.js.map b/workbox-v3.6.3/workbox-sw.js.map new file mode 100644 index 0000000..c5b3a6c --- /dev/null +++ b/workbox-v3.6.3/workbox-sw.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["packages/workbox-sw/browser.mjs"],"sourcesContent":["var workbox=function(){\"use strict\";try{self.workbox.v[\"workbox:sw:3.6.3\"]=1}catch(t){}const t=\"https://storage.googleapis.com/workbox-cdn/releases/3.6.3\",e={backgroundSync:\"background-sync\",broadcastUpdate:\"broadcast-cache-update\",cacheableResponse:\"cacheable-response\",core:\"core\",expiration:\"cache-expiration\",googleAnalytics:\"google-analytics\",navigationPreload:\"navigation-preload\",precaching:\"precaching\",rangeRequests:\"range-requests\",routing:\"routing\",strategies:\"strategies\",streams:\"streams\"};return new class{constructor(){return this.v={},this.t={debug:\"localhost\"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.e=this.t.debug?\"dev\":\"prod\",this.s=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.s)throw new Error(\"Config must be set before accessing workbox.* modules\");Object.assign(this.t,t),this.e=this.t.debug?\"dev\":\"prod\"}skipWaiting(){self.addEventListener(\"install\",()=>self.skipWaiting())}clientsClaim(){self.addEventListener(\"activate\",()=>self.clients.claim())}loadModule(t){const e=this.o(t);try{importScripts(e),this.s=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}o(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.e}.js`,r=this.t.modulePathPrefix;return r&&\"\"===(s=r.split(\"/\"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join(\"/\")}}}();\n"],"file":"workbox-sw.js"} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 25f835d..0000000 --- a/yarn.lock +++ /dev/null @@ -1,10755 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - dependencies: - "@babel/highlight" "7.0.0-beta.44" - -"@babel/code-frame@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.0.tgz#a4dd3814901998e93340f0086e9867fefa163ada" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.0" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.2.0" - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.2.0" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.10" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - dependencies: - "@babel/types" "7.0.0-beta.44" - jsesc "^2.5.1" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.1.6", "@babel/generator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c" - dependencies: - "@babel/types" "^7.2.0" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/helper-annotate-as-pure@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" - dependencies: - "@babel/helper-explode-assignable-expression" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-builder-react-jsx@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" - dependencies: - "@babel/types" "^7.0.0" - esutils "^2.0.0" - -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" - dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-create-class-features-plugin@^7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.2.1.tgz#f6e8027291669ef64433220dc8327531233f1161" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" - -"@babel/helper-explode-assignable-expression@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" - dependencies: - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - dependencies: - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-get-function-arity@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-member-expression-to-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-module-transforms@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" - -"@babel/helper-optimise-call-expression@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - -"@babel/helper-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" - dependencies: - lodash "^4.17.10" - -"@babel/helper-remap-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-wrap-function" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-replace-supers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" - dependencies: - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-simple-access@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" - dependencies: - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" - -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-split-export-declaration@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - dependencies: - "@babel/types" "^7.0.0" - -"@babel/helper-wrap-function@^7.1.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/template" "^7.1.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.2.0" - -"@babel/helpers@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" - dependencies: - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.5" - "@babel/types" "^7.2.0" - -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.6", "@babel/parser@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.0.tgz#02d01dbc330b6cbf36b76ac93c50752c69027065" - -"@babel/plugin-proposal-async-generator-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - -"@babel/plugin-proposal-class-properties@^7.0.0": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.2.1.tgz#c734a53e0a1ec40fe5c22ee5069d26da3b187d05" - dependencies: - "@babel/helper-create-class-features-plugin" "^7.2.1" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-proposal-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" - -"@babel/plugin-syntax-async-generators@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-dynamic-import@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-json-strings@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-jsx@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-object-rest-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-arrow-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" - -"@babel/plugin-transform-block-scoped-functions@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-block-scoping@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" - -"@babel/plugin-transform-classes@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.0.tgz#374f8876075d7d21fea55aeb5c53561259163f96" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-destructuring@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-dotall-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" - -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-exponentiation-operator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-for-of@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-function-name@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" - dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-amd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - -"@babel/plugin-transform-modules-systemjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" - dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-modules-umd@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" - dependencies: - "@babel/helper-module-transforms" "^7.1.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-object-super@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - -"@babel/plugin-transform-parameters@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" - dependencies: - "@babel/helper-call-delegate" "^7.1.0" - "@babel/helper-get-function-arity" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz#ca36b6561c4d3b45524f8efb6f0fbc9a0d1d622f" - dependencies: - "@babel/helper-builder-react-jsx" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" - dependencies: - regenerator-transform "^0.13.3" - -"@babel/plugin-transform-runtime@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-spread@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.0.tgz#0c76c12a3b5826130078ee8ec84a7a8e4afd79c4" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-sticky-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - -"@babel/plugin-transform-template-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" - dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-typeof-symbol@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-unicode-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" - -"@babel/polyfill@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0.tgz#c8ff65c9ec3be6a1ba10113ebd40e8750fb90bff" - dependencies: - core-js "^2.5.7" - regenerator-runtime "^0.11.1" - -"@babel/preset-env@^7.0.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.0.tgz#a5030e7e4306af5a295dd5d7c78dc5464af3fee2" - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.2.0" - "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.2.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" - "@babel/plugin-syntax-async-generators" "^7.2.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" - "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.2.0" - "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.2.0" - "@babel/plugin-transform-classes" "^7.2.0" - "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.2.0" - "@babel/plugin-transform-dotall-regex" "^7.2.0" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" - "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.2.0" - "@babel/plugin-transform-function-name" "^7.2.0" - "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.2.0" - "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" - "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.2.0" - "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.2.0" - browserslist "^4.3.4" - invariant "^2.2.2" - js-levenshtein "^1.1.3" - semver "^5.3.0" - -"@babel/preset-react@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-react-jsx-self" "^7.0.0" - "@babel/plugin-transform-react-jsx-source" "^7.0.0" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" - dependencies: - regenerator-runtime "^0.12.0" - -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/template@^7.1.0", "@babel/template@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.2" - "@babel/types" "^7.1.2" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.1.6" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.6" - "@babel/types" "^7.1.6" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.10" - -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" - -"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.6", "@babel/types@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.0.tgz#7941c5b2d8060e06f9601d6be7c223eef906d5d8" - dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" - -"@moocar/lokijs@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@moocar/lokijs/-/lokijs-1.0.1.tgz#545227c173030dd0e6b1e6bdcef528012a6c325c" - -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - -"@reach/router@^1.1.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e" - dependencies: - create-react-context "^0.2.1" - invariant "^2.2.3" - prop-types "^15.6.1" - react-lifecycles-compat "^3.0.4" - warning "^3.0.0" - -"@sindresorhus/is@^0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" - -"@types/configstore@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/configstore/-/configstore-2.1.1.tgz#cd1e8553633ad3185c3f2f239ecff5d2643e92b6" - -"@types/debug@^0.0.29": - version "0.0.29" - resolved "http://registry.npmjs.org/@types/debug/-/debug-0.0.29.tgz#a1e514adfbd92f03a224ba54d693111dbf1f3754" - -"@types/events@*": - version "1.2.0" - resolved "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" - -"@types/get-port@^0.0.4": - version "0.0.4" - resolved "http://registry.npmjs.org/@types/get-port/-/get-port-0.0.4.tgz#eb6bb7423d9f888b632660dc7d2fd3e69a35643e" - -"@types/glob@^5.0.30": - version "5.0.36" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.36.tgz#0c80a9c8664fc7d19781de229f287077fd622cb2" - dependencies: - "@types/events" "*" - "@types/minimatch" "*" - "@types/node" "*" - -"@types/history@*": - version "4.7.2" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.2.tgz#0e670ea254d559241b6eeb3894f8754991e73220" - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - -"@types/mkdirp@^0.3.29": - version "0.3.29" - resolved "http://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" - -"@types/node@*": - version "10.12.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" - -"@types/node@^7.0.11": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.10.2.tgz#a98845168012d7a63a84d50e738829da43bdb0de" - -"@types/prop-types@*": - version "15.5.7" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.7.tgz#c6f1e0d0109ff358b132d98b7b4025c7a7b707c5" - -"@types/reach__router@^1.0.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.2.2.tgz#1bd96626c2866a61937758ef6be2f06309124805" - dependencies: - "@types/history" "*" - "@types/react" "*" - -"@types/react@*": - version "16.7.13" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.7.13.tgz#d2369ae78377356d42fb54275d30218e84f2247a" - dependencies: - "@types/prop-types" "*" - csstype "^2.2.0" - -"@types/tmp@^0.0.32": - version "0.0.32" - resolved "http://registry.npmjs.org/@types/tmp/-/tmp-0.0.32.tgz#0d3cb31022f8427ea58c008af32b80da126ca4e3" - -"@webassemblyjs/ast@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" - dependencies: - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - -"@webassemblyjs/floating-point-hex-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" - -"@webassemblyjs/helper-api-error@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" - -"@webassemblyjs/helper-buffer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" - -"@webassemblyjs/helper-code-frame@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" - dependencies: - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/helper-fsm@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" - -"@webassemblyjs/helper-module-context@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" - -"@webassemblyjs/helper-wasm-bytecode@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" - -"@webassemblyjs/helper-wasm-section@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - -"@webassemblyjs/ieee754@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" - dependencies: - "@xtuc/long" "4.2.1" - -"@webassemblyjs/utf8@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" - -"@webassemblyjs/wasm-edit@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/helper-wasm-section" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-opt" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/wasm-gen@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wasm-opt@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - -"@webassemblyjs/wasm-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wast-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/floating-point-hex-parser" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-code-frame" "1.7.11" - "@webassemblyjs/helper-fsm" "1.7.11" - "@xtuc/long" "4.2.1" - -"@webassemblyjs/wast-printer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - "@xtuc/long" "4.2.1" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - -"@xtuc/long@4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -accepts@^1.3.0, accepts@~1.3.4, accepts@~1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - dependencies: - acorn "^5.0.0" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.0, acorn@^5.5.0, acorn@^5.6.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - -address@1.0.3, address@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" - -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.1.0, ajv@^6.5.5: - version "6.6.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - dependencies: - string-width "^2.0.0" - -ansi-colors@^3.0.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - dependencies: - ansi-wrap "0.1.0" - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -ansi-wrap@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - -any-promise@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -apollo-link@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.4.tgz#ab4d21d2e428db848e88b5e8f4adc717b19c954b" - dependencies: - apollo-utilities "^1.0.0" - zen-observable-ts "^0.8.11" - -apollo-utilities@^1.0.0, apollo-utilities@^1.0.1: - version "1.0.26" - resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.0.26.tgz#589c66bf4d16223531351cf667a230c787def1da" - dependencies: - fast-json-stable-stringify "^2.0.0" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -arch@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" - -archive-type@^3.0.0, archive-type@^3.0.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" - dependencies: - file-type "^3.1.0" - -archive-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70" - dependencies: - file-type "^4.2.0" - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-uniq@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-2.0.0.tgz#0009e30306e37a6dd2e2e2480db5316fdade1583" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -ast-types-flow@0.0.7, ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - -async-each-series@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - -async@1.5.2, async@^1.5.2: - version "1.5.2" - resolved "http://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.2: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - -autoprefixer@^8.6.5: - version "8.6.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" - dependencies: - browserslist "^3.2.8" - caniuse-lite "^1.0.30000864" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.23" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - -axobject-query@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" - dependencies: - ast-types-flow "0.0.7" - -babel-code-frame@6.26.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - -babel-eslint@^8.2.2: - version "8.2.6" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" - -babel-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - dependencies: - babylon "^6.18.0" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-loader@8.0.0-beta.4: - version "8.0.0-beta.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.4.tgz#c3fab00696c385c70c04dbe486391f0eb996f345" - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - util.promisify "^1.0.0" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-add-module-exports@^0.2.1: - version "0.2.1" - resolved "http://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" - -babel-plugin-check-es2015-constants@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-dynamic-import-node@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz#f91631e703e0595e47d4beafbb088576c87fbeee" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - -babel-plugin-macros@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz#21b1a2e82e2130403c5ff785cba6548e9b644b28" - dependencies: - cosmiconfig "^5.0.5" - resolve "^1.8.1" - -babel-plugin-remove-graphql-queries@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.5.2.tgz#7e1c11f381c5c94ff3dec6ca42ee06d1df396175" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.8.0: - version "6.18.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-class-properties@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-arrow-functions@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.8.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - 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.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.8.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-for-of@^6.8.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.8.0: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-object-super@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-template-literals@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es3-member-expression-literals@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-member-expression-literals/-/babel-plugin-transform-es3-member-expression-literals-6.22.0.tgz#733d3444f3ecc41bef8ed1a6a4e09657b8969ebb" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es3-property-literals@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es3-property-literals/-/babel-plugin-transform-es3-property-literals-6.22.0.tgz#b2078d5842e22abf40f73e8cde9cd3711abd5758" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.8.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0, babel-plugin-transform-object-rest-spread@^6.8.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-display-name@^6.8.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.8.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.20.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-fbjs@^2.1.4: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-2.3.0.tgz#92ff81307c18b926895114f9828ae1674c097f80" - dependencies: - babel-plugin-check-es2015-constants "^6.8.0" - babel-plugin-syntax-class-properties "^6.8.0" - babel-plugin-syntax-flow "^6.8.0" - babel-plugin-syntax-jsx "^6.8.0" - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-plugin-syntax-trailing-function-commas "^6.8.0" - babel-plugin-transform-class-properties "^6.8.0" - babel-plugin-transform-es2015-arrow-functions "^6.8.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.8.0" - babel-plugin-transform-es2015-block-scoping "^6.8.0" - babel-plugin-transform-es2015-classes "^6.8.0" - babel-plugin-transform-es2015-computed-properties "^6.8.0" - babel-plugin-transform-es2015-destructuring "^6.8.0" - babel-plugin-transform-es2015-for-of "^6.8.0" - babel-plugin-transform-es2015-function-name "^6.8.0" - babel-plugin-transform-es2015-literals "^6.8.0" - babel-plugin-transform-es2015-modules-commonjs "^6.8.0" - babel-plugin-transform-es2015-object-super "^6.8.0" - babel-plugin-transform-es2015-parameters "^6.8.0" - babel-plugin-transform-es2015-shorthand-properties "^6.8.0" - babel-plugin-transform-es2015-spread "^6.8.0" - babel-plugin-transform-es2015-template-literals "^6.8.0" - babel-plugin-transform-es3-member-expression-literals "^6.8.0" - babel-plugin-transform-es3-property-literals "^6.8.0" - babel-plugin-transform-flow-strip-types "^6.8.0" - babel-plugin-transform-object-rest-spread "^6.8.0" - babel-plugin-transform-react-display-name "^6.8.0" - babel-plugin-transform-react-jsx "^6.8.0" - -babel-preset-gatsby@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/babel-preset-gatsby/-/babel-preset-gatsby-0.1.6.tgz#df9e6a813ef860ffb23dcf48a2f4c13f3f3d050c" - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@babel/preset-react" "^7.0.0" - babel-plugin-macros "^2.4.2" - -babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@6.26.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -babylon@^7.0.0-beta: - version "7.0.0-beta.47" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" - -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - -base64id@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - dependencies: - callsite "1.0.0" - -better-queue-memory@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/better-queue-memory/-/better-queue-memory-1.0.3.tgz#4e71fbb5f5976188656e0c5610da7b411af41493" - -better-queue@^3.8.6, better-queue@^3.8.7: - version "3.8.10" - resolved "https://registry.yarnpkg.com/better-queue/-/better-queue-3.8.10.tgz#1c93b9ec4cb3d1b72eb91d0efcb84fc80e8c6835" - dependencies: - better-queue-memory "^1.0.1" - node-eta "^0.9.0" - uuid "^3.0.0" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -bignumber.js@^2.1.0: - version "2.4.0" - resolved "http://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8" - -bin-build@^2.2.0: - version "2.2.0" - resolved "http://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" - dependencies: - archive-type "^3.0.1" - decompress "^3.0.0" - download "^4.1.2" - exec-series "^1.0.0" - rimraf "^2.2.6" - tempfile "^1.0.0" - url-regex "^3.0.0" - -bin-build@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861" - dependencies: - decompress "^4.0.0" - download "^6.2.2" - execa "^0.7.0" - p-map-series "^1.0.0" - tempfile "^2.0.0" - -bin-check@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" - dependencies: - executable "^1.0.0" - -bin-check@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49" - dependencies: - execa "^0.7.0" - executable "^4.1.0" - -bin-version-check@^2.1.0: - version "2.1.0" - resolved "http://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" - dependencies: - bin-version "^1.0.0" - minimist "^1.1.0" - semver "^4.0.3" - semver-truncate "^1.0.0" - -bin-version-check@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71" - dependencies: - bin-version "^3.0.0" - semver "^5.6.0" - semver-truncate "^1.1.2" - -bin-version@^1.0.0: - version "1.0.4" - resolved "http://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" - dependencies: - find-versions "^1.0.0" - -bin-version@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-3.0.0.tgz#1a8be03f652171713b1b1ccc4b0ebea460b08818" - dependencies: - execa "^1.0.0" - find-versions "^3.0.0" - -bin-wrapper@^3.0.0, bin-wrapper@^3.0.1: - version "3.0.2" - resolved "http://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" - dependencies: - bin-check "^2.0.0" - bin-version-check "^2.1.0" - download "^4.0.0" - each-async "^1.1.1" - lazy-req "^1.0.0" - os-filter-obj "^1.0.0" - -bin-wrapper@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-4.1.0.tgz#99348f2cf85031e3ef7efce7e5300aeaae960605" - dependencies: - bin-check "^4.1.0" - bin-version-check "^4.0.0" - download "^7.1.0" - import-lazy "^3.1.0" - os-filter-obj "^2.0.0" - pify "^4.0.1" - -binary-extensions@^1.0.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" - -bindings@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" - -bl@^1.0.0: - version "1.2.2" - resolved "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - -bluebird@^3.5.0, bluebird@^3.5.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - -bmp-js@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@1.18.3: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" - on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - dependencies: - pako "~1.0.5" - -browserslist@3.2.8, browserslist@^3.2.8: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - -browserslist@^4.0.0, browserslist@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7" - dependencies: - caniuse-lite "^1.0.30000912" - electron-to-chromium "^1.3.86" - node-releases "^1.0.5" - -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - dependencies: - node-int64 "^0.4.0" - -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - -buffer-alloc@^1.1.0, buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-equal@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - -buffer-to-vinyl@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" - dependencies: - file-type "^3.1.0" - readable-stream "^2.0.2" - uuid "^2.0.1" - vinyl "^1.0.0" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^3.0.1: - version "3.6.0" - resolved "http://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - dependencies: - base64-js "0.0.8" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^4.3.0: - version "4.9.1" - resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - -cacache@^11.0.2: - version "11.3.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - figgy-pudding "^3.1.0" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.3" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^6.0.0" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cache-manager-fs-hash@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/cache-manager-fs-hash/-/cache-manager-fs-hash-0.0.6.tgz#fccc5a6b579080cbe2186697e51b5b8ff8ca9fd0" - dependencies: - es6-promisify "^6.0.0" - lockfile "^1.0.4" - -cache-manager@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-2.9.0.tgz#5e1f6317ca1a25e40ddf365a7162757af152353e" - dependencies: - async "1.5.2" - lru-cache "4.0.0" - -cacheable-request@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" - dependencies: - clone-response "1.0.2" - get-stream "3.0.0" - http-cache-semantics "3.8.1" - keyv "3.0.0" - lowercase-keys "1.0.0" - normalize-url "2.0.1" - responselike "1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - dependencies: - callsites "^2.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - dependencies: - caller-callsite "^2.0.0" - -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - -callsites@^0.2.0: - version "0.2.0" - resolved "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -callsites@^2.0.0: - version "2.0.0" - resolved "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30000912: - version "1.0.30000918" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000918.tgz#6288f79da3c5c8b45e502f47ad8f3eb91f1379a9" - -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -caw@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" - dependencies: - get-proxy "^1.0.1" - is-obj "^1.0.0" - object-assign "^3.0.0" - tunnel-agent "^0.4.0" - -caw@^2.0.0, caw@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" - dependencies: - get-proxy "^2.0.0" - isurl "^1.0.0-alpha5" - tunnel-agent "^0.6.0" - url-to-options "^1.0.1" - -chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -charenc@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" - -chokidar@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^2.0.0, chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - -chownr@^1.0.1, chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - dependencies: - tslib "^1.9.0" - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - dependencies: - chalk "^1.1.3" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -clone-response@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - dependencies: - mimic-response "^1.0.0" - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - -co@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - dependencies: - q "^1.1.2" - -coa@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af" - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - -color@^3.0.0, color@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc" - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colors@~1.1.2: - version "1.1.2" - resolved "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.2: - version "1.2.8" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" - -commander@^2.11.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - -commander@~2.8.1: - version "2.8.1" - resolved "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - dependencies: - graceful-readlink ">= 1.0.0" - -common-tags@^1.4.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - -component-emitter@1.2.1, component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - -compressible@~2.0.14: - version "2.0.15" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" - dependencies: - mime-db ">= 1.36.0 < 2" - -compression@^1.5.2, compression@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.14" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -confusing-browser-globals@2.0.0-next.66cc7a90: - version "2.0.0-next.66cc7a90" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-2.0.0-next.66cc7a90.tgz#438e83bb16602abf1cd5c5aa9d6e4d61d924743e" - -connect-history-api-fallback@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -console-stream@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - -content-disposition@0.5.2, content-disposition@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - -content-type@^1.0.4, content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -convert-hrtime@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-2.0.0.tgz#19bfb2c9162f9e11c2f04c2c79de2b7e8095c627" - -convert-source-map@^1.1.0, convert-source-map@^1.1.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -copyfiles@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-1.2.0.tgz#a8da3ac41aa2220ae29bd3c58b6984294f2c593c" - dependencies: - glob "^7.0.5" - ltcdr "^2.2.1" - minimatch "^3.0.3" - mkdirp "^0.5.1" - noms "0.0.0" - through2 "^2.0.1" - -core-js@^1.0.0: - version "1.2.7" - resolved "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - -core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.7: - version "2.6.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.0.tgz#1e30793e9ee5782b307e37ffa22da0eacddd84d4" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cosmiconfig@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" - require-from-string "^2.0.1" - -cosmiconfig@^5.0.0, cosmiconfig@^5.0.5: - version "5.0.7" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04" - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-error-class@^3.0.0, create-error-class@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-react-context@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" - dependencies: - fbjs "^0.8.0" - gud "^1.0.0" - -cross-fetch@2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.2.tgz#a47ff4f7fc712daba8f6a695a11c948440d45723" - dependencies: - node-fetch "2.1.2" - whatwg-fetch "2.0.4" - -cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypt@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-loader@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe" - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash "^4.17.11" - postcss "^6.0.23" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-select-base-adapter@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - -css-select@^1.1.0, css-select@~1.2.0: - version "1.2.0" - resolved "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-select@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" - dependencies: - boolbase "^1.0.0" - css-what "^2.1.2" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-selector-tokenizer@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" - dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" - -css-tree@1.0.0-alpha.28: - version "1.0.0-alpha.28" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-tree@1.0.0-alpha.29: - version "1.0.0-alpha.29" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" - dependencies: - mdn-data "~1.1.0" - source-map "^0.5.3" - -css-unit-converter@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" - -css-url-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" - -css-what@2.1, css-what@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" - -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - -cssnano-preset-default@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.5.tgz#d1756c0259d98ad311e601ba76e95c60f6771ac1" - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.0" - postcss-colormin "^4.0.2" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.1" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.9" - postcss-merge-rules "^4.0.2" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.1" - postcss-minify-params "^4.0.1" - postcss-minify-selectors "^4.0.1" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.1" - postcss-normalize-positions "^4.0.1" - postcss-normalize-repeat-style "^4.0.1" - postcss-normalize-string "^4.0.1" - postcss-normalize-timing-functions "^4.0.1" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.1" - postcss-ordered-values "^4.1.1" - postcss-reduce-initial "^4.0.2" - postcss-reduce-transforms "^4.0.1" - postcss-svgo "^4.0.1" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - -cssnano@^4.1.0: - version "4.1.7" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.7.tgz#0bf112294bec103ab5f68d3f805732c8325a0b1b" - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.5" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" - dependencies: - css-tree "1.0.0-alpha.29" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -csstype@^2.2.0: - version "2.5.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.8.tgz#4ce5aa16ea0d562ef9105fa3ae2676f199586a35" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -cwebp-bin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cwebp-bin/-/cwebp-bin-4.0.0.tgz#ee2b7f6333d3426fb52bb405fa6f2ec8b62894f4" - dependencies: - bin-build "^2.2.0" - bin-wrapper "^3.0.1" - logalot "^2.0.0" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - -damerau-levenshtein@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - -death@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - -debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@=3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@^3.1.0, debug@^3.2.5: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@~4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - dependencies: - xregexp "4.0.0" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - dependencies: - mimic-response "^1.0.0" - -decompress-tar@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" - dependencies: - is-tar "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1" - dependencies: - file-type "^5.2.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" - dependencies: - is-bzip2 "^1.0.0" - object-assign "^2.0.0" - seek-bzip "^1.0.3" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-tarbz2@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b" - dependencies: - decompress-tar "^4.1.0" - file-type "^6.1.0" - is-stream "^1.1.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" - dependencies: - is-gzip "^1.0.0" - object-assign "^2.0.0" - strip-dirs "^1.0.0" - tar-stream "^1.1.1" - through2 "^0.6.1" - vinyl "^0.4.3" - -decompress-targz@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee" - dependencies: - decompress-tar "^4.1.1" - file-type "^5.2.0" - is-stream "^1.1.0" - -decompress-unzip@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" - dependencies: - is-zip "^1.0.0" - read-all-stream "^3.0.0" - stat-mode "^0.2.0" - strip-dirs "^1.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - yauzl "^2.2.1" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" - -decompress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" - dependencies: - buffer-to-vinyl "^1.0.0" - concat-stream "^1.4.6" - decompress-tar "^3.0.0" - decompress-tarbz2 "^3.0.0" - decompress-targz "^3.0.0" - decompress-unzip "^3.0.0" - stream-combiner2 "^1.1.1" - vinyl-assign "^1.0.1" - vinyl-fs "^2.2.0" - -decompress@^4.0.0, decompress@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -deepmerge@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - -default-gateway@^2.6.0: - version "2.7.2" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" - dependencies: - execa "^0.10.0" - ip-regex "^2.1.0" - -define-properties@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - -deprecated-decorator@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - -detect-libc@^1.0.2, detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-node@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - -detect-port-alt@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.3.tgz#a4d2f061d757a034ecf37c514260a98750f2b131" - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - dependencies: - address "^1.0.1" - debug "^2.6.0" - -devcert-san@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/devcert-san/-/devcert-san-0.3.3.tgz#aa77244741b2d831771c011f22ee25e396ad4ba9" - dependencies: - "@types/configstore" "^2.1.1" - "@types/debug" "^0.0.29" - "@types/get-port" "^0.0.4" - "@types/glob" "^5.0.30" - "@types/mkdirp" "^0.3.29" - "@types/node" "^7.0.11" - "@types/tmp" "^0.0.32" - command-exists "^1.2.2" - configstore "^3.0.0" - debug "^2.6.3" - eol "^0.8.1" - get-port "^3.0.0" - glob "^7.1.1" - mkdirp "^0.5.1" - tmp "^0.0.31" - tslib "^1.6.0" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - dependencies: - buffer-indexof "^1.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -dom-converter@~0.2: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - dependencies: - utila "~0.4" - -dom-helpers@^3.2.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - dependencies: - "@babel/runtime" "^7.1.2" - -dom-serializer@0, dom-serializer@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - -domelementtype@1, domelementtype@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - -domelementtype@~1.1.1: - version "1.1.3" - resolved "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - -domhandler@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" - dependencies: - domelementtype "1" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - dependencies: - domelementtype "1" - -domready@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/domready/-/domready-1.0.8.tgz#91f252e597b65af77e745ae24dd0185d5e26d58c" - -domutils@1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1, domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^4.1.0, dot-prop@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - dependencies: - is-obj "^1.0.0" - -dotenv@^4.0.0: - version "4.0.0" - resolved "http://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" - -download@^4.0.0, download@^4.1.2: - version "4.4.3" - resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" - dependencies: - caw "^1.0.1" - concat-stream "^1.4.7" - each-async "^1.0.0" - filenamify "^1.0.1" - got "^5.0.0" - gulp-decompress "^1.2.0" - gulp-rename "^1.2.0" - is-url "^1.2.0" - object-assign "^4.0.1" - read-all-stream "^3.0.0" - readable-stream "^2.0.2" - stream-combiner2 "^1.1.1" - vinyl "^1.0.0" - vinyl-fs "^2.2.0" - ware "^1.2.0" - -download@^6.2.2: - version "6.2.5" - resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714" - dependencies: - caw "^2.0.0" - content-disposition "^0.5.2" - decompress "^4.0.0" - ext-name "^5.0.0" - file-type "5.2.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^7.0.0" - make-dir "^1.0.0" - p-event "^1.0.0" - pify "^3.0.0" - -download@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233" - dependencies: - archive-type "^4.0.0" - caw "^2.0.1" - content-disposition "^0.5.2" - decompress "^4.2.0" - ext-name "^5.0.0" - file-type "^8.1.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^8.3.1" - make-dir "^1.2.0" - p-event "^2.1.0" - pify "^3.0.0" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer2@^0.1.4, duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -duplexer@^0.1.1: - version "0.1.1" - resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -each-async@^1.0.0, each-async@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" - dependencies: - onetime "^1.0.0" - set-immediate-shim "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.86: - version "1.3.88" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz#f36ab32634f49ef2b0fdc1e82e2d1cc17feb29e7" - -elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -engine.io-client@~3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.1.tgz#afedb4a07b2ea48b7190c3136bfea98fdd4f0f03" - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" - ws "~6.1.0" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" - -engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" - blob "0.0.5" - has-binary2 "~1.0.2" - -engine.io@~3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" - dependencies: - accepts "~1.3.4" - base64id "1.0.0" - cookie "0.3.1" - debug "~3.1.0" - engine.io-parser "~2.1.0" - ws "~6.1.0" - -enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - -envinfo@^5.8.1: - version "5.12.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.12.1.tgz#83068c33e0972eb657d6bc69a6df30badefb46ef" - -eol@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/eol/-/eol-0.8.1.tgz#defc3224990c7eca73bb34461a56cf9dc24761d0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.2.tgz#4ae8dbaa2bf90a8b450707b9149dcabca135520d" - dependencies: - stackframe "^1.0.4" - -es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-promise@^3.0.2: - version "3.3.1" - resolved "http://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - -es6-promisify@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.1.tgz#6edaa45f3bd570ffe08febce66f7116be4b1cdb6" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -eslint-config-react-app@3.0.0-next.66cc7a90: - version "3.0.0-next.66cc7a90" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-3.0.0-next.66cc7a90.tgz#f8c7bb3cca0f1e8f60bbf567ec71f6af1cce7edd" - dependencies: - confusing-browser-globals "2.0.0-next.66cc7a90" - -eslint-import-resolver-node@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-loader@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.1.tgz#2a9251523652430bfdd643efdb0afc1a2a89546a" - dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" - -eslint-module-utils@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-flowtype@^2.46.1: - version "2.50.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" - dependencies: - lodash "^4.17.10" - -eslint-plugin-graphql@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-graphql/-/eslint-plugin-graphql-2.1.1.tgz#dae5d597080075320ea8e98795056309ffe73a18" - dependencies: - graphql-config "^2.0.1" - lodash "^4.11.1" - -eslint-plugin-import@^2.9.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" - dependencies: - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.2.0" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - resolve "^1.6.0" - -eslint-plugin-jsx-a11y@^6.0.3: - version "6.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz#69bca4890b36dcf0fe16dd2129d2d88b98f33f88" - dependencies: - aria-query "^3.0.0" - array-includes "^3.0.3" - ast-types-flow "^0.0.7" - axobject-query "^2.0.1" - damerau-levenshtein "^1.0.4" - emoji-regex "^6.5.1" - has "^1.0.3" - jsx-ast-utils "^2.0.1" - -eslint-plugin-react@^7.8.2: - version "7.11.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" - dependencies: - array-includes "^3.0.3" - doctrine "^2.1.0" - has "^1.0.3" - jsx-ast-utils "^2.0.1" - prop-types "^15.6.2" - -eslint-scope@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@^4.19.1: - version "4.19.1" - resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.4: - version "3.5.4" - resolved "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - -esquery@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.0, esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -eventemitter3@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" - -events@^1.0.0: - version "1.1.1" - resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" - dependencies: - original ">=0.0.5" - -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-buffer@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" - dependencies: - execa "^0.7.0" - p-finally "^1.0.0" - pify "^3.0.0" - rimraf "^2.5.4" - tempfile "^2.0.0" - -exec-series@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" - dependencies: - async-each-series "^1.1.0" - object-assign "^4.1.0" - -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -executable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" - dependencies: - meow "^3.1.0" - -executable@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - dependencies: - pify "^2.2.0" - -exenv@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" - -exif-parser@^0.1.9: - version "0.1.12" - resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -express-graphql@^0.6.12: - version "0.6.12" - resolved "http://registry.npmjs.org/express-graphql/-/express-graphql-0.6.12.tgz#dfcb2058ca72ed5190b140830ad8cdbf76a9128a" - dependencies: - accepts "^1.3.0" - content-type "^1.0.4" - http-errors "^1.3.0" - raw-body "^2.3.2" - -express@^4.16.2, express@^4.16.3: - version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - dependencies: - accepts "~1.3.5" - array-flatten "1.1.1" - body-parser "1.18.3" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.1" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.4" - qs "6.5.2" - range-parser "~1.2.0" - safe-buffer "5.1.2" - send "0.16.2" - serve-static "1.13.2" - setprototypeof "1.1.0" - statuses "~1.4.0" - type-is "~1.6.16" - utils-merge "1.0.1" - vary "~1.1.2" - -ext-list@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" - dependencies: - mime-db "^1.28.0" - -ext-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" - dependencies: - ext-list "^2.0.0" - sort-keys-length "^1.0.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - -external-editor@^2.0.4: - version "2.2.0" - resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fancy-log@^1.1.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - -fast-glob@^2.0.0, fast-glob@^2.0.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.4.tgz#e54f4b66d378040e0e4d6a68ec36bbc5b04363c0" - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fastparse@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.0, faye-websocket@~0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - dependencies: - bser "^2.0.0" - -fbjs@^0.8.0, fbjs@^0.8.14: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - dependencies: - pend "~1.2.0" - -figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - -figures@^1.3.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-loader@^1.1.11: - version "1.1.11" - resolved "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.4.5" - -file-type@5.2.0, file-type@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6" - -file-type@^10.2.0: - version "10.6.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-10.6.0.tgz#95a94871d26b39f137a03cfd25450f0a56a38143" - -file-type@^3.1.0, file-type@^3.8.0: - version "3.9.0" - resolved "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" - -file-type@^4.2.0, file-type@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - -file-type@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" - -file-type@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -filename-reserved-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" - -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - -filenamify@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" - dependencies: - filename-reserved-regex "^1.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -filenamify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9" - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - -filesize@3.5.11: - version "3.5.11" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee" - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.1: - version "1.1.1" - resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.4.0" - unpipe "~1.0.0" - -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-cache-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^3.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - dependencies: - locate-path "^3.0.0" - -find-versions@^1.0.0: - version "1.2.1" - resolved "http://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" - dependencies: - array-uniq "^1.0.0" - get-stdin "^4.0.1" - meow "^3.5.0" - semver-regex "^1.0.0" - -find-versions@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.0.0.tgz#2c05a86e839c249101910100b354196785a2c065" - dependencies: - array-uniq "^2.0.0" - semver-regex "^2.0.0" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - -flat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - dependencies: - is-buffer "~2.0.3" - -flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -follow-redirects@^1.0.0: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - dependencies: - debug "=3.1.0" - -for-each@^0.3.2: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -friendly-errors-webpack-plugin@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz#efc86cbb816224565861a1be7a9d84d0aafea136" - dependencies: - chalk "^1.1.3" - error-stack-parser "^2.0.0" - string-width "^2.0.0" - -from2@^2.1.0, from2@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - -fs-copy-file-sync@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" - -fs-exists-cached@1.0.0, fs-exists-cached@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz#cf25554ca050dc49ae6656b41de42258989dcbce" - -fs-extra@^4.0.1, fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0, fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -function-bind@^1.1.0, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gatsby-cli@^2.4.6: - version "2.4.6" - resolved "https://registry.yarnpkg.com/gatsby-cli/-/gatsby-cli-2.4.6.tgz#97a293d2d3ac3f5bd3abe88728e77d3c093a47cc" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/runtime" "^7.0.0" - bluebird "^3.5.0" - common-tags "^1.4.0" - convert-hrtime "^2.0.0" - core-js "^2.5.0" - envinfo "^5.8.1" - execa "^0.8.0" - fs-exists-cached "^1.0.0" - fs-extra "^4.0.1" - hosted-git-info "^2.6.0" - lodash "^4.17.10" - opentracing "^0.14.3" - pretty-error "^2.1.1" - resolve-cwd "^2.0.0" - source-map "^0.5.7" - stack-trace "^0.0.10" - update-notifier "^2.3.0" - yargs "^11.1.0" - yurnalist "^0.2.1" - -gatsby-image@^2.0.20: - version "2.0.22" - resolved "https://registry.yarnpkg.com/gatsby-image/-/gatsby-image-2.0.22.tgz#67b82f0bc9adcbc49134847cfc85355b540fea96" - dependencies: - "@babel/runtime" "^7.0.0" - prop-types "^15.6.1" - -gatsby-link@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/gatsby-link/-/gatsby-link-2.0.7.tgz#b25b75c9d2dd34cfee4fa629019f8c6b0da719c9" - dependencies: - "@babel/runtime" "^7.0.0" - "@reach/router" "^1.1.1" - "@types/reach__router" "^1.0.0" - prop-types "^15.6.1" - -gatsby-plugin-manifest@^2.0.9: - version "2.0.11" - resolved "https://registry.yarnpkg.com/gatsby-plugin-manifest/-/gatsby-plugin-manifest-2.0.11.tgz#5a92e1b57556e4996982253e760d8c43d53428d2" - dependencies: - "@babel/runtime" "^7.0.0" - bluebird "^3.5.0" - sharp "^0.21.0" - -gatsby-plugin-offline@^2.0.16: - version "2.0.19" - resolved "https://registry.yarnpkg.com/gatsby-plugin-offline/-/gatsby-plugin-offline-2.0.19.tgz#b072f43756328887b0941a6597f209ff2c299c88" - dependencies: - "@babel/runtime" "^7.0.0" - cheerio "^1.0.0-rc.2" - idb-keyval "^3.1.0" - lodash "^4.17.10" - workbox-build "^3.6.3" - -gatsby-plugin-page-creator@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.0.5.tgz#16b268142aa3515b5856bf802d8eec5a6320dc1c" - dependencies: - "@babel/runtime" "^7.0.0" - bluebird "^3.5.0" - chokidar "^1.7.0" - fs-exists-cached "^1.0.0" - glob "^7.1.1" - lodash "^4.17.10" - micromatch "^3.1.10" - parse-filepath "^1.0.1" - slash "^1.0.0" - -gatsby-plugin-react-helmet@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.0.4.tgz#07811c8ccc626ecfea40554ccc5f946db705409d" - dependencies: - "@babel/runtime" "^7.0.0" - -gatsby-plugin-sharp@^2.0.14: - version "2.0.15" - resolved "https://registry.yarnpkg.com/gatsby-plugin-sharp/-/gatsby-plugin-sharp-2.0.15.tgz#dc2ec6790ec544e05d600affddc29b5f2fe55375" - dependencies: - "@babel/runtime" "^7.0.0" - async "^2.1.2" - bluebird "^3.5.0" - fs-exists-cached "^1.0.0" - fs-extra "^7.0.0" - imagemin "^6.0.0" - imagemin-mozjpeg "^7.0.0" - imagemin-pngquant "^6.0.0" - imagemin-webp "^4.1.0" - lodash "^4.17.10" - mini-svg-data-uri "^1.0.0" - potrace "^2.1.1" - probe-image-size "^4.0.0" - progress "^1.1.8" - sharp "^0.21.0" - svgo "^0.7.2" - -gatsby-react-router-scroll@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.0.2.tgz#d8046ce2f3bfa52ef6ec55804007d976b0bb6bef" - dependencies: - "@babel/runtime" "^7.0.0" - scroll-behavior "^0.9.9" - warning "^3.0.0" - -gatsby-source-filesystem@^2.0.8: - version "2.0.11" - resolved "https://registry.yarnpkg.com/gatsby-source-filesystem/-/gatsby-source-filesystem-2.0.11.tgz#6b2a8ece41a5f3cf8bf797589487096af6301961" - dependencies: - "@babel/runtime" "^7.0.0" - better-queue "^3.8.7" - bluebird "^3.5.0" - chokidar "^1.7.0" - file-type "^10.2.0" - fs-extra "^5.0.0" - got "^7.1.0" - md5-file "^3.1.1" - mime "^2.2.0" - pretty-bytes "^4.0.2" - read-chunk "^3.0.0" - slash "^1.0.0" - valid-url "^1.0.9" - xstate "^3.1.0" - -gatsby-transformer-sharp@^2.1.8: - version "2.1.9" - resolved "https://registry.yarnpkg.com/gatsby-transformer-sharp/-/gatsby-transformer-sharp-2.1.9.tgz#b00b9e8f4ec2648016bf87e5b0daf59daef8f805" - dependencies: - "@babel/runtime" "^7.0.0" - bluebird "^3.5.0" - fs-extra "^4.0.2" - potrace "^2.1.1" - probe-image-size "^4.0.0" - sharp "^0.21.0" - -gatsby@^2.0.53: - version "2.0.64" - resolved "https://registry.yarnpkg.com/gatsby/-/gatsby-2.0.64.tgz#ad106fdbfc3c7413641da6f79d63c367e9ecd771" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/polyfill" "^7.0.0" - "@babel/runtime" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@moocar/lokijs" "^1.0.1" - "@reach/router" "^1.1.1" - address "1.0.3" - autoprefixer "^8.6.5" - babel-core "7.0.0-bridge.0" - babel-eslint "^8.2.2" - babel-loader "8.0.0-beta.4" - babel-plugin-add-module-exports "^0.2.1" - babel-plugin-dynamic-import-node "^1.2.0" - babel-plugin-remove-graphql-queries "^2.5.2" - babel-preset-gatsby "^0.1.6" - babel-traverse "6.26.0" - better-queue "^3.8.6" - bluebird "^3.5.0" - browserslist "3.2.8" - cache-manager "^2.9.0" - cache-manager-fs-hash "^0.0.6" - chalk "^2.3.2" - chokidar "^2.0.2" - common-tags "^1.4.0" - compression "^1.7.3" - convert-hrtime "^2.0.0" - copyfiles "^1.2.0" - core-js "^2.5.0" - css-loader "^1.0.0" - debug "^3.1.0" - del "^3.0.0" - detect-port "^1.2.1" - devcert-san "^0.3.3" - domready "^1.0.8" - dotenv "^4.0.0" - eslint "^4.19.1" - eslint-config-react-app "3.0.0-next.66cc7a90" - eslint-loader "^2.0.0" - eslint-plugin-flowtype "^2.46.1" - eslint-plugin-graphql "^2.0.0" - eslint-plugin-import "^2.9.0" - eslint-plugin-jsx-a11y "^6.0.3" - eslint-plugin-react "^7.8.2" - express "^4.16.3" - express-graphql "^0.6.12" - fast-levenshtein "~2.0.4" - file-loader "^1.1.11" - flat "^4.0.0" - friendly-errors-webpack-plugin "^1.6.1" - fs-exists-cached "1.0.0" - fs-extra "^5.0.0" - gatsby-cli "^2.4.6" - gatsby-link "^2.0.7" - gatsby-plugin-page-creator "^2.0.5" - gatsby-react-router-scroll "^2.0.2" - glob "^7.1.1" - graphql "^0.13.2" - graphql-relay "^0.5.5" - graphql-skip-limit "^2.0.3" - graphql-tools "^3.0.4" - graphql-type-json "^0.2.1" - hash-mod "^0.0.5" - invariant "^2.2.4" - is-relative "^1.0.0" - is-relative-url "^2.0.0" - jest-worker "^23.2.0" - joi "12.x.x" - json-loader "^0.5.7" - json-stringify-safe "^5.0.1" - kebab-hash "^0.1.2" - lodash "^4.17.10" - md5 "^2.2.1" - md5-file "^3.1.1" - mime "^2.2.0" - mini-css-extract-plugin "^0.4.0" - mitt "^1.1.2" - mkdirp "^0.5.1" - moment "^2.21.0" - name-all-modules-plugin "^1.0.1" - normalize-path "^2.1.1" - null-loader "^0.1.1" - opentracing "^0.14.3" - opn "^5.3.0" - optimize-css-assets-webpack-plugin "^5.0.1" - parse-filepath "^1.0.1" - physical-cpu-count "^2.0.0" - postcss-flexbugs-fixes "^3.0.0" - postcss-loader "^2.1.3" - raw-loader "^0.5.1" - react-dev-utils "^4.2.1" - react-error-overlay "^3.0.0" - react-hot-loader "^4.5.1" - redux "^4.0.0" - relay-compiler "1.5.0" - request "^2.85.0" - semver "^5.6.0" - shallow-compare "^1.2.2" - sift "^5.1.0" - signal-exit "^3.0.2" - slash "^1.0.0" - socket.io "^2.0.3" - string-similarity "^1.2.0" - style-loader "^0.21.0" - terser-webpack-plugin "^1.0.2" - type-of "^2.0.1" - url-loader "^1.0.1" - uuid "^3.1.0" - v8-compile-cache "^1.1.0" - webpack "^4.12.0" - webpack-dev-middleware "^3.0.1" - webpack-dev-server "^3.1.1" - webpack-hot-middleware "^2.21.0" - webpack-merge "^4.1.0" - webpack-stats-plugin "^0.1.5" - yaml-loader "^0.5.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" - -get-port@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - -get-proxy@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" - dependencies: - rc "^1.1.2" - -get-proxy@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" - dependencies: - npm-conf "^1.1.0" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@3.0.0, get-stream@^3.0.0: - version "3.0.0" - resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-stream@^2.2.0: - version "2.3.1" - resolved "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0, glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - dependencies: - extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" - unique-stream "^2.0.2" - -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - -glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - dependencies: - ini "^1.3.4" - -global-modules@1.0.0, global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global@^4.3.0, global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -globals@^11.0.1, globals@^11.1.0: - version "11.9.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^6.1.0: - version "6.1.0" - resolved "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^8.0.1: - version "8.0.1" - resolved "http://registry.npmjs.org/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -glogg@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" - dependencies: - sparkles "^1.0.0" - -got@^5.0.0: - version "5.7.1" - resolved "http://registry.npmjs.org/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" - dependencies: - create-error-class "^3.0.1" - duplexer2 "^0.1.4" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - node-status-codes "^1.0.0" - object-assign "^4.0.1" - parse-json "^2.1.0" - pinkie-promise "^2.0.0" - read-all-stream "^3.0.0" - readable-stream "^2.0.5" - timed-out "^3.0.0" - unzip-response "^1.0.2" - url-parse-lax "^1.0.0" - -got@^6.7.1: - version "6.7.1" - resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -got@^7.0.0, got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -got@^8.3.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" - dependencies: - "@sindresorhus/is" "^0.7.0" - cacheable-request "^2.1.1" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - into-stream "^3.1.0" - is-retry-allowed "^1.1.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - mimic-response "^1.0.0" - p-cancelable "^0.4.0" - p-timeout "^2.0.1" - pify "^3.0.0" - safe-buffer "^5.1.1" - timed-out "^4.0.1" - url-parse-lax "^3.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -graphql-config@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-2.2.1.tgz#5fd0ec77ac7428ca5fb2026cf131be10151a0cb2" - dependencies: - graphql-import "^0.7.1" - graphql-request "^1.5.0" - js-yaml "^3.10.0" - lodash "^4.17.4" - minimatch "^3.0.4" - -graphql-import@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/graphql-import/-/graphql-import-0.7.1.tgz#4add8d91a5f752d764b0a4a7a461fcd93136f223" - dependencies: - lodash "^4.17.4" - resolve-from "^4.0.0" - -graphql-relay@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/graphql-relay/-/graphql-relay-0.5.5.tgz#d6815e6edd618e878d5d921c13fc66033ec867e2" - -graphql-request@^1.5.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" - dependencies: - cross-fetch "2.2.2" - -graphql-skip-limit@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/graphql-skip-limit/-/graphql-skip-limit-2.0.3.tgz#49fff679fd1972a5b329646ecbc20f7f3c1371f8" - dependencies: - "@babel/runtime" "^7.0.0" - -graphql-tools@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-3.1.1.tgz#d593358f01e7c8b1671a17b70ddb034dea9dbc50" - dependencies: - apollo-link "^1.2.2" - apollo-utilities "^1.0.1" - deprecated-decorator "^0.1.6" - iterall "^1.1.3" - uuid "^3.1.0" - -graphql-type-json@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.2.1.tgz#d2c177e2f1b17d87f81072cd05311c0754baa420" - -graphql@^0.13.0, graphql@^0.13.2: - version "0.13.2" - resolved "http://registry.npmjs.org/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" - dependencies: - iterall "^1.2.1" - -gud@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" - -gulp-decompress@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" - dependencies: - archive-type "^3.0.0" - decompress "^3.0.0" - gulp-util "^3.0.1" - readable-stream "^2.0.2" - -gulp-rename@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd" - -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -gulp-util@^3.0.1: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.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.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -gzip-size@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" - dependencies: - duplexer "^0.1.1" - -handle-thing@^1.2.5: - version "1.2.5" - resolved "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - dependencies: - has-symbol-support-x "^1.4.1" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash-mod@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/hash-mod/-/hash-mod-0.0.5.tgz#daf1e4973a9116643467d54ee7690b43ef802ecc" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@4.x.x: - version "4.2.1" - resolved "http://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - -hoist-non-react-statics@^2.5.0: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - -homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - -html-entities@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - -htmlparser2@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" - dependencies: - domelementtype "^1.3.0" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.0.6" - -htmlparser2@~3.3.0: - version "3.3.0" - resolved "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" - dependencies: - domelementtype "1" - domhandler "2.1" - domutils "1.1" - readable-stream "1.0" - -http-cache-semantics@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@^1.3.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.1.tgz#6a4ffe5d35188e1c39f872534690585852e1f027" - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-parser-js@>=0.4.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" - -http-proxy-middleware@~0.18.0: - version "0.18.0" - resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" - dependencies: - http-proxy "^1.16.2" - is-glob "^4.0.0" - lodash "^4.17.5" - micromatch "^3.1.9" - -http-proxy@^1.16.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - dependencies: - eventemitter3 "^3.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - dependencies: - postcss "^6.0.1" - -idb-keyval@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-3.1.0.tgz#cce9ed320734446784d52ed398c4b075a4273f51" - -ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.3, ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - -imagemin-mozjpeg@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/imagemin-mozjpeg/-/imagemin-mozjpeg-7.0.0.tgz#d926477fc6ef5f3a768a4222f7b2d808d3eba568" - dependencies: - execa "^0.8.0" - is-jpg "^1.0.0" - mozjpeg "^5.0.0" - -imagemin-pngquant@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/imagemin-pngquant/-/imagemin-pngquant-6.0.0.tgz#7c0c956338fa9a3a535deb63973c1c894519cc78" - dependencies: - execa "^0.10.0" - is-png "^1.0.0" - is-stream "^1.1.0" - pngquant-bin "^5.0.0" - -imagemin-webp@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/imagemin-webp/-/imagemin-webp-4.1.0.tgz#effd00160d8456b95cbde5fd26c32d64b0318062" - dependencies: - cwebp-bin "^4.0.0" - exec-buffer "^3.0.0" - is-cwebp-readable "^2.0.1" - -imagemin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/imagemin/-/imagemin-6.0.0.tgz#1ae68c6b867863651a454f882054d9abf7d13b78" - dependencies: - file-type "^8.1.0" - globby "^8.0.1" - make-dir "^1.0.0" - p-pipe "^1.1.0" - pify "^3.0.0" - replace-ext "^1.0.0" - -immutable@~3.7.6: - version "3.7.6" - resolved "http://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - dependencies: - resolve-from "^3.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - -import-lazy@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@3.3.0, inquirer@^3.0.1, inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -internal-ip@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" - dependencies: - default-gateway "^2.6.0" - ipaddr.js "^1.5.2" - -into-stream@^3.1.0: - version "3.1.0" - resolved "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" - dependencies: - from2 "^2.1.1" - p-is-promise "^1.1.0" - -invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.3, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - -ip-regex@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - -ipaddr.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - -ipaddr.js@^1.5.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - -is-absolute@^0.1.5: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" - dependencies: - is-relative "^0.1.0" - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5, is-buffer@~1.1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-buffer@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-bzip2@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" - -is-callable@^1.1.3, is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - dependencies: - ci-info "^1.5.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-cwebp-readable@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-cwebp-readable/-/is-cwebp-readable-2.0.1.tgz#afb93b0c0abd0a25101016ae33aea8aedf926d26" - dependencies: - file-type "^4.3.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-function@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-gzip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-jpg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.1.tgz#296d57fdd99ce010434a7283e346ab9a1035e975" - -is-natural-number@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" - -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-obj@^1.0.0, is-obj@^1.0.1: - version "1.0.1" - resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-png@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - -is-relative-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-2.0.0.tgz#72902d7fe04b3d4792e7db15f9db84b7204c9cef" - dependencies: - is-absolute-url "^2.0.0" - -is-relative@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - dependencies: - is-unc-path "^1.0.0" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-root@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - dependencies: - has-symbols "^1.0.0" - -is-tar@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - dependencies: - unc-path-regex "^0.1.2" - -is-url@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - -is-zip@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - -isemail@3.x.x: - version "3.2.0" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" - dependencies: - punycode "2.x.x" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -iterall@^1.1.3, iterall@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" - -jest-worker@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-23.2.0.tgz#faf706a8da36fae60eb26957257fa7b5d8ea02b9" - dependencies: - merge-stream "^1.0.1" - -jimp@^0.2.24: - version "0.2.28" - resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2" - dependencies: - bignumber.js "^2.1.0" - bmp-js "0.0.3" - es6-promise "^3.0.2" - exif-parser "^0.1.9" - file-type "^3.1.0" - jpeg-js "^0.2.0" - load-bmfont "^1.2.3" - mime "^1.3.4" - mkdirp "0.5.1" - pixelmatch "^4.0.0" - pngjs "^3.0.0" - read-chunk "^1.0.1" - request "^2.65.0" - stream-to-buffer "^0.1.0" - tinycolor2 "^1.1.2" - url-regex "^3.0.0" - -joi@12.x.x: - version "12.0.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" - dependencies: - hoek "4.x.x" - isemail "3.x.x" - topo "2.x.x" - -joi@^11.1.1: - version "11.4.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-11.4.0.tgz#f674897537b625e9ac3d0b7e1604c828ad913ccb" - dependencies: - hoek "4.x.x" - isemail "3.x.x" - topo "2.x.x" - -jpeg-js@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482" - -js-levenshtein@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.4.tgz#3a56e3cbf589ca0081eb22cd9ba0b1290a16d26e" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - -js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.5.2, js-yaml@^3.9.0, js-yaml@^3.9.1: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsesc@^1.3.0: - version "1.3.0" - resolved "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - -jsesc@~0.5.0: - version "0.5.0" - resolved "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - -json-loader@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -json-stable-stringify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.0: - version "0.5.1" - resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -json5@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" - dependencies: - minimist "^1.2.0" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jsx-ast-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - dependencies: - array-includes "^3.0.3" - -kebab-hash@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/kebab-hash/-/kebab-hash-0.1.2.tgz#dfb7949ba34d8e70114ea7d83e266e5e2a4abaac" - dependencies: - lodash.kebabcase "^4.1.1" - -keyv@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" - dependencies: - json-buffer "3.0.0" - -killable@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - dependencies: - package-json "^4.0.0" - -lazy-req@^1.0.0: - version "1.1.0" - resolved "http://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - dependencies: - invert-kv "^2.0.0" - -leven@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-bmfont@^1.2.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b" - dependencies: - buffer-equal "0.0.1" - mime "^1.3.4" - parse-bmfont-ascii "^1.0.3" - parse-bmfont-binary "^1.0.5" - parse-bmfont-xml "^1.1.4" - phin "^2.9.1" - xhr "^2.0.1" - xtend "^4.0.0" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -loader-fs-cache@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" - dependencies: - find-cache-dir "^0.1.1" - mkdirp "0.5.1" - -loader-runner@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" - -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lockfile@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.4.tgz#07f819d25ae48f87e538e6578b6964a4981a5609" - dependencies: - signal-exit "^3.0.2" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.every@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.every/-/lodash.every-4.6.0.tgz#eb89984bebc4364279bb3aefbbd1ca19bfa6c6a7" - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - -lodash.foreach@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.map@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - -lodash.maxby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.maxby/-/lodash.maxby-4.6.0.tgz#082240068f3c7a227aa00a8380e4f38cf0786e3d" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - -lodash.merge@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - -lodash@^4.11.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - -logalot@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" - dependencies: - figures "^1.3.5" - squeak "^1.0.0" - -loglevel@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" - -longest@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0, loud-rejection@^1.2.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - -lpad-align@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" - dependencies: - get-stdin "^4.0.1" - indent-string "^2.1.0" - longest "^1.0.0" - meow "^3.3.0" - -lru-cache@4.0.0: - version "4.0.0" - resolved "http://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz#b5cbf01556c16966febe54ceec0fb4dc90df6c28" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - -lru-cache@^4.0.1, lru-cache@^4.1.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -ltcdr@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltcdr/-/ltcdr-2.2.1.tgz#5ab87ad1d4c1dab8e8c08bbf037ee0c1902287cf" - -make-dir@^1.0.0, make-dir@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - dependencies: - pify "^3.0.0" - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.0, map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - -md5-file@^3.1.1: - version "3.2.3" - resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-3.2.3.tgz#f9bceb941eca2214a4c0727f5e700314e770f06f" - dependencies: - buffer-alloc "^1.1.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -md5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" - -mdn-data@~1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" - -media-typer@0.3.0: - version "0.3.0" - resolved "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - -mem@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^1.0.0" - p-is-promise "^1.1.0" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.1.0, meow@^3.3.0, meow@^3.5.0: - version "3.7.0" - resolved "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - -merge-stream@^1.0.0, merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -merge2@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^2.1.5, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -"mime-db@>= 1.36.0 < 2", mime-db@^1.28.0, mime-db@~1.37.0: - version "1.37.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: - version "2.1.21" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - dependencies: - mime-db "~1.37.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - -mime@^1.3.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - -mime@^2.0.3, mime@^2.2.0, mime@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -mimic-response@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - -mini-css-extract-plugin@^0.4.0: - version "0.4.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz#c99e9e78d54f3fa775633aee5933aeaa4e80719a" - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -mini-svg-data-uri@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.0.2.tgz#c4efdb71499249e02160a53db99d2eacf4b5a5c7" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" - dependencies: - brace-expansion "^1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minipass@^2.2.1, minipass@^2.3.4: - version "2.3.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" - dependencies: - minipass "^2.2.1" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mitt@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -moment@^2.21.0: - version "2.22.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -mozjpeg@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-5.0.0.tgz#b8671c4924568a363de003ff2fd397ab83f752c5" - dependencies: - bin-build "^2.2.0" - bin-wrapper "^3.0.0" - logalot "^2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -multipipe@^0.1.2: - version "0.1.2" - resolved "http://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -mute-stream@0.0.7, mute-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -name-all-modules-plugin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/name-all-modules-plugin/-/name-all-modules-plugin-1.0.1.tgz#0abfb6ad835718b9fb4def0674e06657a954375c" - -nan@^2.11.1, nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -napi-build-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -neo-async@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - -next-tick@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - -node-abi@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.5.0.tgz#942e1a78bce764bc0c1672d5821e492b9d032052" - dependencies: - semver "^5.4.1" - -node-emoji@^1.0.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" - dependencies: - lodash.toarray "^4.4.0" - -node-eta@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-eta/-/node-eta-0.9.0.tgz#9fb0b099bcd2a021940e603c64254dc003d9a7a8" - -node-fetch@2.1.2: - version "2.1.2" - resolved "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-releases@^1.0.5: - version "1.1.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.1.tgz#8fff8aea1cfcad1fb4205f805149054fbf73cafd" - dependencies: - semver "^5.3.0" - -node-status-codes@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize-url@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" - dependencies: - prepend-http "^2.0.0" - query-string "^5.0.1" - sort-keys "^2.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - -npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" - -npm-conf@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - dependencies: - config-chain "^1.1.11" - pify "^3.0.0" - -npm-packlist@^1.1.6: - version "1.1.12" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2, nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - dependencies: - boolbase "~1.0.0" - -null-loader@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-0.1.1.tgz#17be9abfcd3ff0e1512f6fc4afcb1f5039378fae" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-hash@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" - -object-keys@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - -object-path@^0.11.2: - version "0.11.4" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -object.values@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.6.1" - function-bind "^1.1.0" - has "^1.0.1" - -obuf@^1.0.0, obuf@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -opentracing@^0.14.3: - version "0.14.3" - resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.3.tgz#23e3ad029fa66a653926adbe57e834469f8550aa" - -opn@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" - dependencies: - is-wsl "^1.1.0" - -opn@^5.1.0, opn@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" - dependencies: - is-wsl "^1.1.0" - -optimize-css-assets-webpack-plugin@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz#9eb500711d35165b45e7fd60ba2df40cb3eb9159" - dependencies: - cssnano "^4.1.0" - last-call-webpack-plugin "^3.0.0" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - dependencies: - is-stream "^1.0.1" - readable-stream "^2.0.1" - -original@>=0.0.5, original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -os-filter-obj@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" - -os-filter-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" - dependencies: - arch "^2.1.0" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-locale@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" - dependencies: - execa "^0.10.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - -p-cancelable@^0.4.0: - version "0.4.1" - resolved "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - -p-event@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085" - dependencies: - p-timeout "^1.1.1" - -p-event@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-2.1.0.tgz#74de477a4e6b3aa8267240c7099e78ac52cb4db4" - dependencies: - p-timeout "^2.0.1" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-is-promise@^1.1.0: - version "1.1.0" - resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - dependencies: - p-limit "^2.0.0" - -p-map-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" - dependencies: - p-reduce "^1.0.0" - -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - -p-pipe@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - dependencies: - p-finally "^1.0.0" - -p-timeout@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -pako@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.1" - resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-bmfont-ascii@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285" - -parse-bmfont-binary@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006" - -parse-bmfont-xml@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389" - dependencies: - xml-parse-from-string "^1.0.0" - xml2js "^0.4.5" - -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-headers@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536" - dependencies: - for-each "^0.3.2" - trim "0.0.1" - -parse-json@^2.1.0, parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-node-version@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.0.tgz#33d9aa8920dcc3c0d33658ec18ce237009a56d53" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - dependencies: - "@types/node" "*" - -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - dependencies: - better-assert "~1.0.0" - -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - dependencies: - better-assert "~1.0.0" - -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-browserify@0.0.0: - version "0.0.0" - resolved "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-parse@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - dependencies: - pify "^3.0.0" - -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -phin@^2.9.1: - version "2.9.3" - resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" - -physical-cpu-count@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" - -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: - version "2.3.0" - resolved "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -pify@^4.0.0, pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pixelmatch@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" - dependencies: - pngjs "^3.0.0" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - dependencies: - find-up "^3.0.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -pngjs@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.3.3.tgz#85173703bde3edac8998757b96e5821d0966a21b" - -pngquant-bin@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-5.0.1.tgz#8e03b7bfa298dc7e761feb25b4a9d6827882ea9c" - dependencies: - bin-build "^3.0.0" - bin-wrapper "^4.0.1" - execa "^0.10.0" - logalot "^2.0.0" - -portfinder@^1.0.9: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -postcss-calc@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" - dependencies: - css-unit-converter "^1.1.1" - postcss "^7.0.5" - postcss-selector-parser "^5.0.0-rc.4" - postcss-value-parser "^3.3.1" - -postcss-colormin@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.2.tgz#93cd1fa11280008696887db1a528048b18e7ed99" - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-discard-comments@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.1.tgz#30697735b0c476852a7a11050eb84387a67ef55d" - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - dependencies: - postcss "^7.0.0" - -postcss-flexbugs-fixes@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.3.1.tgz#0783cc7212850ef707f97f8bc8b6fb624e00c75d" - dependencies: - postcss "^6.0.1" - -postcss-load-config@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" - dependencies: - cosmiconfig "^4.0.0" - import-cwd "^2.0.0" - -postcss-loader@^2.1.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" - dependencies: - loader-utils "^1.1.0" - postcss "^6.0.0" - postcss-load-config "^2.0.0" - schema-utils "^0.4.0" - -postcss-merge-longhand@^4.0.9: - version "4.0.9" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.9.tgz#c2428b994833ffb2a072f290ca642e75ceabcd6f" - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.2.tgz#2be44401bf19856f27f32b8b12c0df5af1b88e74" - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.1.tgz#6da95c6e92a809f956bb76bf0c04494953e1a7dd" - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.1.tgz#5b2e2d0264dd645ef5d68f8fec0d4c38c1cf93d2" - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.1.tgz#a891c197977cc37abf60b3ea06b84248b1c1e9cd" - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" - dependencies: - postcss "^6.0.1" - -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#d9a83d47c716e8a980f22f632c8b0458cfb48a4c" - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.1.tgz#ee2d4b67818c961964c6be09d179894b94fd6ba1" - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.1.tgz#5293f234b94d7669a9f805495d35b82a581c50e5" - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.1.tgz#23c5030c2cc24175f66c914fa5199e2e3c10fef3" - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.1.tgz#8be83e0b9cb3ff2d1abddee032a49108f05f95d7" - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.1.tgz#d14cb639b61238418ac8bc8d3b7bdd65fc86575e" - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-ordered-values@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.1.tgz#2e3b432ef3e489b18333aeca1f1295eb89be9fc2" - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-reduce-initial@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.2.tgz#bac8e325d67510ee01fa460676dc8ea9e3b40f15" - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.1.tgz#8600d5553bdd3ad640f43bff81eb52f8760d4561" - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-selector-parser@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" - dependencies: - dot-prop "^4.1.1" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0-rc.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0-rc.4.tgz#ca5e77238bf152966378c13e91ad6d611568ea87" - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.1.tgz#5628cdb38f015de6b588ce6d0bf0724b492b581d" - dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - -postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.23: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: - version "7.0.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2" - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.5.0" - -potrace@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/potrace/-/potrace-2.1.1.tgz#79111a858197f366418845f667fe8f7fac0a79db" - dependencies: - jimp "^0.2.24" - -prebuild-install@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.2.tgz#237888f21bfda441d0ee5f5612484390bccd4046" - dependencies: - detect-libc "^1.0.3" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - napi-build-utils "^1.0.1" - node-abi "^2.2.0" - noop-logger "^0.1.1" - npmlog "^4.0.1" - os-homedir "^1.0.1" - pump "^2.0.1" - rc "^1.2.7" - simple-get "^2.7.0" - tar-fs "^1.13.0" - tunnel-agent "^0.6.0" - which-pm-runs "^1.0.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -prettier@^1.15.2: - version "1.15.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.3.tgz#1feaac5bdd181237b54dbe65d874e02a1472786a" - -pretty-bytes@^4.0.2: - version "4.0.2" - resolved "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" - -pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - dependencies: - renderkid "^2.0.1" - utila "~0.4" - -private@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -probe-image-size@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-4.0.0.tgz#d35b71759e834bcf580ea9f18ec8b9265c0977eb" - dependencies: - any-promise "^1.3.0" - deepmerge "^2.0.1" - inherits "^2.0.3" - next-tick "^1.0.0" - request "^2.83.0" - stream-parser "~0.3.1" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - -progress@^1.1.8: - version "1.1.8" - resolved "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prop-types@^15.5.4, prop-types@^15.6.1, prop-types@^15.6.2: - version "15.6.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" - dependencies: - loose-envify "^1.3.1" - object-assign "^4.1.1" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - -proxy-addr@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.8.0" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - -pseudomap@^1.0.1, pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@2.x.x, punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - -qs@6.5.2, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - -query-string@^5.0.1: - version "5.1.1" - resolved "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0, querystring@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -querystringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.0.3, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@2.3.3, raw-body@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - dependencies: - bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" - unpipe "1.0.0" - -raw-loader@^0.5.1: - version "0.5.1" - resolved "http://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dev-utils@^4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-4.2.3.tgz#5b42d9ea58d5e9e017a2f57a40a8af408a3a46fb" - dependencies: - address "1.0.3" - babel-code-frame "6.26.0" - chalk "1.1.3" - cross-spawn "5.1.0" - detect-port-alt "1.1.3" - escape-string-regexp "1.0.5" - filesize "3.5.11" - global-modules "1.0.0" - gzip-size "3.0.0" - inquirer "3.3.0" - is-root "1.0.0" - opn "5.1.0" - react-error-overlay "^3.0.0" - recursive-readdir "2.2.1" - shell-quote "1.6.1" - sockjs-client "1.1.4" - strip-ansi "3.0.1" - text-table "0.2.0" - -react-dom@^16.6.3: - version "16.6.3" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.6.3.tgz#8fa7ba6883c85211b8da2d0efeffc9d3825cccc0" - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.11.2" - -react-error-overlay@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-3.0.0.tgz#c2bc8f4d91f1375b3dad6d75265d51cd5eeaf655" - -react-helmet@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.2.0.tgz#a81811df21313a6d55c5f058c4aeba5d6f3d97a7" - dependencies: - deep-equal "^1.0.1" - object-assign "^4.1.1" - prop-types "^15.5.4" - react-side-effect "^1.1.0" - -react-hot-loader@^4.5.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.5.3.tgz#d7e5cd04fd6ae7c482404202d5f162e4eaefb268" - dependencies: - fast-levenshtein "^2.0.6" - global "^4.3.0" - hoist-non-react-statics "^2.5.0" - loader-utils "^1.1.0" - lodash.merge "^4.6.1" - prop-types "^15.6.1" - react-lifecycles-compat "^3.0.4" - shallowequal "^1.0.2" - source-map "^0.7.3" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - -react-side-effect@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.1.5.tgz#f26059e50ed9c626d91d661b9f3c8bb38cd0ff2d" - dependencies: - exenv "^1.2.1" - shallowequal "^1.0.1" - -react@^16.6.3: - version "16.6.3" - resolved "https://registry.yarnpkg.com/react/-/react-16.6.3.tgz#25d77c91911d6bbdd23db41e70fb094cc1e0871c" - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.11.2" - -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - -read-chunk@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194" - -read-chunk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.0.0.tgz#086cd198406104355626afacd2d21084afc367ec" - dependencies: - pify "^4.0.0" - with-open-file "^0.1.3" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -read@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - dependencies: - mute-stream "~0.0.4" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.31: - version "1.0.34" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a" - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -recursive-readdir@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99" - dependencies: - minimatch "3.0.3" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redux@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - -regenerate-unicode-properties@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" - dependencies: - regenerate "^1.4.0" - -regenerate@^1.2.1, regenerate@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" - -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" - dependencies: - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^1.0.1: - version "1.1.0" - resolved "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - -regexpu-core@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^4.1.3, regexpu-core@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^7.0.0" - regjsgen "^0.5.0" - regjsparser "^0.6.0" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.0.2" - -registry-auth-token@^3.0.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsgen@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -regjsparser@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" - dependencies: - jsesc "~0.5.0" - -relay-compiler@1.5.0: - version "1.5.0" - resolved "http://registry.npmjs.org/relay-compiler/-/relay-compiler-1.5.0.tgz#564f1582c549fa6b4af9d9f09dadb5e239c11055" - dependencies: - babel-generator "^6.26.0" - babel-polyfill "^6.20.0" - babel-preset-fbjs "^2.1.4" - babel-runtime "^6.23.0" - babel-traverse "^6.26.0" - babel-types "^6.24.1" - babylon "^7.0.0-beta" - chalk "^1.1.1" - fast-glob "^2.0.0" - fb-watchman "^2.0.0" - fbjs "^0.8.14" - graphql "^0.13.0" - immutable "~3.7.6" - relay-runtime "1.5.0" - signedsource "^1.0.0" - yargs "^9.0.0" - -relay-runtime@1.5.0: - version "1.5.0" - resolved "http://registry.npmjs.org/relay-runtime/-/relay-runtime-1.5.0.tgz#95e7c26f95f216370f7d699290238a4d966a915c" - dependencies: - babel-runtime "^6.23.0" - fbjs "^0.8.14" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -renderkid@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" - dependencies: - css-select "^1.1.0" - dom-converter "~0.2" - htmlparser2 "~3.3.0" - strip-ansi "^3.0.0" - utila "^0.4.0" - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - -request@^2.65.0, request@^2.83.0, request@^2.85.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-from-string@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-uncached@^1.0.3: - version "1.0.3" - resolved "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - dependencies: - path-parse "^1.0.5" - -responselike@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - -rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.0, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - dependencies: - aproba "^1.1.1" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -scheduler@^0.11.2: - version "0.11.3" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -scroll-behavior@^0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/scroll-behavior/-/scroll-behavior-0.9.9.tgz#ebfe0658455b82ad885b66195215416674dacce2" - dependencies: - dom-helpers "^3.2.1" - invariant "^2.2.2" - -seek-bzip@^1.0.3, seek-bzip@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - dependencies: - commander "~2.8.1" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - -selfsigned@^1.9.1: - version "1.10.4" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" - dependencies: - node-forge "0.7.5" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -semver-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" - -semver-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" - -semver-truncate@^1.0.0, semver-truncate@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" - dependencies: - semver "^5.3.0" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - -semver@^4.0.3: - version "4.3.6" - resolved "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.4.0" - -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - -serve-index@^1.7.2: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-compare@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/shallow-compare/-/shallow-compare-1.2.2.tgz#fa4794627bf455a47c4f56881d8a6132d581ffdb" - -shallowequal@^1.0.1, shallowequal@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - -sharp@^0.21.0: - version "0.21.1" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.21.1.tgz#21e3f3a4271039b0e95ac3c58baea475ee6fb661" - dependencies: - bindings "^1.3.1" - color "^3.1.0" - detect-libc "^1.0.3" - fs-copy-file-sync "^1.1.1" - nan "^2.11.1" - npmlog "^4.1.2" - prebuild-install "^5.2.2" - semver "^5.6.0" - simple-get "^3.0.3" - tar "^4.4.8" - tunnel-agent "^0.6.0" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shell-quote@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -sift@^5.1.0: - version "5.1.0" - resolved "http://registry.npmjs.org/sift/-/sift-5.1.0.tgz#1bbf2dfb0eb71e56c4cc7fb567fbd1351b65015e" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -signedsource@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" - -simple-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - -simple-get@^2.7.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-get@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa" - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - dependencies: - is-arrayish "^0.3.1" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socket.io-adapter@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" - -socket.io-client@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" - dependencies: - backo2 "1.0.2" - base64-arraybuffer "0.1.5" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.3.1" - has-binary2 "~1.0.2" - has-cors "1.1.0" - indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" - dependencies: - component-emitter "1.2.1" - debug "~3.1.0" - isarray "2.0.1" - -socket.io@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" - dependencies: - debug "~4.1.0" - engine.io "~3.3.1" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.2.0" - socket.io-parser "~3.3.0" - -sockjs-client@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" - dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" - json3 "^3.3.2" - url-parse "^1.1.8" - -sockjs-client@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -sort-keys-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - dependencies: - sort-keys "^1.0.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.6: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - -sparkles@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" - -spdy-transport@^2.0.18: - version "2.1.1" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.1.tgz#c54815d73858aadd06ce63001e7d25fa6441623b" - dependencies: - debug "^2.6.8" - detect-node "^2.0.3" - hpack.js "^2.1.6" - obuf "^1.1.1" - readable-stream "^2.2.9" - safe-buffer "^5.0.1" - wbuf "^1.7.2" - -spdy@^3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" - dependencies: - debug "^2.6.8" - handle-thing "^1.2.5" - http-deceiver "^1.2.7" - safe-buffer "^5.0.1" - select-hose "^2.0.0" - spdy-transport "^2.0.18" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -squeak@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" - dependencies: - chalk "^1.0.0" - console-stream "^0.1.1" - lpad-align "^1.0.1" - -sshpk@^1.7.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - dependencies: - figgy-pudding "^3.5.1" - -stable@~0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - -stack-trace@^0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - -stackframe@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.0.4.tgz#357b24a992f9427cba6b545d96a14ed2cbca187b" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-parser@~0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" - dependencies: - debug "2" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -stream-to-buffer@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9" - dependencies: - stream-to "~0.2.0" - -stream-to@~0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string-similarity@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-1.2.2.tgz#99b2c20a3c9bbb3903964eae1d89856db3d8db9b" - dependencies: - lodash.every "^4.6.0" - lodash.flattendeep "^4.4.0" - lodash.foreach "^4.5.0" - lodash.map "^4.6.0" - lodash.maxby "^4.6.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.2.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - -strip-dirs@^1.0.0: - version "1.1.1" - resolved "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" - dependencies: - chalk "^1.0.0" - get-stdin "^4.0.1" - is-absolute "^0.1.5" - is-natural-number "^2.0.0" - minimist "^1.1.0" - sum-up "^1.0.1" - -strip-dirs@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" - dependencies: - is-natural-number "^4.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -strip-outer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" - dependencies: - escape-string-regexp "^1.0.2" - -style-loader@^0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" - dependencies: - loader-utils "^1.1.0" - schema-utils "^0.4.5" - -stylehacks@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.1.tgz#3186595d047ab0df813d213e51c8b94e0b9010f2" - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -sum-up@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - dependencies: - chalk "^1.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - dependencies: - has-flag "^3.0.0" - -svgo@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -svgo@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985" - dependencies: - coa "~2.0.1" - colors "~1.1.2" - css-select "^2.0.0" - css-select-base-adapter "~0.1.0" - css-tree "1.0.0-alpha.28" - css-url-regex "^1.1.0" - csso "^3.5.0" - js-yaml "^3.12.0" - mkdirp "~0.5.1" - object.values "^1.0.4" - sax "~1.2.4" - stable "~0.1.6" - unquote "~1.1.1" - util.promisify "~1.0.0" - -symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" - -tar-fs@^1.13.0: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-stream@^1.1.1, tar-stream@^1.1.2, tar-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - dependencies: - bl "^1.0.0" - buffer-alloc "^1.2.0" - end-of-stream "^1.0.0" - fs-constants "^1.0.0" - readable-stream "^2.3.0" - to-buffer "^1.1.1" - xtend "^4.0.0" - -tar@^4, tar@^4.4.8: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - -tempfile@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" - dependencies: - os-tmpdir "^1.0.0" - uuid "^2.0.1" - -tempfile@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" - dependencies: - temp-dir "^1.0.0" - uuid "^3.0.1" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - dependencies: - execa "^0.7.0" - -terser-webpack-plugin@^1.0.2, terser-webpack-plugin@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" - dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - terser "^3.8.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -terser@^3.8.1: - version "3.11.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" - dependencies: - commander "~2.17.1" - source-map "~0.6.1" - source-map-support "~0.5.6" - -text-table@0.2.0, text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^0.6.0, through2@^0.6.1: - version "0.6.5" - resolved "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@^2.0.1, through2@~2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -thunky@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -timed-out@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - -tinycolor2@^1.1.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" - -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - dependencies: - extend-shallow "^2.0.1" - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - -topo@2.x.x: - version "2.0.2" - resolved "http://registry.npmjs.org/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" - dependencies: - hoek "4.x.x" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - dependencies: - escape-string-regexp "^1.0.2" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - -tslib@^1.6.0, tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.16: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -type-of@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-of/-/type-of-2.0.1.tgz#e72a1741896568e9f628378d816d6912f7f23972" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -ua-parser-js@^0.7.18: - version "0.7.19" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" - -unbzip2-stream@^1.0.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.1.tgz#7854da51622a7e63624221196357803b552966a1" - dependencies: - buffer "^3.0.1" - through "^2.3.6" - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - -unique-filename@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - dependencies: - imurmurhash "^0.1.4" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - -update-notifier@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url-loader@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" - dependencies: - loader-utils "^1.1.0" - mime "^2.0.3" - schema-utils "^1.0.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - dependencies: - prepend-http "^2.0.0" - -url-parse@^1.1.8, url-parse@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" - dependencies: - querystringify "^2.0.0" - requires-port "^1.0.0" - -url-regex@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" - dependencies: - ip-regex "^1.0.1" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util.promisify@^1.0.0, util.promisify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3: - version "0.10.3" - resolved "http://registry.npmjs.org/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - dependencies: - inherits "2.0.3" - -utila@^0.4.0, utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - -uuid@^2.0.1: - version "2.0.3" - resolved "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - -v8-compile-cache@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz#8d32e4f16974654657e676e0e467a348e89b0dc4" - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - -valid-url@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-assign@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" - dependencies: - object-assign "^4.0.1" - readable-stream "^2.0.0" - -vinyl-fs@^2.2.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" - graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" - lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" - through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" - -vinyl@^0.4.3: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -ware@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" - dependencies: - wrap-fn "^0.1.0" - -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - dependencies: - loose-envify "^1.0.0" - -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - dependencies: - minimalistic-assert "^1.0.0" - -webpack-dev-middleware@3.4.0, webpack-dev-middleware@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" - dependencies: - memory-fs "~0.4.1" - mime "^2.3.1" - range-parser "^1.0.3" - webpack-log "^2.0.0" - -webpack-dev-server@^3.1.1: - version "3.1.10" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b" - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.0.0" - compression "^1.5.2" - connect-history-api-fallback "^1.3.0" - debug "^3.1.0" - del "^3.0.0" - express "^4.16.2" - html-entities "^1.2.0" - http-proxy-middleware "~0.18.0" - import-local "^2.0.0" - internal-ip "^3.0.1" - ip "^1.1.5" - killable "^1.0.0" - loglevel "^1.4.1" - opn "^5.1.0" - portfinder "^1.0.9" - schema-utils "^1.0.0" - selfsigned "^1.9.1" - serve-index "^1.7.2" - sockjs "0.3.19" - sockjs-client "1.3.0" - spdy "^3.4.1" - strip-ansi "^3.0.0" - supports-color "^5.1.0" - webpack-dev-middleware "3.4.0" - webpack-log "^2.0.0" - yargs "12.0.2" - -webpack-hot-middleware@^2.21.0: - version "2.24.3" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.24.3.tgz#5bb76259a8fc0d97463ab517640ba91d3382d4a6" - dependencies: - ansi-html "0.0.7" - html-entities "^1.2.0" - querystring "^0.2.0" - strip-ansi "^3.0.0" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-merge@^4.1.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.5.tgz#2be31e846c20767d1bef56bdca64c328a681190a" - dependencies: - lodash "^4.17.5" - -webpack-sources@^1.1.0, webpack-sources@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-stats-plugin@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/webpack-stats-plugin/-/webpack-stats-plugin-0.1.5.tgz#29e5f12ebfd53158d31d656a113ac1f7b86179d9" - -webpack@^4.12.0: - version "4.27.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.27.1.tgz#5f2e2db446d2266376fa15d7d2277a1a9c2e12bb" - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/wasm-edit" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.1.0" - terser-webpack-plugin "^1.1.0" - watchpack "^1.5.0" - webpack-sources "^1.3.0" - -websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - dependencies: - http-parser-js ">=0.4.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - -whatwg-fetch@2.0.4: - version "2.0.4" - resolved "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - -whatwg-fetch@>=0.10.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - -which@^1.2.14, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - dependencies: - string-width "^2.1.1" - -with-open-file@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.4.tgz#797e32055cbe55c58727ad026482fb0776474b2c" - dependencies: - p-finally "^1.0.0" - p-try "^2.0.0" - pify "^3.0.0" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -workbox-background-sync@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-3.6.3.tgz#6609a0fac9eda336a7c52e6aa227ba2ae532ad94" - dependencies: - workbox-core "^3.6.3" - -workbox-broadcast-cache-update@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.6.3.tgz#3f5dff22ada8c93e397fb38c1dc100606a7b92da" - dependencies: - workbox-core "^3.6.3" - -workbox-build@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-3.6.3.tgz#77110f9f52dc5d82fa6c1c384c6f5e2225adcbd8" - dependencies: - babel-runtime "^6.26.0" - common-tags "^1.4.0" - fs-extra "^4.0.2" - glob "^7.1.2" - joi "^11.1.1" - lodash.template "^4.4.0" - pretty-bytes "^4.0.2" - stringify-object "^3.2.2" - strip-comments "^1.0.2" - workbox-background-sync "^3.6.3" - workbox-broadcast-cache-update "^3.6.3" - workbox-cache-expiration "^3.6.3" - workbox-cacheable-response "^3.6.3" - workbox-core "^3.6.3" - workbox-google-analytics "^3.6.3" - workbox-navigation-preload "^3.6.3" - workbox-precaching "^3.6.3" - workbox-range-requests "^3.6.3" - workbox-routing "^3.6.3" - workbox-strategies "^3.6.3" - workbox-streams "^3.6.3" - workbox-sw "^3.6.3" - -workbox-cache-expiration@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-cache-expiration/-/workbox-cache-expiration-3.6.3.tgz#4819697254a72098a13f94b594325a28a1e90372" - dependencies: - workbox-core "^3.6.3" - -workbox-cacheable-response@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-3.6.3.tgz#869f1a68fce9063f6869ddbf7fa0a2e0a868b3aa" - dependencies: - workbox-core "^3.6.3" - -workbox-core@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-3.6.3.tgz#69abba70a4f3f2a5c059295a6f3b7c62bd00e15c" - -workbox-google-analytics@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-3.6.3.tgz#99df2a3d70d6e91961e18a6752bac12e91fbf727" - dependencies: - workbox-background-sync "^3.6.3" - workbox-core "^3.6.3" - workbox-routing "^3.6.3" - workbox-strategies "^3.6.3" - -workbox-navigation-preload@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-3.6.3.tgz#a2c34eb7c17e7485b795125091215f757b3c4964" - dependencies: - workbox-core "^3.6.3" - -workbox-precaching@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-3.6.3.tgz#5341515e9d5872c58ede026a31e19bafafa4e1c1" - dependencies: - workbox-core "^3.6.3" - -workbox-range-requests@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-3.6.3.tgz#3cc21cba31f2dd8c43c52a196bcc8f6cdbcde803" - dependencies: - workbox-core "^3.6.3" - -workbox-routing@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-3.6.3.tgz#659cd8f9274986cfa98fda0d050de6422075acf7" - dependencies: - workbox-core "^3.6.3" - -workbox-strategies@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-3.6.3.tgz#11a0dc249a7bc23d3465ec1322d28fa6643d64a0" - dependencies: - workbox-core "^3.6.3" - -workbox-streams@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-3.6.3.tgz#beaea5d5b230239836cc327b07d471aa6101955a" - dependencies: - workbox-core "^3.6.3" - -workbox-sw@^3.6.3: - version "3.6.3" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-3.6.3.tgz#278ea4c1831b92bbe2d420da8399176c4b2789ff" - -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-fn@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" - dependencies: - co "3.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -ws@~6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" - dependencies: - async-limiter "~1.0.0" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - -xhr@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" - dependencies: - global "~4.3.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xml-parse-from-string@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28" - -xml2js@^0.4.5: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - -xstate@^3.1.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/xstate/-/xstate-3.3.3.tgz#64177cd4473d4c2424b3df7d2434d835404b09a9" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - -yallist@^2.0.0, yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - -yaml-loader@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/yaml-loader/-/yaml-loader-0.5.0.tgz#86b1982d84a8e429e6647d93de9a0169e1c15827" - dependencies: - js-yaml "^3.5.2" - -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - dependencies: - camelcase "^4.1.0" - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - dependencies: - camelcase "^4.1.0" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - dependencies: - camelcase "^4.1.0" - -yargs@12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - dependencies: - cliui "^4.0.0" - decamelize "^2.0.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" - -yargs@^11.1.0: - version "11.1.0" - resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" - -yargs@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yauzl@^2.2.1, yauzl@^2.4.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - -yurnalist@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/yurnalist/-/yurnalist-0.2.1.tgz#2d32b9618ab6491891c131bd90a5295e19fd4bad" - dependencies: - chalk "^1.1.1" - death "^1.0.0" - debug "^2.2.0" - detect-indent "^5.0.0" - inquirer "^3.0.1" - invariant "^2.2.0" - is-builtin-module "^1.0.0" - is-ci "^1.0.10" - leven "^2.0.0" - loud-rejection "^1.2.0" - node-emoji "^1.0.4" - object-path "^0.11.2" - read "^1.0.7" - rimraf "^2.5.0" - semver "^5.1.0" - strip-bom "^3.0.0" - -zen-observable-ts@^0.8.11: - version "0.8.11" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.11.tgz#d54a27cd17dc4b4bb6bd008e5c096af7fcb068a9" - dependencies: - zen-observable "^0.8.0" - -zen-observable@^0.8.0: - version "0.8.11" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.11.tgz#d3415885eeeb42ee5abb9821c95bb518fcd6d199"