(this.nativeLog||function(e){console.log(e)})("Start JS Framework 0.29.6, Build at 2019-04-08 17:04. (Vue: 2.5.16-weex.5, Rax: 0.4.20)");var global=this,process={env:{}},setTimeout=global.setTimeout;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";var t,c,r,l;function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function n(e,t){return e(t={exports:{}},t.exports),t.exports}Array.from||(Array.from=(t=Object.prototype.toString,c=function(e){return"function"==typeof e||"[object Function]"===t.call(e)},r=Math.pow(2,53)-1,l=function(e){var t,n=(t=Number(e),isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t);return Math.min(Math.max(n,0),r)},function(e){var t=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var n,r=1<arguments.length?arguments[1]:void 0;if(void 0!==r){if(!c(r))throw new TypeError("Array.from: when provided, the second argument must be a function");2<arguments.length&&(n=arguments[2])}for(var o,i=l(t.length),a=c(this)?Object(new this(i)):new Array(i),s=0;s<i;)o=t[s],a[s]=r?void 0===n?r(o,s):r.call(n,o,s):o,s+=1;return a.length=i,a}));var v=n(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),m=n(function(e){var t=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=t)}),o=(m.version,function(e){return"object"==typeof e?null!==e:"function"==typeof e}),y=function(e){if(!o(e))throw TypeError(e+" is not an object!");return e},i=function(e){try{return!!e()}catch(e){return!0}},a=!i(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),s=v.document,u=o(s)&&o(s.createElement),f=function(e){return u?s.createElement(e):{}},p=!a&&!i(function(){return 7!=Object.defineProperty(f("div"),"a",{get:function(){return 7}}).a}),d=Object.defineProperty,h={f:a?Object.defineProperty:function(e,t,n){if(y(e),t=function(e,t){if(!o(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!o(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!o(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")}(t,!0),y(n),p)try{return d(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},k=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},S=a?function(e,t,n){return h.f(e,t,k(1,n))}:function(e,t,n){return e[t]=n,e},g={}.hasOwnProperty,_=function(e,t){return g.call(e,t)},b=0,w=Math.random(),O=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++b+w).toString(36))},C=n(function(e){var i=O("src"),t="toString",n=Function[t],a=(""+n).split(t);m.inspectSource=function(e){return n.call(e)},(e.exports=function(e,t,n,r){var o="function"==typeof n;o&&(_(n,"name")||S(n,"name",t)),e[t]!==n&&(o&&(_(n,i)||S(n,i,e[t]?""+e[t]:a.join(String(t)))),e===v?e[t]=n:r?e[t]?e[t]=n:S(e,t,n):(delete e[t],S(e,t,n)))})(Function.prototype,t,function(){return"function"==typeof this&&this[i]||n.call(this)})}),x=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},E=function(r,o,e){if(x(r),void 0===o)return r;switch(e){case 1:return function(e){return r.call(o,e)};case 2:return function(e,t){return r.call(o,e,t)};case 3:return function(e,t,n){return r.call(o,e,t,n)}}return function(){return r.apply(o,arguments)}},$="prototype",A=function(e,t,n){var r,o,i,a,s=e&A.F,c=e&A.G,l=e&A.S,u=e&A.P,f=e&A.B,p=c?v:l?v[t]||(v[t]={}):(v[t]||{})[$],d=c?m:m[t]||(m[t]={}),h=d[$]||(d[$]={});for(r in c&&(n=t),n)i=((o=!s&&p&&void 0!==p[r])?p:n)[r],a=f&&o?E(i,v):u&&"function"==typeof i?E(Function.call,i):i,p&&C(p,r,i,e&A.U),d[r]!=i&&S(d,r,a),u&&h[r]!=i&&(h[r]=i)};v.core=m,A.F=1,A.G=2,A.S=4,A.P=8,A.B=16,A.W=32,A.U=64,A.R=128;var j,I=A,M={}.toString,T=function(e){return M.call(e).slice(8,-1)},P=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==T(e)?e.split(""):Object(e)},F=function(e){if(null==e)throw TypeError("Can't call method on  "+e);return e},N=function(e){return P(F(e))},R=Math.ceil,D=Math.floor,V=function(e){return isNaN(e=+e)?0:(0<e?D:R)(e)},L=Math.min,J=function(e){return 0<e?L(V(e),9007199254740991):0},W=Math.max,q=Math.min,B=n(function(e){var t="__core-js_shared__",n=v[t]||(v[t]={});(e.exports=function(e,t){return n[e]||(n[e]=void 0!==t?t:{})})("versions",[]).push({version:m.version,mode:"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})}),U=B("keys"),z=function(e){return U[e]||(U[e]=O(e))},H=(j=!1,function(e,t,n){var r,o,i,a=N(e),s=J(a.length),c=(o=s,(r=V(r=n))<0?W(r+o,0):q(r,o));if(j&&t!=t){for(;c<s;)if((i=a[c++])!=i)return!0}else for(;c<s;c++)if((j||c in a)&&a[c]===t)return j||c||0;return!j&&-1}),G=z("IE_PROTO"),X="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),K=Object.keys||function(e){return function(e,t){var n,r=N(e),o=0,i=[];for(n in r)n!=G&&_(r,n)&&i.push(n);for(;t.length>o;)_(r,n=t[o++])&&(~H(i,n)||i.push(n));return i}(e,X)},Z={f:Object.getOwnPropertySymbols},Y={f:{}.propertyIsEnumerable},Q=function(e){return Object(F(e))},ee=Object.assign,te=!ee||i(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=ee({},e)[n]||Object.keys(ee({},t)).join("")!=r})?function(e,t){for(var n=arguments,r=Q(e),o=arguments.length,i=1,a=Z.f,s=Y.f;i<o;)for(var c,l=P(n[i++]),u=a?K(l).concat(a(l)):K(l),f=u.length,p=0;p<f;)s.call(l,c=u[p++])&&(r[c]=l[c]);return r}:ee;I(I.S+I.F,"Object",{assign:te});m.Object.assign;Object.setPrototypeOf||(Object.setPrototypeOf=function(t,n){var r;function o(e,t){return r.call(e,t),e}try{(r=t.getOwnPropertyDescriptor(t.prototype,n).set).call({},null)}catch(e){if(t.prototype!=={}[n])return;r=function(e){this[n]=e},o.polyfill=o(o({},null),t.prototype)instanceof t}return o}(Object,"__proto__"));var ne=global.WXEnvironment;void 0===ne||"iOS"!==ne.platform||ne.__enable_native_promise__||(global.Promise=void 0);var re=n(function(e){var t=B("wks"),n=v.Symbol,r="function"==typeof n;(e.exports=function(e){return t[e]||(t[e]=r&&n[e]||(r?n:O)("Symbol."+e))}).store=t}),oe=re("toStringTag"),ie="Arguments"==T(function(){return arguments}()),ae=function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),oe))?n:ie?T(t):"Object"==(r=T(t))&&"function"==typeof t.callee?"Arguments":r},se={};se[re("toStringTag")]="z",se+""!="[object z]"&&C(Object.prototype,"toString",function(){return"[object "+ae(this)+"]"},!0);var ce={},le=a?Object.defineProperties:function(e,t){y(e);for(var n,r=K(t),o=r.length,i=0;i<o;)h.f(e,n=r[i++],t[n]);return e},ue=v.document,fe=ue&&ue.documentElement,pe=z("IE_PROTO"),de=function(){},he="prototype",ve=function(){var e,t=f("iframe"),n=X.length;for(t.style.display="none",fe.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),ve=e.F;n--;)delete ve[he][X[n]];return ve()},me=Object.create||function(e,t){var n;return null!==e?(de[he]=y(e),n=new de,de[he]=null,n[pe]=e):n=ve(),void 0===t?n:le(n,t)},ye=h.f,ge=re("toStringTag"),_e=function(e,t,n){e&&!_(e=n?e:e.prototype,ge)&&ye(e,ge,{configurable:!0,value:t})},be={};S(be,re("iterator"),function(){return this});var we,ke=z("IE_PROTO"),Se=Object.prototype,Oe=Object.getPrototypeOf||function(e){return e=Q(e),_(e,ke)?e[ke]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Se:null},Ce=re("iterator"),xe=!([].keys&&"next"in[].keys()),Ee="values",$e=function(){return this},Ae=function(e,t,n,r,o,i,a){var s,c,l;c=t,l=r,(s=n).prototype=me(be,{next:k(1,l)}),_e(s,c+" Iterator");var u,f,p,d=function(e){if(!xe&&e in y)return y[e];switch(e){case"keys":case Ee:return function(){return new n(this,e)}}return function(){return new n(this,e)}},h=t+" Iterator",v=o==Ee,m=!1,y=e.prototype,g=y[Ce]||y["@@iterator"]||o&&y[o],_=g||d(o),b=o?v?d("entries"):_:void 0,w="Array"==t&&y.entries||g;if(w&&(p=Oe(w.call(new e)))!==Object.prototype&&p.next&&(_e(p,h,!0),"function"!=typeof p[Ce]&&S(p,Ce,$e)),v&&g&&g.name!==Ee&&(m=!0,_=function(){return g.call(this)}),(xe||m||!y[Ce])&&S(y,Ce,_),ce[t]=_,ce[h]=$e,o)if(u={values:v?_:d(Ee),keys:i?_:d("keys"),entries:b},a)for(f in u)f in y||C(y,f,u[f]);else I(I.P+I.F*(xe||m),t,u);return u},je=(we=!0,function(e,t){var n,r,o=String(F(e)),i=V(t),a=o.length;return i<0||a<=i?we?"":void 0:(n=o.charCodeAt(i))<55296||56319<n||i+1===a||(r=o.charCodeAt(i+1))<56320||57343<r?we?o.charAt(i):n:we?o.slice(i,i+2):r-56320+(n-55296<<10)+65536});Ae(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=je(t,n),this._i+=e.length,{value:e,done:!1})});var Ie=re("unscopables"),Me=Array.prototype;null==Me[Ie]&&S(Me,Ie,{});var Te=function(e){Me[Ie][e]=!0},Pe=function(e,t){return{value:t,done:!!e}},Fe=Ae(Array,"Array",function(e,t){this._t=N(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Pe(1)):Pe(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");ce.Arguments=ce.Array,Te("keys"),Te("values"),Te("entries");for(var Ne=re("iterator"),Re=re("toStringTag"),De=ce.Array,Ve={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},Le=K(Ve),Je=0;Je<Le.length;Je++){var We,qe=Le[Je],Be=Ve[qe],Ue=v[qe],ze=Ue&&Ue.prototype;if(ze&&(ze[Ne]||S(ze,Ne,De),ze[Re]||S(ze,Re,qe),ce[qe]=De,Be))for(We in Fe)ze[We]||C(ze,We,Fe[We],!0)}var He,Ge,Xe,Ke=function(t,e,n,r){try{return r?e(y(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&y(o.call(t)),e}},Ze=re("iterator"),Ye=Array.prototype,Qe=re("iterator"),et=m.getIteratorMethod=function(e){if(null!=e)return e[Qe]||e["@@iterator"]||ce[ae(e)]},tt=n(function(e){var d={},h={},t=e.exports=function(e,t,n,r,o){var i,a,s,c,l,u=o?function(){return e}:et(e),f=E(n,r,t?2:1),p=0;if("function"!=typeof u)throw TypeError(e+" is not iterable!");if(void 0===(l=u)||ce.Array!==l&&Ye[Ze]!==l){for(s=u.call(e);!(a=s.next()).done;)if((c=Ke(s,f,a.value,t))===d||c===h)return c}else for(i=J(e.length);p<i;p++)if((c=t?f(y(a=e[p])[0],a[1]):f(e[p]))===d||c===h)return c};t.BREAK=d,t.RETURN=h}),nt=re("species"),rt=v.process,ot=v.setImmediate,it=v.clearImmediate,at=v.MessageChannel,st=v.Dispatch,ct=0,lt={},ut="onreadystatechange",ft=function(){var e=+this;if(lt.hasOwnProperty(e)){var t=lt[e];delete lt[e],t()}},pt=function(e){ft.call(e.data)};ot&&it||(ot=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return lt[++ct]=function(){!function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}e.apply(n,t)}("function"==typeof e?e:Function(e),n)},He(ct),ct},it=function(e){delete lt[e]},"process"==T(rt)?He=function(e){rt.nextTick(E(ft,e,1))}:st&&st.now?He=function(e){st.now(E(ft,e,1))}:at?(Xe=(Ge=new at).port2,Ge.port1.onmessage=pt,He=E(Xe.postMessage,Xe,1)):v.addEventListener&&"function"==typeof postMessage&&!v.importScripts?(He=function(e){v.postMessage(e+"","*")},v.addEventListener("message",pt,!1)):He=ut in f("script")?function(e){fe.appendChild(f("script"))[ut]=function(){fe.removeChild(this),ft.call(e)}}:function(e){setTimeout(E(ft,e,1),0)});var dt={set:ot,clear:it},ht=dt.set,vt=v.MutationObserver||v.WebKitMutationObserver,mt=v.process,yt=v.Promise,gt="process"==T(mt);function _t(e){var n,r;this.promise=new e(function(e,t){if(void 0!==n||void 0!==r)throw TypeError("Bad Promise constructor");n=e,r=t}),this.resolve=x(n),this.reject=x(r)}var bt={f:function(e){return new _t(e)}},wt=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},kt=v.navigator,St=kt&&kt.userAgent||"",Ot=re("species"),Ct=re("iterator"),xt=!1;try{[7][Ct]().return=function(){xt=!0}}catch(e){}var Et,$t,At,jt,It,Mt=dt.set,Tt=function(){var n,r,o,e=function(){var e,t;for(gt&&(e=mt.domain)&&e.exit();n;){t=n.fn,n=n.next;try{t()}catch(e){throw n?o():r=void 0,e}}r=void 0,e&&e.enter()};if(gt)o=function(){mt.nextTick(e)};else if(!vt||v.navigator&&v.navigator.standalone)if(yt&&yt.resolve){var t=yt.resolve(void 0);o=function(){t.then(e)}}else o=function(){ht.call(v,e)};else{var i=!0,a=document.createTextNode("");new vt(e).observe(a,{characterData:!0}),o=function(){a.data=i=!i}}return function(e){var t={fn:e,next:void 0};r&&(r.next=t),n||(n=t,o()),r=t}}(),Pt="Promise",Ft=v.TypeError,Nt=v.process,Rt=Nt&&Nt.versions,Dt=Rt&&Rt.v8||"",Vt=v[Pt],Lt="process"==ae(Nt),Jt=function(){},Wt=$t=bt.f,qt=!!function(){try{var e=Vt.resolve(1),t=(e.constructor={})[re("species")]=function(e){e(Jt,Jt)};return(Lt||"function"==typeof PromiseRejectionEvent)&&e.then(Jt)instanceof t&&0!==Dt.indexOf("6.6")&&-1===St.indexOf("Chrome/66")}catch(e){}}(),Bt=function(e){var t;return!(!o(e)||"function"!=typeof(t=e.then))&&t},Ut=function(u,n){if(!u._n){u._n=!0;var r=u._c;Tt(function(){for(var c=u._v,l=1==u._s,e=0,t=function(e){var t,n,r,o=l?e.ok:e.fail,i=e.resolve,a=e.reject,s=e.domain;try{o?(l||(2==u._h&&Gt(u),u._h=1),!0===o?t=c:(s&&s.enter(),t=o(c),s&&(s.exit(),r=!0)),t===e.promise?a(Ft("Promise-chain cycle")):(n=Bt(t))?n.call(t,i,a):i(t)):a(c)}catch(e){s&&!r&&s.exit(),a(e)}};r.length>e;)t(r[e++]);u._c=[],u._n=!1,n&&!u._h&&zt(u)})}},zt=function(i){Mt.call(v,function(){var e,t,n,r=i._v,o=Ht(i);if(o&&(e=wt(function(){Lt?Nt.emit("unhandledRejection",r,i):(t=v.onunhandledrejection)?t({promise:i,reason:r}):(n=v.console)&&n.error&&n.error("Unhandled promise rejection",r)}),i._h=Lt||Ht(i)?2:1),i._a=void 0,o&&e.e)throw e.v})},Ht=function(e){return 1!==e._h&&0===(e._a||e._c).length},Gt=function(t){Mt.call(v,function(){var e;Lt?Nt.emit("rejectionHandled",t):(e=v.onrejectionhandled)&&e({promise:t,reason:t._v})})},Xt=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),Ut(t,!0))},Kt=function(e){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw Ft("Promise can't be resolved itself");(n=Bt(e))?Tt(function(){var t={_w:r,_d:!1};try{n.call(e,E(Kt,t,1),E(Xt,t,1))}catch(e){Xt.call(t,e)}}):(r._v=e,r._s=1,Ut(r,!1))}catch(e){Xt.call({_w:r,_d:!1},e)}}};qt||(Vt=function(e){!function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!")}(this,Vt,Pt,"_h"),x(e),Et.call(this);try{e(E(Kt,this,1),E(Xt,this,1))}catch(e){Xt.call(this,e)}},(Et=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=function(e,t,n){for(var r in t)C(e,r,t[r],n);return e}(Vt.prototype,{then:function(e,t){var n,r,o,i=Wt((n=Vt,void 0===(o=y(this).constructor)||null==(r=y(o)[nt])?n:x(r)));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=Lt?Nt.domain:void 0,this._c.push(i),this._a&&this._a.push(i),this._s&&Ut(this,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),At=function(){var e=new Et;this.promise=e,this.resolve=E(Kt,e,1),this.reject=E(Xt,e,1)},bt.f=Wt=function(e){return e===Vt||e===jt?new At(e):$t(e)}),I(I.G+I.W+I.F*!qt,{Promise:Vt}),_e(Vt,Pt),It=v[Pt],a&&It&&!It[Ot]&&h.f(It,Ot,{configurable:!0,get:function(){return this}}),jt=m[Pt],I(I.S+I.F*!qt,Pt,{reject:function(e){var t=Wt(this);return(0,t.reject)(e),t.promise}}),I(I.S+I.F*!qt,Pt,{resolve:function(e){return function(e,t){if(y(e),o(t)&&t.constructor===e)return t;var n=bt.f(e);return(0,n.resolve)(t),n.promise}(this,e)}}),I(I.S+I.F*!(qt&&function(e,t){if(!t&&!xt)return!1;var n=!1;try{var r=[7],o=r[Ct]();o.next=function(){return{done:n=!0}},r[Ct]=function(){return o},e(r)}catch(e){}return n}(function(e){Vt.all(e).catch(Jt)})),Pt,{all:function(e){var a=this,t=Wt(a),s=t.resolve,c=t.reject,n=wt(function(){var r=[],o=0,i=1;tt(e,!1,function(e){var t=o++,n=!1;r.push(void 0),i++,a.resolve(e).then(function(e){n||(n=!0,r[t]=e,--i||s(r))},c)}),--i||s(r)});return n.e&&c(n.v),t.promise},race:function(e){var t=this,n=Wt(t),r=n.reject,o=wt(function(){tt(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var Zt=1;function Yt(){return(Zt++).toString()}function Qt(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1)}function en(e){return"[object Object]"===Object.prototype.toString.call(e)}function tn(e){if("function"!=typeof btoa)return"";var t=Array.prototype.map.call(new Uint8Array(e),function(e){return String.fromCharCode(e)}).join("");return btoa(t)}function nn(e){if(!e||"object"!=typeof e)return!0;for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}var rn=["off","error","warn","info","log","debug"],on={};function an(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return on[t]&&on[t][e]}function sn(e){global.nativeLog("wxInteractionAnalyzer: [jsfm]"+e,"__DEBUG")}global.console;function cn(e){return e.map(function(e){return e="[object object]"===Object.prototype.toString.call(e).toLowerCase()?JSON.stringify(e):String(e)})}global.setTimeout;var ln=global.setTimeoutNative;function un(t,n,r){if(t.hasOwnProperty(n)){var e=t[n];Object.defineProperty(t,n,{get:function(){return e},set:function(e){if(this===t)throw Error("Cannot assign to read only property "+n+" of "+r);return Object.defineProperty(this,n,{value:e,writable:!0}),e}})}}!function(){if(void 0===setTimeout&&"function"==typeof ln){var n={},r=0;global.setTimeout=function(e,t){n[++r]=e,ln(r.toString(),t)},global.setTimeoutCallback=function(e){"function"==typeof n[e]&&(n[e](),delete n[e])}}}(),"undefined"==typeof WXEnvironment||WXEnvironment.__enable_native_promise__,function(){if(rn.forEach(function(t){var n=rn.indexOf(t);on[t]={},rn.forEach(function(e){rn.indexOf(e)<=n&&(on[t][e]=!0)})}),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("debug")&&global.nativeLog.apply(global,cn(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("log")&&global.nativeLog.apply(global,cn(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("info")&&global.nativeLog.apply(global,cn(e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("warn")&&global.nativeLog.apply(global,cn(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("error")&&global.nativeLog.apply(global,cn(e).concat(["__ERROR"]))}};else{var e=console.debug,t=console.log,n=console.info,r=console.warn,o=console.error;console.__ori__={debug:e,log:t,info:n,warn:r,error:o},console.debug=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];an("error")&&console.__ori__.error.apply(console,e)}}}();var fn={framework:"0.29.6",transformer:">=0.1.5 <0.5"};function pn(e,t,n){return t+"@"+n+"#"+e}var dn=function(e){this.instanceId=String(e),this.lastCallbackId=0,this.callbacks={},this.hooks={}};dn.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},dn.prototype.remove=function(e){var t=this.callbacks[e];return delete this.callbacks[e],t},dn.prototype.registerHook=function(e,t,n,r){var o=pn(e,t,n);this.hooks[o]&&console.warn('[JS Framework] Override an existing component hook "'+o+'".'),this.hooks[o]=r},dn.prototype.triggerHook=function(e,t,n,r){var o=pn(e,t,n),i=this.hooks[o];if("function"!=typeof i)return console.error("[JS Framework] Invalid hook function type ("+typeof i+') on "'+o+'".'),null;var a=null;try{a=i.apply(null,r||[])}catch(e){throw console.error('[JS Framework] Failed to execute the hook function on "'+o+'".'),e}return a},dn.prototype.consume=function(e,t,n){var r=this.callbacks[e];if(void 0!==n&&!1!==n||delete this.callbacks[e],"function"==typeof r)try{return r.call(null,t)}catch(e){throw console.error("[JS Framework] Failed to execute the callback function:\n "+e.toString()),e}return new Error('invalid callback id "'+e+'"')},dn.prototype.close=function(){this.callbacks={},this.hooks={}};var hn={};function vn(e){return hn[e]}function mn(e){var t=hn[e];return t&&t.taskCenter?t.taskCenter:null}function yn(e,t,n){var r=e.documentElement;if(!(0<r.pureChildren.length||t.parentNode)){var o,i,a=r.children,s=a.indexOf(n);s<0?a.push(t):a.splice(s,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,_n(t,r)):(t.children.forEach(function(e){e.parentNode=t}),gn(e,t),t.docId=e.id,t.ownerDocument=e,_n(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),o=e,i=t.toJSON(),o&&o.taskCenter&&"function"==typeof o.taskCenter.send&&o.taskCenter.send("dom",{action:"createBody"},[i])):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function gn(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function _n(t,e){(t.parentNode=e).docId&&(t.docId=e.docId,t.ownerDocument=e.ownerDocument,(t.ownerDocument.nodeMap[t.nodeId]=t).depth=e.depth+1),t.children.forEach(function(e){_n(e,t)})}function bn(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function wn(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function kn(e,t,n,r){n<0&&(n=0);var o=t[n-1],i=t[n];return t.splice(n,0,e),r&&(o&&(o.nextSibling=e),e.previousSibling=o,(e.nextSibling=i)&&(i.previousSibling=e)),n}function Sn(e,t,n,r){var o=t.indexOf(e);if(o<0)return-1;if(r){var i=t[o-1],a=t[o+1];i&&(i.nextSibling=a),a&&(a.previousSibling=i)}t.splice(o,1);var s=n;o<=n&&(s=n-1);var c=t[s-1],l=t[s];return t.splice(s,0,e),r&&(c&&(c.nextSibling=e),e.previousSibling=c,(e.nextSibling=l)&&(l.previousSibling=e)),o===s?-1:n}function On(e,t,n){var r=t.indexOf(e);if(!(r<0)){if(n){var o=t[r-1],i=t[r+1];o&&(o.nextSibling=i),i&&(i.previousSibling=o)}t.splice(r,1)}}var Cn,xn=function(){this.nodeId=Yt(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};xn.prototype.destroy=function(){var e=vn(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var En={};var $n=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"];function An(e,t){vn(e).nodeMap[t.nodeId]=t}var jn=function(o){function e(e,t,n){void 0===e&&(e="div"),o.call(this);var r=En[e];if(r&&!n)return new r(e,t,!0);t=t||{},this.nodeType=1,this.nodeId=Yt(),this.ref=this.nodeId,this.type=e,this.attr=t.attr||{},this.style=t.style||{},this.classStyle=t.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return o&&(e.__proto__=o),((e.prototype=Object.create(o&&o.prototype)).constructor=e).prototype.appendChild=function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(an("debug")&&sn("[appendChild]("+this.docId+","+e.type+","+e.ref+") Move <"+e.type+"> to "+this.children.length+" of <"+this.type+"> ("+this.ref+")."),Sn(e,this.children,this.children.length,!0),1===e.nodeType){var t=Sn(e,this.pureChildren,this.pureChildren.length),n=mn(this.docId);if(n&&0<=t)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(an("debug")&&sn("[appendChild]("+this.docId+","+e.type+","+e.ref+") Append <"+e.type+"> to <"+this.type+"> ("+this.ref+")."),_n(e,this),kn(e,this.children,this.children.length,!0),this.docId&&An(this.docId,e),1===e.nodeType){kn(e,this.pureChildren,this.pureChildren.length);var r=mn(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},e.prototype.insertBefore=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(Sn(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=bn(t),r=Sn(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=mn(this.docId);if(o&&0<=r)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(an("debug")&&sn("[insertBefore]("+this.docId+","+e.type+","+e.ref+") Insert <"+e.type+"> to <"+this.type+"> ("+this.ref+"), before ("+t.ref+")."),_n(e,this),kn(e,this.children,this.children.indexOf(t),!0),this.docId&&An(this.docId,e),1===e.nodeType){var i=bn(t),a=kn(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=mn(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},e.prototype.insertAfter=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(Sn(e,this.children,this.children.indexOf(t)+1,!0),1===e.nodeType){var n=Sn(e,this.pureChildren,this.pureChildren.indexOf(wn(t))+1),r=mn(this.docId);if(r&&0<=n)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(an("debug")&&sn("[insertAfter]("+this.docId+","+e.type+","+e.ref+") Insert <"+e.type+"> to <"+this.type+"> ("+this.ref+"), after ("+t.ref+")."),_n(e,this),kn(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&An(this.docId,e),1===e.nodeType){var o=kn(e,this.pureChildren,this.pureChildren.indexOf(wn(t))+1),i=mn(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},e.prototype.removeChild=function(e,t){if(e.parentNode&&(On(e,this.children,!0),1===e.nodeType)){an("debug")&&sn("[removeChild]("+this.docId+","+e.type+","+e.ref+") Remove <"+e.type+"> from <"+this.type+"> ("+this.ref+")."),On(e,this.pureChildren);var n=mn(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},e.prototype.clear=function(){var t=mn(this.docId);t&&this.pureChildren.forEach(function(e){t.send("dom",{action:"removeElement"},[e.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},e.prototype.setAttr=function(e,t,n){if(this.attr[e]!==t||!1===n){this.attr[e]=t;var r=mn(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},e.prototype.setAttrs=function(e,t){if(!nn(e)){var n={};for(var r in e)this.attr[r]!==e[r]&&(this.attr[r]=e[r],n[r]=e[r]);if(!nn(n)){var o=mn(this.docId);!t&&o&&o.send("dom",{action:"updateAttrs"},[this.ref,n])}}},e.prototype.setStyle=function(e,t,n){if(this.style[e]!==t||!1===n){this.style[e]=t;var r=mn(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},e.prototype.setStyles=function(e,t){if(!nn(e)){var n={};for(var r in e)this.style[r]!==e[r]&&(this.style[r]=e[r],n[r]=e[r]);if(!nn(n)){var o=mn(this.docId);!t&&o&&o.send("dom",{action:"updateStyle"},[this.ref,n])}}},e.prototype.setClassStyle=function(e){for(var t in this.classStyle)this.classStyle[t]="";Object.assign(this.classStyle,e);var n=mn(this.docId);n&&n.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},e.prototype.addEvent=function(e,t,n){if(this.event||(this.event={}),!this.event[e]){an("debug")&&sn("[addEvent]("+this.docId+","+this.type+","+this.ref+') Add "'+e+'" event on <'+this.type+"> ("+this.ref+")."),this.event[e]={handler:t,params:n};var r=mn(this.docId);r&&r.send("dom",{action:"addEvent"},[this.ref,e])}},e.prototype.removeEvent=function(e){if(this.event&&this.event[e]){an("debug")&&sn("[removeEvent]("+this.docId+","+this.type+","+this.ref+') Remove "'+e+'" event on <'+this.type+"> ("+this.ref+")."),delete this.event[e];var t=mn(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},e.prototype.fireEvent=function(t,e,n,r){var o=null,i=!1,a=this.event[t];if(a&&e){an("debug")&&sn("[fireEvent]("+this.docId+","+this.type+","+this.ref+') Fire "'+t+'" event on <'+this.type+"> ("+this.ref+").");var s=a.handler;e.stopPropagation=function(){i=!0};try{o=r&&r.params?s.call.apply(s,[this].concat(r.params,[e])):s.call(this,e)}catch(e){throw console.error('[JS Framework] Failed to invoke the event handler of "'+t+'" on '+this.type+" ("+this.ref+"):\n "+e.toString()),e}}return!i&&n&&-1!==$n.indexOf(t)&&this.parentNode&&this.parentNode.fireEvent&&(e.currentTarget=this.parentNode,this.parentNode.fireEvent(t,e,n)),o},e.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},e.prototype.toJSON=function(e){void 0===e&&(e=!1);var t={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()},n=[];for(var r in this.event){var o=this.event[r].params;o?n.push({type:r,params:o}):n.push(r)}return n.length&&(t.event=n),!e&&this.pureChildren.length&&(t.children=this.pureChildren.map(function(e){return e.toJSON()})),t},e.prototype.toString=function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(e){return e.toString()}).join("")+"</"+this.type+">"},e}(xn);Cn=jn;var In=function(){},Mn=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:String(e)}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new dn(e)}),In=t||function(){}};function Tn(e,t){var n=vn(e);return n?Array.isArray(t)?t.map(function(e){switch(e.method){case"callback":return function(e,t,n,r){return e.taskCenter.callback(t,n,r)}.apply(void 0,[n].concat(e.args));case"fireEventSync":case"fireEvent":return function(e,t,n,r,o,i){var a=e.getRef(t);return a?e.fireEvent(a,n,r,o,i):r?(r._nodeId=t,e.fireEvent(e.getRef("_documentElement"),n,r,o,i)):void 0}.apply(void 0,[n].concat(e.args));case"componentHook":return function(e,t,n,r,o){if(!e||!e.taskCenter)return console.error('[JS Framework] Can\'t find "document" or "taskCenter".'),null;var i=null;try{i=e.taskCenter.triggerHook(t,n,r,o)}catch(e){throw console.error('[JS Framework] Failed to trigger the "'+n+"@"+r+'" hook on '+t+"."),e}return i}.apply(void 0,[n].concat(e.args))}}):void 0:new Error("[JS Framework] Failed to receiveTasks, instance ("+e+") is not available.")}Mn.prototype.callback=function(e,t,n){return this.callbackManager.consume(e,t,n)},Mn.prototype.registerHook=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this.callbackManager).registerHook.apply(e,t)},Mn.prototype.triggerHook=function(){for(var e,t=[],n=arguments.length;n--;)t[n]=arguments[n];return(e=this.callbackManager).triggerHook.apply(e,t)},Mn.prototype.updateData=function(e,t,n){this.send("module",{module:"dom",method:"updateComponentData"},[e,t,n])},Mn.prototype.destroyCallback=function(){return this.callbackManager.close()},Mn.prototype.normalize=function(e,t){var n=this;void 0===t&&(t=!1);var r=Qt(e);if(e&&e instanceof jn)return e.ref;if(e&&e._isVue&&e.$el instanceof jn)return e.$el.ref;if("Function"===r)return this.callbackManager.add(e).toString();if(t){if("Object"===r){var o={};for(var i in e)o[i]=n.normalize(e[i],!0);return o}if("Array"===r)return e.map(function(e){return n.normalize(e,!0)})}return e&&e.ref&&e["[[VirtualElement]]"]?e.ref:function(e){var t=Qt(e);switch(t){case"Undefined":case"Null":return"";case"RegExp":return e.toString();case"Date":return e.toISOString();case"Number":case"String":case"Boolean":case"Array":case"Object":return e;case"ArrayBuffer":return{"@type":"binary",dataType:t,base64:tn(e)};case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":return{"@type":"binary",dataType:t,base64:tn(e.buffer)};default:return JSON.stringify(e)}}(e)},Mn.prototype.send=function(e,t,n,r){var o=this,i=t.action,a=t.component,s=t.ref,c=t.module,l=t.method;switch(n=n.map(function(e){return o.normalize(e)}),"Object"===Qt(r)&&(r=this.normalize(r,!0)),e){case"dom":return an("debug")&&sn("[task]("+this.instanceId+","+this.type+","+i+") "+JSON.stringify(n)),this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,s,l,n,Object.assign({component:a},r));default:return an("debug")&&sn("[task]("+this.instanceId+","+c+","+l+") "+JSON.stringify(n)),this.moduleHandler(this.instanceId,c,l,n,r)}},Mn.prototype.callDOM=function(e,t){return this[e](this.instanceId,t)},Mn.prototype.callComponent=function(e,t,n,r){return this.componentHandler(this.instanceId,e,t,n,r)},Mn.prototype.callModule=function(e,t,n,r){return this.moduleHandler(this.instanceId,e,t,n,r)};var Pn={};function Fn(r){void 0===r&&(r={});var e=function(t){var e,n;n=t,en(e=Pn)&&Object.prototype.hasOwnProperty.call(e,n)||(Pn[t]={}),Array.isArray(r[t])&&r[t].forEach(function(e){"string"==typeof e?Pn[t][e]=!0:en(e)&&"string"==typeof e.name&&(Pn[t][e.name]=e.args||[])})};for(var t in r)e(t)}function Nn(e,t){return"string"==typeof t?!(!Pn[e]||!Pn[e][t]):!!Pn[e]}var Rn={};function Dn(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?Rn[e]=!0:en(e)&&"string"==typeof e.type&&function(o,e){if(Array.isArray(e)&&e.length){var t=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),(t.prototype=Object.create(e&&e.prototype)).constructor=t}(Cn);e.forEach(function(r){t.prototype[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=mn(this.docId);if(n)return n.send("component",{ref:this.ref,component:o,method:r},e)}}),En[o]=t}}((Rn[e.type]=e).type,e.methods))})}function Vn(e){return!!Rn[e]}var Ln=[];function Jn(e,t){qn(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),Ln.push({name:e,options:t}))}function Wn(n){Ln.some(function(e,t){if(e.name===n)return Ln.splice(t,1),!0})}function qn(e){return t=e,0<=Ln.map(function(e){return e.name}).indexOf(t);var t}var Bn=function(t){function e(e){t.call(this),this.nodeType=8,this.nodeId=Yt(),this.ref=this.nodeId,this.type="comment",this.value=e,this.children=[],this.pureChildren=[]}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},e}(xn);function Un(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}var zn=function(e,t){this.id=e,this.batched=!1,this.updates=[],"function"==typeof t?Object.defineProperty(this,"handler",{configurable:!0,enumerable:!0,writable:!0,value:t}):console.error("[JS Runtime] invalid parameter, handler must be a function")};zn.prototype.createFinish=function(e){return(0,this.handler)([Un("createFinish")],e)},zn.prototype.updateFinish=function(e){return(0,this.handler)([Un("updateFinish")],e)},zn.prototype.refreshFinish=function(e){return(0,this.handler)([Un("refreshFinish")],e)},zn.prototype.createBody=function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[Un("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return Un("addElement",[t.ref,e,-1])})),this.addActions(r)},zn.prototype.addElement=function(e,t,n){return 0<=n||(n=-1),this.addActions(Un("addElement",[t,e.toJSON(),n]))},zn.prototype.removeElement=function(e){if(Array.isArray(e)){var t=e.map(function(e){return Un("removeElement",[e])});return this.addActions(t)}return this.addActions(Un("removeElement",[e]))},zn.prototype.moveElement=function(e,t,n){return this.addActions(Un("moveElement",[e,t,n]))},zn.prototype.setAttr=function(e,t,n){var r={};return r[t]=n,this.addActions(Un("updateAttrs",[e,r]))},zn.prototype.setStyle=function(e,t,n){var r={};return r[t]=n,this.addActions(Un("updateStyle",[e,r]))},zn.prototype.setStyles=function(e,t){return this.addActions(Un("updateStyle",[e,t]))},zn.prototype.addEvent=function(e,t){return this.addActions(Un("addEvent",[e,t]))},zn.prototype.removeEvent=function(e,t){return this.addActions(Un("removeEvent",[e,t]))},zn.prototype.handler=function(e,t){return t&&t()},zn.prototype.addActions=function(e){var t=this.updates,n=this.handler;if(Array.isArray(e)||(e=[e]),!this.batched)return n(e);t.push.apply(t,e)};var Hn={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"};function Gn(e,t,n){var r,o=t.module,i=t.method,a=t.args;return r=i,"dom"===o&&Hn[r]&&"function"==typeof global[Hn[r]]?global[Hn[i]].apply(global,[e].concat(a,["-1"])):n(e,[t],"-1")}var Xn=function e(t,n,r){var o,i;t=t?t.toString():"",this.id=t,this.URL=n,i=this,(o=t)&&(hn[o]=i),this.nodeMap={};var a,s,c=e.Listener||zn;this.listener=new c(t,r||(a=t,"function"!=typeof(s=e.handler||global.callNative)&&console.error("[JS Runtime] no default handler"),function(e){Array.isArray(e)||(e=[e]);for(var t=0;t<e.length;t++){var n=Gn(a,e[t],s);if(-1===n)return n}})),this.taskCenter=new Mn(t,r?function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return r.apply(void 0,t)}:e.handler),this.createDocumentElement()};function Kn(e){return e["[[CurrentInstanceId]]"]}Xn.prototype.getRef=function(e){return this.nodeMap[e]},Xn.prototype.open=function(){this.listener.batched=!1},Xn.prototype.close=function(){this.listener.batched=!0},Xn.prototype.createDocumentElement=function(){var n=this;if(!this.documentElement){var e=new jn("document");e.docId=this.id,e.ownerDocument=this,e.role="documentElement",e.depth=0,e.ref="_documentElement",this.nodeMap._documentElement=e,this.documentElement=e,Object.defineProperty(e,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(e){yn(n,e)}}),Object.defineProperty(e,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(e,t){yn(n,e,t)}}),an("debug")&&sn('Create document element (id: "'+e.docId+'", ref: "'+e.ref+'")')}return this.documentElement},Xn.prototype.createBody=function(e,t){if(!this.body){var n=new jn(e,t);gn(this,n),an("debug")&&sn("[createBody]("+this.id+","+n.type+","+n.ref+") ("+JSON.stringify(n.toJSON(!0))+").")}return this.body},Xn.prototype.createElement=function(e,t){var n=new jn(e,t);return an("debug")&&sn("[createElement]("+this.id+","+n.type+","+n.ref+") ("+JSON.stringify(n.toJSON(!0))+")."),n},Xn.prototype.createComment=function(e){return new Bn(e)},Xn.prototype.fireEvent=function(e,t,n,r,o){if(e){var i;(n=n||{}).type=n.type||t,n.target=e,n.currentTarget=e,n.timestamp=Date.now(),r&&function(e,t){var n=t.attrs||{};for(var r in n)e.setAttr(r,n[r],!0);var o=t.style||{};for(var i in o)e.setStyle(i,o[i],!0)}(e,r);var a=this.getRef("_root");return a&&a.attr&&(i="true"===a.attr.bubble),e.fireEvent(t,n,i,o)}},Xn.prototype.destroy=function(){var e;an("debug")&&sn("[destroy]("+this.id+",document,"+this.ref+') Destroy document (id: "'+this.id+'", URL: "'+this.URL+'")'),this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,e=this.id,delete hn[e]},Xn.handler=null;var Zn,Yn,Qn=function(e,t,n){var r,o;r=this,o=String(e),Object.defineProperty(r,"[[CurrentInstanceId]]",{value:o}),this.config=t||{},this._nativeData=n||{},this.document=new Xn(e,this.config.bundleUrl),this.requireModule=this.requireModule.bind(this),this.importScript=this.importScript.bind(this),this.isRegisteredModule=Nn,this.isRegisteredComponent=Vn};Qn.prototype.requireModule=function(s){var c=Kn(this);if(c&&this.document&&this.document.taskCenter){if(Nn(s)){var e={},t=Pn[s],n=function(a){Object.defineProperty(e,a,{enumerable:!0,configurable:!0,get:function(){return n=s,r=a,(o=mn(e=c))&&"function"==typeof o.send?function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return o.send("module",{module:n,method:r},e)}:(console.error("[JS Framework] Failed to find taskCenter ("+e+")."),null);var e,n,r,o},set:function(e){return n=s,r=a,o=e,(i=mn(t=c))&&"function"==typeof i.send?"function"!=typeof o?(console.error("[JS Framework] "+n+"."+r+" must be assigned as a function."),null):function(e){return i.send("module",{module:n,method:r},[e])}:(console.error("[JS Framework] Failed to find taskCenter ("+t+")."),null);var t,n,r,o,i}})};for(var r in t)n(r);return e}console.warn('[JS Framework] using unregistered weex module "'+s+'"')}else console.error('[JS Framework] Failed to requireModule("'+s+'"), instance ('+c+") doesn't exist anymore.")},Qn.prototype.supports=function(e){if("string"!=typeof e)return null;var t=e.match(/^@(\w+)\/([\w-]+)(\.(\w+))?$/i);if(t){var n=t[1],r=t[2],o=t[4];switch(n){case"module":return Nn(r,o);case"component":return Vn(r)}}return null},Qn.prototype.importScript=function(e,r){void 0===r&&(r={});var o=Kn(this),i=mn(o);return new Promise(function(t,n){i&&"function"==typeof i.send||n(new Error('[JS Framework] Failed to import script "'+e+'", no taskCenter ('+o+") matched."));try{i.send("module",{module:"script",method:"importScript"},[e,r],{callback:[function(e){return t(e)},function(e){return n(e)}]})}catch(e){n(e)}})};var er=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/;function tr(){return"0.29.6"}var nr={};function rr(e){return nr[e]}function or(e,t,n){void 0===t&&(t={});var r=new Qn(e,t,n),o=t.bundleType||"Vue";nr[e]=o;var i=Yn.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');var a,s,c,l,u=(a=e,s={weex:r,config:t,created:Date.now(),framework:o,bundleType:o},c=Yn,(l=Object.create(null)).service=Object.create(null),Ln.forEach(function(e){var t=e.name,n=e.options.create;if(n)try{var r=n(a,s,c);Object.assign(l.service,r),Object.assign(l,r.instance)}catch(e){console.error("[JS Runtime] Failed to create service "+t+".")}}),delete l.service.instance,Object.freeze(l.service),l);Object.freeze(u);var f=Object.create(null);Object.assign(f,u,{weex:r,getJSFMVersion:tr,requireModule:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return r.requireModule.apply(r,e)},__WEEX_CALL_JAVASCRIPT__:Tn,services:u}),Object.freeze(f);var p=Object.assign({},f);return"function"==typeof i.createInstanceContext&&Object.assign(p,i.createInstanceContext(e,f,n)),Object.freeze(p),p}var ir={createInstance:function(e,t,n,r){if(nr[e])return new Error('The instance id "'+e+'" has already been used!');var o=function(e){var t=er.exec(e);if(t)try{return JSON.parse(t[1]).framework}catch(e){}return"Weex"}(t);nr[e]=o,(n=JSON.parse(JSON.stringify(n||{}))).env=JSON.parse(JSON.stringify(global.WXEnvironment||{})),n.bundleType=o;var i=Yn.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');"Weex"===o&&console.error('[JS Framework] COMPATIBILITY WARNING: Weex DSL 1.0 (.we) framework is no longer supported! It will be removed in the next version of WeexSDK, your page would be crash if you still using the ".we" framework. Please upgrade it to Vue.js or Rax.');var a=or(e,n,r);if("function"==typeof i.createInstance){if("Rax"!==o&&"Weex"!==o)return i.createInstance(e,t,n,r,a);var s=Object.assign({config:n,created:Date.now(),framework:o},a);return i.createInstance(e,t,n,r,s)}!function(e,t){var n=[],r=[];for(var o in t)n.push(o),r.push(t[o]);var i="\n    (function (global) {\n      "+e+"\n    })(Object.create(this))\n  ";(new(Function.prototype.bind.apply(Function,[null].concat(n,[i])))).apply(void 0,r)}(t,a)},createInstanceContext:or,getRoot:function(e){var t=vn(e);try{if(t&&t.body)return t.body.toJSON()}catch(e){return void console.error("[JS Framework] Failed to get the virtual dom tree.")}},getJSFMVersion:tr,getDocument:vn,registerService:Jn,unregisterService:Wn,callJS:function(e,t){var n=Zn[rr(e)];return n&&"function"==typeof n.receiveTasks?n.receiveTasks(e,t):Tn(e,t)}};function ar(s){ir[s]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n,r=e[0],o=rr(r);if(o&&Zn[o]){var i=(n=Zn[o])[s].apply(n,e),a={framework:o};return"refreshInstance"===s?Ln.forEach(function(e){var t=e.options.refresh;t&&t(r,{info:a,runtime:Yn})}):"destroyInstance"===s&&(Ln.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:a,runtime:Yn})}),delete nr[r]),i}return new Error('[JS Framework] Using invalid instance id "'+r+'" when calling '+s+".")}}function sr(o,i){ir[o]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var n in"function"==typeof i&&i.apply(void 0,e),Yn.frameworks){var r=Yn.frameworks[n];r&&r[o]&&r[o].apply(r,e)}}}var cr={Document:Xn,Element:jn,Comment:Bn,Listener:zn,TaskCenter:Mn,sendTasks:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return"function"==typeof callNative?callNative.apply(void 0,e):(global.callNative||function(){}).apply(void 0,e)}};Xn.handler=cr.sendTasks;var lr={service:{register:Jn,unregister:Wn,has:qn},freezePrototype:function(){Object.freeze(cr.Comment),Object.freeze(cr.Listener),Object.freeze(cr.Document.prototype),Object.freeze(cr.Comment.prototype),Object.freeze(cr.Listener.prototype)},init:function(e){for(var t in Zn=(Yn=e||{}).frameworks||{},function(){var e={createFinish:global.callCreateFinish,updateFinish:global.callUpdateFinish,refreshFinish:global.callRefreshFinish,createBody:global.callCreateBody,addElement:global.callAddElement,removeElement:global.callRemoveElement,moveElement:global.callMoveElement,updateAttrs:global.callUpdateAttrs,updateStyle:global.callUpdateStyle,addEvent:global.callAddEvent,removeEvent:global.callRemoveEvent,__updateComponentData:global.__updateComponentData},t=Mn.prototype,n=function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return In(e,[{module:"dom",method:n,args:t}],"-1")}};for(var r in e)n(r);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return In(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return In(e,[{module:t,method:n,args:r}])}}(),Zn){var n=Zn[t];if("function"==typeof n.init)try{n.init(e)}catch(e){}}return sr("registerComponents",Dn),sr("registerModules",Fn),sr("registerMethods"),["destroyInstance","refreshInstance"].forEach(ar),ir},config:cr};function ur(e,t){void 0===t&&(t={}),this.type=e||"message",this.data=t.data||null,this.origin=t.origin||"",this.source=t.source||null,this.ports=t.ports||[],this.target=null,this.timeStamp=Date.now()}var fr={},pr={};function dr(){}dr.prototype.postMessage=function(e){if(this._closed)throw new Error('BroadcastChannel "'+this.name+'" is closed.');var t=fr[this.name];if(t&&t.length)for(var n=0;n<t.length;++n){var r=t[n];r._closed||r===this||"function"==typeof r.onmessage&&r.onmessage(new ur("message",{data:e}))}},dr.prototype.close=function(){var t=this;if(!this._closed&&(this._closed=!0,fr[this.name])){var e=fr[this.name].filter(function(e){return e!==t});e.length?fr[this.name]=e:delete fr[this.name]}};var hr={BroadcastChannel:{create:function(t,e,n){if(pr[t]=[],"function"==typeof global.BroadcastChannel)return{};var r={BroadcastChannel:function(e){Object.defineProperty(this,"name",{configurable:!1,enumerable:!0,writable:!1,value:String(e)}),this._closed=!1,this.onmessage=null,fr[this.name]||(fr[this.name]=[]),fr[this.name].push(this),pr[t].push(this)}};return r.BroadcastChannel.prototype=dr.prototype,{instance:r}},destroy:function(e,t){pr[e].forEach(function(e){return e.close()}),delete pr[e]}}};var vr={},mr={};var yr=Object.freeze({init:function(e){vr.Document=e.Document,vr.Element=e.Element,vr.Comment=e.Comment,vr.sendTasks=e.sendTasks},createInstance:function(t,e,n,r,o){void 0===n&&(n={}),void 0===r&&(r={}),void 0===o&&(o={});var i=new vr.Document(t,n.bundleUrl),a={},s={id:t,data:r,document:i,callbacks:a},c=0;i.addCallback=function(e){return a[++c]=e,c},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},mr[t]=s;var l=Object.assign({Document:vr.Document,Element:vr.Element,Comment:vr.Comment,sendTasks:function(e){return vr.sendTasks(t,e,-1)},options:n,document:i},o),u=[],f=[];for(var p in l)u.push(p),f.push(l[p]);return u.push(e),(new(Function.prototype.bind.apply(Function,[null].concat(u)))).apply(void 0,f),vr.sendTasks(t,[{module:"dom",method:"createFinish",args:[]}],-1),s},destroyInstance:function(e){delete mr[e]},getRoot:function(e){return mr[e].document.body.toJSON()},receiveTasks:function(r,e){var o={fireEvent:function(e,t,n,r,o){var i=mr[e].document,a=i.getRef(t);return i.fireEvent(a,n,r,o)},callback:function(e,t,n,r){return mr[e].document.handleCallback(t,n,r)}};if((mr[r]||{}).document&&Array.isArray(e)){var i=[];return e.forEach(function(e){var t=o[e.method],n=[].concat(e.args);"function"==typeof t&&(n.unshift(r),i.push(t.apply(void 0,n)))}),i}}}),gr=n(function(e){e.exports=function(e,o){var _=Object.freeze({});function $(e){return null==e}function A(e){return null!=e}function j(e){return!0===e}function I(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function b(e){return null!==e&&"object"==typeof e}var r=Object.prototype.toString;function u(e){return"[object Object]"===r.call(e)}function i(e){var t=parseFloat(String(e));return 0<=t&&Math.floor(t)===t&&isFinite(e)}function t(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function n(e){var t=parseFloat(e);return isNaN(t)?e:t}function s(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}s("slot,component",!0);var c=s("key,ref,slot,slot-scope,is");function l(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var a=Object.prototype.hasOwnProperty;function f(e,t){return a.call(e,t)}function p(t){var n=Object.create(null);return function(e){return n[e]||(n[e]=t(e))}}var d=/-(\w)/g,h=p(function(e){return e.replace(d,function(e,t){return t?t.toUpperCase():""})}),v=p(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),m=/\B([A-Z])/g,w=p(function(e){return e.replace(m,"-$1").toLowerCase()});var y=Function.prototype.bind?function(e,t){return e.bind(t)}:function(n,r){function e(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}return e._length=n.length,e};function g(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function N(e,t){for(var n in t)e[n]=t[n];return e}function R(e,t,n){}var k=function(e,t,n){return!1},S=function(e){return e};function O(t,n){if(t===n)return!0;var e=b(t),r=b(n);if(!e||!r)return!e&&!r&&String(t)===String(n);try{var o=Array.isArray(t),i=Array.isArray(n);if(o&&i)return t.length===n.length&&t.every(function(e,t){return O(e,n[t])});if(o||i)return!1;var a=Object.keys(t),s=Object.keys(n);return a.length===s.length&&a.every(function(e){return O(t[e],n[e])})}catch(e){return!1}}function C(e,t){for(var n=0;n<e.length;n++)if(O(e[n],t))return n;return-1}function D(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var M="data-server-rendered",x=["component","directive","filter"],E=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],T={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:k,isReservedAttr:k,isUnknownElement:k,getTagNamespace:R,parsePlatformTagName:S,mustUseProp:k,_lifecycleHooks:E};function P(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var F=/[^\w.$]/;var V,L="__proto__"in{},J="undefined"!=typeof window,W="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,q=W&&WXEnvironment.platform.toLowerCase(),B=J&&window.navigator.userAgent.toLowerCase(),U=(B&&/msie|trident/.test(B),B&&0<B.indexOf("msie 9.0")),z=B&&0<B.indexOf("edge/"),H=(B&&B.indexOf("android"),B&&/iphone|ipad|ipod|ios/.test(B)||"ios"===q),G=(B&&/chrome\/\d+/.test(B),{}.watch);if(J)try{var X={};Object.defineProperty(X,"passive",{get:function(){}}),window.addEventListener("test-passive",null,X)}catch(e){}var K=function(){return void 0===V&&(V=!J&&!W&&void 0!==global&&"server"===global.process.env.VUE_ENV),V},Z=J&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function Y(e){return"function"==typeof e&&/native code/.test(e.toString())}var Q,ee="undefined"!=typeof Symbol&&Y(Symbol)&&"undefined"!=typeof Reflect&&Y(Reflect.ownKeys);Q="undefined"!=typeof Set&&Y(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var te=R,ne=0,re=function(){this.id=ne++,this.subs=[]};re.prototype.addSub=function(e){this.subs.push(e)},re.prototype.removeSub=function(e){l(this.subs,e)},re.prototype.depend=function(){re.target&&re.target.addDep(this)},re.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},re.target=null;var oe=[];function ie(e){re.target&&oe.push(re.target),re.target=e}function ae(){re.target=oe.pop()}var se=function(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},ce={child:{configurable:!0}};ce.child.get=function(){return this.componentInstance},Object.defineProperties(se.prototype,ce);var le=function(e){void 0===e&&(e="");var t=new se;return t.text=e,t.isComment=!0,t};function ue(e){return new se(void 0,void 0,void 0,String(e))}function fe(e){var t=new se(e.tag,e.data,e.children,e.text,e.elm,e.context,e.componentOptions,e.asyncFactory);return t.ns=e.ns,t.isStatic=e.isStatic,t.key=e.key,t.isComment=e.isComment,t.fnContext=e.fnContext,t.fnOptions=e.fnOptions,t.fnScopeId=e.fnScopeId,t.isCloned=!0,t}var pe=Array.prototype,de=Object.create(pe);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(a){var s=pe[a];P(de,a,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r,o=s.apply(this,t),i=this.__ob__;switch(a){case"push":case"unshift":r=t;break;case"splice":r=t.slice(2)}return r&&i.observeArray(r),i.dep.notify(),o})});var he=Object.getOwnPropertyNames(de),ve=!0;function me(e){ve=e}var ye=function(e){(this.value=e,this.dep=new re,this.vmCount=0,P(e,"__ob__",this),Array.isArray(e))?((L?ge:_e)(e,de,he),this.observeArray(e)):this.walk(e)};function ge(e,t,n){e.__proto__=t}function _e(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];P(e,i,t[i])}}function be(e,t){var n;if(b(e)&&!(e instanceof se))return f(e,"__ob__")&&e.__ob__ instanceof ye?n=e.__ob__:ve&&!K()&&(Array.isArray(e)||u(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new ye(e)),t&&n&&n.vmCount++,n}function we(n,e,r,t,o){var i=new re,a=Object.getOwnPropertyDescriptor(n,e);if(!a||!1!==a.configurable){var s=a&&a.get;s||2!==arguments.length||(r=n[e]);var c=a&&a.set,l=!o&&be(r);Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(n):r;return re.target&&(i.depend(),l&&(l.dep.depend(),Array.isArray(e)&&function e(t){for(var n=void 0,r=0,o=t.length;r<o;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(e))),e},set:function(e){var t=s?s.call(n):r;e===t||e!=e&&t!=t||(c?c.call(n,e):r=e,l=!o&&be(e),i.notify())}})}}function ke(e,t,n){if(Array.isArray(e)&&i(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(we(r.value,t,n),r.dep.notify(),n):e[t]=n}function Se(e,t){if(Array.isArray(e)&&i(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||f(e,t)&&(delete e[t],n&&n.dep.notify())}}ye.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)we(e,t[n])},ye.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)be(e[t])};var Oe=T.optionMergeStrategies;function Ce(e,t){if(!t)return e;for(var n,r,o,i=Object.keys(t),a=0;a<i.length;a++)r=e[n=i[a]],o=t[n],f(e,n)?u(r)&&u(o)&&Ce(r,o):ke(e,n,o);return e}function xe(n,r,o){return o?function(){var e="function"==typeof r?r.call(o,o):r,t="function"==typeof n?n.call(o,o):n;return e?Ce(e,t):t}:r?n?function(){return Ce("function"==typeof r?r.call(this,this):r,"function"==typeof n?n.call(this,this):n)}:r:n}function Ee(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function $e(e,t,n,r){var o=Object.create(e||null);return t?N(o,t):o}Oe.data=function(e,t,n){return n?xe(e,t,n):t&&"function"!=typeof t?e:xe(e,t)},E.forEach(function(e){Oe[e]=Ee}),x.forEach(function(e){Oe[e+"s"]=$e}),Oe.watch=function(e,t,n,r){if(e===G&&(e=void 0),t===G&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var o={};for(var i in N(o,e),t){var a=o[i],s=t[i];a&&!Array.isArray(a)&&(a=[a]),o[i]=a?a.concat(s):Array.isArray(s)?s:[s]}return o},Oe.props=Oe.methods=Oe.inject=Oe.computed=function(e,t,n,r){if(!e)return t;var o=Object.create(null);return N(o,e),t&&N(o,t),o},Oe.provide=xe;var Ae=function(e,t){return void 0===t?e:t};function je(n,r,o){"function"==typeof r&&(r=r.options),function(e,t){var n=e.props;if(n){var r,o,i={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(o=n[r])&&(i[h(o)]={type:null});else if(u(n))for(var a in n)o=n[a],i[h(a)]=u(o)?o:{type:o};e.props=i}}(r),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var o=0;o<n.length;o++)r[n[o]]={from:n[o]};else if(u(n))for(var i in n){var a=n[i];r[i]=u(a)?N({from:i},a):{from:a}}}}(r),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(r);var e=r.extends;if(e&&(n=je(n,e,o)),r.mixins)for(var t=0,i=r.mixins.length;t<i;t++)n=je(n,r.mixins[t],o);var a,s={};for(a in n)c(a);for(a in r)f(n,a)||c(a);function c(e){var t=Oe[e]||Ae;s[e]=t(n[e],r[e],o,e)}return s}function Ie(e,t,n,r){if("string"==typeof n){var o=e[t];if(f(o,n))return o[n];var i=h(n);if(f(o,i))return o[i];var a=v(i);return f(o,a)?o[a]:o[n]||o[i]||o[a]}}function Me(e,t,n,r){var o=t[e],i=!f(n,e),a=n[e],s=Fe(Boolean,o.type);if(-1<s)if(i&&!f(o,"default"))a=!1;else if(""===a||a===w(e)){var c=Fe(String,o.type);(c<0||s<c)&&(a=!0)}if(void 0===a){a=function(e,t,n){if(!f(t,"default"))return;var r=t.default;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Te(t.type)?r.call(e):r}(r,o,e);var l=ve;me(!0),be(a),me(l)}return a}function Te(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function Pe(e,t){return Te(e)===Te(t)}function Fe(e,t){if(!Array.isArray(t))return Pe(t,e)?0:-1;for(var n=0,r=t.length;n<r;n++)if(Pe(t[n],e))return n;return-1}function Ne(e,t,n){if(t)for(var r=t;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,e,t,n))return}catch(e){Re(e,r,"errorCaptured hook")}}Re(e,t,n)}function Re(e,t,n){if(T.errorHandler)try{return T.errorHandler.call(null,e,t,n)}catch(e){De(e,null,"config.errorHandler")}De(e,t,n)}function De(e,t,n){if(!J&&!W||"undefined"==typeof console)throw e;console.error(e)}var Ve,Le,Je=[],We=!1;function qe(){We=!1;for(var e=Je.slice(0),t=Je.length=0;t<e.length;t++)e[t]()}var Be=!1;function Ue(){if("undefined"!=typeof setImmediate&&Y(setImmediate))Le=function(){setImmediate(qe)};else if("undefined"==typeof MessageChannel||!Y(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())Le=function(){setTimeout(qe,0)};else{var e=new MessageChannel,t=e.port2;e.port1.onmessage=qe,Le=function(){t.postMessage(1)}}if("undefined"!=typeof Promise&&Y(Promise)){var n=Promise.resolve();Ve=function(){n.then(qe),!W&&H&&setTimeout(R)}}else Ve=Le}function ze(e,t){var n;if(Je.push(function(){if(e)try{e.call(t)}catch(e){Ne(e,t,"nextTick")}else n&&n(t)}),We||(We=!0,Be&&"function"==typeof Le?Le():"function"==typeof Ve?Ve():setTimeout(qe,0)),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}Ue();var He=new Q;function Ge(e){!function e(t,n){var r,o;var i=Array.isArray(t);if(!i&&!b(t)||Object.isFrozen(t)||t instanceof se)return;if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)e(t[r],n);else for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}(e,He),He.clear()}var Xe,Ke=p(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function Ze(e){function o(){var e=arguments,t=o.fns;if(!Array.isArray(t))return t.apply(null,arguments);for(var n=t.slice(),r=0;r<n.length;r++)n[r].apply(null,e)}return o.fns=e,o}function Ye(e,t,n,r,o){var i,a,s,c,l;for(i in e)a=s=e[i],c=t[i],l=Ke(i),u(a)&&(s=a.handler,l.params=a.params),$(s)||($(c)?($(s.fns)&&(s=e[i]=Ze(s)),n(l.name,s,l.once,l.capture,l.passive,l.params)):s!==c&&(c.fns=s,e[i]=c));for(i in t)$(e[i])&&r((l=Ke(i)).name,t[i],l.capture)}function Qe(e,t,n){var r;e instanceof se&&(e=e.data.hook||(e.data.hook={}));var o=e[t];function i(){n.apply(this,arguments),l(r.fns,i)}$(o)?r=Ze([i]):A(o.fns)&&j(o.merged)?(r=o).fns.push(i):r=Ze([o,i]),r.merged=!0,e[t]=r}function et(e,t,n,r,o){if(A(t)){if(f(t,n))return e[n]=t[n],o||delete t[n],!0;if(f(t,r))return e[n]=t[r],o||delete t[r],!0}return!1}function tt(e){return I(e)?[ue(e)]:Array.isArray(e)?function e(t,n){var r=[];var o,i,a,s;for(o=0;o<t.length;o++)$(i=t[o])||"boolean"==typeof i||(a=r.length-1,s=r[a],Array.isArray(i)?0<i.length&&(nt((i=e(i,(n||"")+"_"+o))[0])&&nt(s)&&(r[a]=ue(s.text+i[0].text),i.shift()),r.push.apply(r,i)):I(i)?nt(s)?r[a]=ue(s.text+i):""!==i&&r.push(ue(i)):nt(i)&&nt(s)?r[a]=ue(s.text+i.text):(j(t._isVList)&&A(i.tag)&&$(i.key)&&A(n)&&(i.key="__vlist"+n+"_"+o+"__"),r.push(i)));return r}(e):void 0}function nt(e){return A(e)&&A(e.text)&&!1===e.isComment}function rt(e,t){return(e.__esModule||ee&&"Module"===e[Symbol.toStringTag])&&(e=e.default),b(e)?t.extend(e):e}function ot(e){return e.isComment&&e.asyncFactory}function it(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(A(n)&&(A(n.componentOptions)||ot(n)))return n}}function at(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&lt(e,t)}function st(e,t,n){n?Xe.$once(e,t):Xe.$on(e,t)}function ct(e,t){Xe.$off(e,t)}function lt(e,t,n){Xe=e,Ye(t,n||{},st,ct),Xe=void 0}function ut(e,t){var n={};if(!e)return n;for(var r=0,o=e.length;r<o;r++){var i=e[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==t&&i.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===i.tag?c.push.apply(c,i.children||[]):c.push(i)}}for(var l in n)n[l].every(ft)&&delete n[l];return n}function ft(e){return e.isComment&&!e.asyncFactory||" "===e.text}function pt(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?pt(e[n],t):t[e[n].key]=e[n].fn;return t}var dt=null;function ht(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}function vt(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function mt(e,t){if(t){if(e._directInactive=!1,vt(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)mt(e.$children[n]);yt(e,"activated")}}function yt(t,n){ie();var e=t.$options[n];if(e)for(var r=0,o=e.length;r<o;r++)try{e[r].call(t)}catch(e){Ne(e,t,n+" hook")}t._hasHookEvent&&t.$emit("hook:"+n),ae()}var gt=[],_t=[],bt={},wt=!1,kt=!1,St=0;function Ot(){var e,t;for(kt=!0,gt.sort(function(e,t){return e.id-t.id}),St=0;St<gt.length;St++)t=(e=gt[St]).id,bt[t]=null,e.run();var n=_t.slice(),r=gt.slice();St=gt.length=_t.length=0,wt=kt=!(bt={}),function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,mt(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&yt(r,"updated")}}(r),Z&&T.devtools&&Z.emit("flush")}var Ct=0,xt=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Ct,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new Q,this.newDepIds=new Q,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!F.test(e)){var n=e.split(".");return function(e){for(var t=0;t<n.length;t++){if(!e)return;e=e[n[t]]}return e}}}(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};xt.prototype.get=function(){var e;ie(this);var t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;Ne(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&Ge(e),ae(),this.cleanupDeps()}return e},xt.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},xt.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},xt.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==bt[t]){if(bt[t]=!0,kt){for(var n=gt.length-1;St<n&&gt[n].id>e.id;)n--;gt.splice(n+1,0,e)}else gt.push(e);wt||(wt=!0,ze(Ot))}}(this)},xt.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||b(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Ne(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},xt.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},xt.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},xt.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var Et={enumerable:!0,configurable:!0,get:R,set:R};function $t(e,t,n){Et.get=function(){return this[t][n]},Et.set=function(e){this[t][n]=e},Object.defineProperty(e,n,Et)}function At(e){e._watchers=[];var t=e.$options;t.props&&function(n,r){var o=n.$options.propsData||{},i=n._props={},a=n.$options._propKeys=[];n.$parent&&me(!1);var e=function(e){a.push(e);var t=Me(e,r,o,n);we(i,e,t),e in n||$t(n,"_props",e)};for(var t in r)e(t);me(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?R:y(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;u(t=e._data="function"==typeof t?jt(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);for(;o--;){var i=n[o];r&&f(r,i)||(void 0,36!==(a=(i+"").charCodeAt(0))&&95!==a&&$t(e,"_data",i))}var a;be(t,!0)}(e):be(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=K();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;r||(n[o]=new xt(e,a||R,R,It)),o in e||Mt(e,o,i)}}(e,t.computed),t.watch&&t.watch!==G&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)Pt(e,n,r[o]);else Pt(e,n,r)}}(e,t.watch)}function jt(e,t){ie();try{return e.call(t,t)}catch(e){return Ne(e,t,"data()"),{}}finally{ae()}}var It={lazy:!0};function Mt(e,t,n){var r=!K();Et.set="function"==typeof n?(Et.get=r?Tt(t):n,R):(Et.get=n.get?r&&!1!==n.cache?Tt(t):n.get:R,n.set?n.set:R),Object.defineProperty(e,t,Et)}function Tt(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),re.target&&e.depend(),e.value}}function Pt(e,t,n,r){return u(n)&&(n=(r=n).handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Ft(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}function Nt(t){var n=Rt(t.$options.inject,t);n&&(me(!1),Object.keys(n).forEach(function(e){we(t,e,n[e])}),me(!0))}function Rt(t,e){if(t){for(var n=Object.create(null),r=ee?Reflect.ownKeys(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}):Object.keys(t),o=0;o<r.length;o++){for(var i=r[o],a=t[i].from,s=e;s;){if(s._provided&&f(s._provided,a)){n[i]=s._provided[a];break}s=s.$parent}if(!s&&"default"in t[i]){var c=t[i].default;n[i]="function"==typeof c?c.call(e):c}}return n}}function Dt(e,t){var n,r,o,i,a;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;r<o;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(b(e))for(i=Object.keys(e),n=new Array(i.length),r=0,o=i.length;r<o;r++)a=i[r],n[r]=t(e[a],a,r);return A(n)&&(n._isVList=!0),n}function Vt(e,t,n,r){var o,i=this.$scopedSlots[e];if(i)n=n||{},r&&(n=N(N({},r),n)),o=i(n)||t;else{var a=this.$slots[e];a&&(a._rendered=!0),o=a||t}var s=n&&n.slot;return s?this.$createElement("template",{slot:s},o):o}function Lt(e){return Ie(this.$options,"filters",e)||S}function Jt(e,t){return Array.isArray(e)?-1===e.indexOf(t):e!==t}function Wt(e,t,n,r,o){var i=T.keyCodes[t]||n;return o&&r&&!T.keyCodes[t]?Jt(o,r):i?Jt(i,e):r?w(r)!==t:void 0}function qt(n,r,o,i,a){if(o)if(b(o)){var s;Array.isArray(o)&&(o=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&N(t,e[n]);return t}(o));var e=function(t){if("class"===t||"style"===t||c(t))s=n;else{var e=n.attrs&&n.attrs.type;s=i||T.mustUseProp(r,e,t)?n.domProps||(n.domProps={}):n.attrs||(n.attrs={})}t in s||(s[t]=o[t],a&&((n.on||(n.on={}))["update:"+t]=function(e){o[t]=e}))};for(var t in o)e(t)}else;return n}function Bt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t||zt(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r}function Ut(e,t,n){return zt(e,"__once__"+t+(n?"_"+n:""),!0),e}function zt(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&Ht(e[r],t+"_"+r,n);else Ht(e,t,n)}function Ht(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Gt(e,t){if(t)if(u(t)){var n=e.on=e.on?N({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(o,i):i}}else;return e}function Xt(e){e._o=Ut,e._n=n,e._s=t,e._l=Dt,e._t=Vt,e._q=O,e._i=C,e._m=Bt,e._f=Lt,e._k=Wt,e._b=qt,e._v=ue,e._e=le,e._u=pt,e._g=Gt}function Kt(e,t,n,i,r){var a,s=r.options;f(i,"_uid")?(a=Object.create(i))._original=i:i=(a=i)._original;var o=j(s._compiled),c=!o;this.data=e,this.props=t,this.children=n,this.parent=i,this.listeners=e.on||_,this.injections=Rt(s.inject,i),this.slots=function(){return ut(n,i)},o&&(this.$options=s,this.$slots=this.slots(),this.$scopedSlots=e.scopedSlots||_),s._scopeId?this._c=function(e,t,n,r){var o=mn(a,e,t,n,r,c);return o&&!Array.isArray(o)&&(o.fnScopeId=s._scopeId,o.fnContext=i),o}:this._c=function(e,t,n,r){return mn(a,e,t,n,r,c)}}function Zt(e,t,n,r){var o=fe(e);return o.fnContext=n,o.fnOptions=r,t.slot&&((o.data||(o.data={})).slot=t.slot),o}function Yt(e,t){for(var n in t)e[h(n)]=t[n]}Xt(Kt.prototype);var Qt="@inRecycleList";function en(e,t,n,r){if(o&&o.taskCenter)return"function"==typeof o.taskCenter.registerHook?o.taskCenter.registerHook(e,t,n,r):void 0}function tn(e,n,t){if(b(n))if(t)e.$refs={};else{var r=e.$refs||{};Object.keys(n).forEach(function(e){var t=n[e];r[e]=1===t.length?t[0]:t}),e.$refs=r}}function nn(e,n,r,t){if(b(r)){var o=e.$refs||{};t?Object.keys(r).forEach(function(e){var t=r[e];o[e]&&(1===t.length&&Array.isArray(o[e])?delete o[e][n]:delete o[e])}):(Object.keys(r).forEach(function(e){var t=r[e];1===t.length?(Array.isArray(o[e])||(o[e]=[]),o[e][n]=t[0]):o[e]=t}),e.$refs=o)}}var rn=0;function on(e){var t=e.$options.data,n=e.$options.computed||{},r=e._data?Object.assign({},e._data):"function"==typeof t?jt(t,e):t||{},o={};for(var i in n)o[i]=e[i];return Object.assign({},r,o)}function an(e){void 0===e&&(e={});var r=this,t=e.componentId;P(r,"_vmTemplate",e.vmTemplate),r._uid=t||"virtual-component-"+rn++,r._isVue=!0,e&&e._isComponent?xn(r,e):r.$options=je(En(r.constructor),e||{},r),ht((r._renderProxy=r)._self=r),at(r),yn(r),yt(r,"beforeCreate"),Nt(r),At(r),Ft(r),yt(r,"created"),en(t,"lifecycle","attach",function(e){tn(r,e&&e.refs),yt(r,"beforeMount"),new xt(r,function(){return on(r)},function(){return r._update(r._vnode,!1)}),r._isMounted=!0,yt(r,"mounted")}),en(t,"lifecycle","update",function(e){tn(r,e&&e.refs),r._update(r._vnode,!1)}),en(t,"lifecycle","syncState",function(e,t){if(u(t))for(var n in t)r[n]=t[n];return on(r)}),en(t,"lifecycle","detach",function(e){tn(r,e&&e.refs,!0),r.$destroy(),r._vmTemplate&&(r._vmTemplate.removeVirtualComponent(r._uid),delete r._vmTemplate)})}function sn(e){var t=this,n=t.$options.componentId;(t._isMounted&&yt(t,"beforeUpdate"),t._vnode=e,t._isMounted&&n)&&function(e,t,n){if(o&&o.taskCenter)"function"==typeof o.taskCenter.updateData&&o.taskCenter.updateData(e,t,n)}(n,on(t),function(){yt(t,"updated")})}function cn(e){void 0===e&&(e={});var t=this;t._uid="virtual-component-template-"+rn++,t._isVue=!0,e&&e._isComponent?xn(t,e):t.$options=je(En(t.constructor),e||{},t),at(t._self=t),yn(t),At(t),this.registerVirtualComponent()}function ln(e){var t,n,o,i;delete e.data.attrs[Qt],n=(t=e).componentOptions.Ctor,o=n.extend({}),i=o.prototype.$emit,o.prototype._init=an,o.prototype._update=sn,o.prototype.$emit=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this._uid,o=this._vmTemplate;return r&&o&&(t.push(r),i.apply(o,t)),i.apply(this,t)},t.componentOptions.Ctor=n.extend({methods:{registerVirtualComponent:function(){var r=this;P(r,"_virtualComponents",{}),en(String(r._uid),"lifecycle","create",function(e,t){var n=new o({vmTemplate:r,componentId:e,propsData:t});return n._uid=e,r._virtualComponents&&(r._virtualComponents[e]=n),on(n)})},removeVirtualComponent:function(e){delete this._virtualComponents[e]}},destroyed:function(){delete this._virtualComponents}}),t.componentOptions.Ctor.prototype._init=cn,t.componentOptions.Ctor.prototype._update=R;var r=dn(e),a=r.$options["@render"];if(a)try{return a.call(r)}catch(e){Ne(e,r,"@render")}}var un={init:function(e,t,n,r){if(e.componentInstance&&!e.componentInstance._isDestroyed&&e.data.keepAlive){var o=e;un.prepatch(o,o)}else{(e.componentInstance=dn(e,dt,n,r)).$mount(t?e.elm:void 0,t)}},prepatch:function(e,t){var n=t.componentOptions;!function(e,t,n,r,o){var i=!!(o||e.$options._renderChildren||r.data.scopedSlots||e.$scopedSlots!==_);if(e.$options._parentVnode=r,e.$vnode=r,e._vnode&&(e._vnode.parent=r),e.$options._renderChildren=o,e.$attrs=r.data.attrs||_,e.$listeners=n||_,t&&e.$options.props){me(!1);for(var a=e._props,s=e.$options._propKeys||[],c=0;c<s.length;c++){var l=s[c],u=e.$options.props;a[l]=Me(l,u,t,e)}me(!0),e.$options.propsData=t}n=n||_;var f=e.$options._parentListeners;e.$options._parentListeners=n,lt(e,n,f),i&&(e.$slots=ut(o,r.context),e.$forceUpdate())}(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t,n=e.context,r=e.componentInstance;r._isMounted||(r._isMounted=!0,yt(r,"mounted")),e.data.keepAlive&&(n._isMounted?((t=r)._inactive=!1,_t.push(t)):mt(r,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,vt(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);yt(t,"deactivated")}}(t,!0):t.$destroy())}},fn=Object.keys(un);function pn(e,t,n,r,o){if(!$(e)){var i=n.$options._base;if(b(e)&&(e=i.extend(e)),"function"==typeof e){var a,s,c,l,u,f,p;if($(e.cid)&&void 0===(e=function(t,n,e){if(j(t.error)&&A(t.errorComp))return t.errorComp;if(A(t.resolved))return t.resolved;if(j(t.loading)&&A(t.loadingComp))return t.loadingComp;if(!A(t.contexts)){var r=t.contexts=[e],o=!0,i=function(){for(var e=0,t=r.length;e<t;e++)r[e].$forceUpdate()},a=D(function(e){t.resolved=rt(e,n),o||i()}),s=D(function(e){A(t.errorComp)&&(t.error=!0,i())}),c=t(a,s);return b(c)&&("function"==typeof c.then?$(t.resolved)&&c.then(a,s):A(c.component)&&"function"==typeof c.component.then&&(c.component.then(a,s),A(c.error)&&(t.errorComp=rt(c.error,n)),A(c.loading)&&(t.loadingComp=rt(c.loading,n),0===c.delay?t.loading=!0:setTimeout(function(){$(t.resolved)&&$(t.error)&&(t.loading=!0,i())},c.delay||200)),A(c.timeout)&&setTimeout(function(){$(t.resolved)&&s(null)},c.timeout))),o=!1,t.loading?t.loadingComp:t.resolved}t.contexts.push(e)}(a=e,i,n)))return s=a,c=t,l=n,u=r,f=o,(p=le()).asyncFactory=s,p.asyncMeta={data:c,context:l,children:u,tag:f},p;t=t||{},En(e),A(t.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var o=t.on||(t.on={});A(o[r])?o[r]=[t.model.callback].concat(o[r]):o[r]=t.model.callback}(e.options,t);var d=function(e,t,n){var r=t.options.props;if(!$(r)){var o={},i=e.attrs,a=e.props;if(A(i)||A(a))for(var s in r){var c=w(s);et(o,a,s,c,!0)||et(o,i,s,c,!1)}return o}}(t,e);if(j(e.options.functional))return function(e,t,n,r,o){var i=e.options,a={},s=i.props;if(A(s))for(var c in s)a[c]=Me(c,s,t||_);else A(n.attrs)&&Yt(a,n.attrs),A(n.props)&&Yt(a,n.props);var l=new Kt(n,a,o,r,e),u=i.render.call(null,l._c,l);if(u instanceof se)return Zt(u,n,l.parent,i);if(Array.isArray(u)){for(var f=tt(u)||[],p=new Array(f.length),d=0;d<f.length;d++)p[d]=Zt(f[d],n,l.parent,i);return p}}(e,d,t,n,r);var h=t.on;if(t.on=t.nativeOn,j(e.options.abstract)){var v=t.slot;t={},v&&(t.slot=v)}!function(e){for(var t=e.hook||(e.hook={}),n=0;n<fn.length;n++){var r=fn[n];t[r]=un[r]}}(t);var m,y=e.options.name||o,g=new se("vue-component-"+e.cid+(y?"-"+y:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:d,listeners:h,tag:o,children:r},a);return(m=g).data.attrs&&Qt in m.data.attrs?ln(g):g}}}function dn(e,t,n,r){var o={_isComponent:!0,parent:t,_parentVnode:e,_parentElm:n||null,_refElm:r||null},i=e.data.inlineTemplate;return A(i)&&(o.render=i.render,o.staticRenderFns=i.staticRenderFns),new e.componentOptions.Ctor(o)}var hn=1,vn=2;function mn(e,t,n,r,o,i){return(Array.isArray(n)||I(n))&&(o=r,r=n,n=void 0),j(i)&&(o=vn),function(e,t,n,r,o){if(A(n)&&A(n.__ob__))return le();A(n)&&A(n.is)&&(t=n.is);if(!t)return le();Array.isArray(r)&&"function"==typeof r[0]&&((n=n||{}).scopedSlots={default:r[0]},r.length=0);o===vn?r=tt(r):o===hn&&(r=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(r));var i,a;if("string"==typeof t){var s;a=e.$vnode&&e.$vnode.ns||T.getTagNamespace(t),i=T.isReservedTag(t)?new se(T.parsePlatformTagName(t),n,r,void 0,void 0,e):A(s=Ie(e.$options,"components",t))?pn(s,n,e,r,t):new se(t,n,r,void 0,void 0,e)}else i=pn(t,n,e,r);return Array.isArray(i)?i:A(i)?(A(a)&&function e(t,n,r){t.ns=n;"foreignObject"===t.tag&&(r=!(n=void 0));if(A(t.children))for(var o=0,i=t.children.length;o<i;o++){var a=t.children[o];A(a.tag)&&($(a.ns)||j(r)&&"svg"!==a.tag)&&e(a,n,r)}}(i,a),A(n)&&function(e){b(e.style)&&Ge(e.style);b(e.class)&&Ge(e.class)}(n),i):le()}(e,t,n,r,o)}function yn(o){o._vnode=null,o._staticTrees=null;var e=o.$options,t=o.$vnode=e._parentVnode,n=t&&t.context;o.$slots=ut(e._renderChildren,n),o.$scopedSlots=_,o._c=function(e,t,n,r){return mn(o,e,t,n,r,!1)},o.$createElement=function(e,t,n,r){return mn(o,e,t,n,r,!0)};var r=t&&t.data;we(o,"$attrs",r&&r.attrs||_,null,!0),we(o,"$listeners",e._parentListeners||_,null,!0)}var gn,_n,bn,wn,kn,Sn,On,Cn=0;function xn(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r,n._parentElm=t._parentElm,n._refElm=t._refElm;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function En(e){var t=e.options;if(e.super){var n=En(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.extendOptions,o=e.sealedOptions;for(var i in n)n[i]!==o[i]&&(t||(t={}),t[i]=$n(n[i],r[i],o[i]));return t}(e);r&&N(e.extendOptions,r),(t=e.options=je(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function $n(e,t,n){if(Array.isArray(e)){var r=[];n=Array.isArray(n)?n:[n],t=Array.isArray(t)?t:[t];for(var o=0;o<e.length;o++)(0<=t.indexOf(e[o])||n.indexOf(e[o])<0)&&r.push(e[o]);return r}return e}function An(e){this._init(e)}function jn(e){e.cid=0;var a=1;e.extend=function(e){e=e||{};var t=this,n=t.cid,r=e._Ctor||(e._Ctor={});if(r[n])return r[n];var o=e.name||t.options.name,i=function(e){this._init(e)};return((i.prototype=Object.create(t.prototype)).constructor=i).cid=a++,i.options=je(t.options,e),i.super=t,i.options.props&&function(e){var t=e.options.props;for(var n in t)$t(e.prototype,"_props",n)}(i),i.options.computed&&function(e){var t=e.options.computed;for(var n in t)Mt(e.prototype,n,t[n])}(i),i.extend=t.extend,i.mixin=t.mixin,i.use=t.use,x.forEach(function(e){i[e]=t[e]}),o&&(i.options.components[o]=i),i.superOptions=t.options,i.extendOptions=e,i.sealedOptions=N({},i.options),r[n]=i}}function In(e){return e&&(e.Ctor.options.name||e.tag)}function Mn(e,t){return Array.isArray(e)?-1<e.indexOf(t):"string"==typeof e?-1<e.split(",").indexOf(t):(n=e,"[object RegExp]"===r.call(n)&&e.test(t));var n}function Tn(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=In(a.componentOptions);s&&!t(s)&&Pn(n,i,r,o)}}}function Pn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,l(n,t)}An.prototype._init=function(e){var t=this;t._uid=Cn++,t._isVue=!0,e&&e._isComponent?xn(t,e):t.$options=je(En(t.constructor),e||{},t),ht((t._renderProxy=t)._self=t),at(t),yn(t),yt(t,"beforeCreate"),Nt(t),At(t),Ft(t),yt(t,"created"),t.$options.el&&t.$mount(t.$options.el)},gn=An,_n={get:function(){return this._data}},bn={get:function(){return this._props}},Object.defineProperty(gn.prototype,"$data",_n),Object.defineProperty(gn.prototype,"$props",bn),gn.prototype.$set=ke,gn.prototype.$delete=Se,gn.prototype.$watch=function(e,t,n){if(u(t))return Pt(this,e,t,n);(n=n||{}).user=!0;var r=new xt(this,e,t,n);return n.immediate&&t.call(this,r.value),function(){r.teardown()}},kn=/^hook:/,(wn=An).prototype.$on=function(e,t){if(Array.isArray(e))for(var n=0,r=e.length;n<r;n++)this.$on(e[n],t);else(this._events[e]||(this._events[e]=[])).push(t),kn.test(e)&&(this._hasHookEvent=!0);return this},wn.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},wn.prototype.$off=function(e,t){var n=this;if(!arguments.length)return n._events=Object.create(null),n;if(Array.isArray(e)){for(var r=0,o=e.length;r<o;r++)this.$off(e[r],t);return n}var i=n._events[e];if(!i)return n;if(!t)return n._events[e]=null,n;if(t)for(var a,s=i.length;s--;)if((a=i[s])===t||a.fn===t){i.splice(s,1);break}return n},wn.prototype.$emit=function(t){var n=this,e=n._events[t];if(e){e=1<e.length?g(e):e;for(var r=g(arguments,1),o=0,i=e.length;o<i;o++)try{e[o].apply(n,r)}catch(e){Ne(e,n,'event handler for "'+t+'"')}}return n},(Sn=An).prototype._update=function(e,t){var n=this;n._isMounted&&yt(n,"beforeUpdate");var r=n.$el,o=n._vnode,i=dt;(dt=n)._vnode=e,o?n.$el=n.__patch__(o,e):(n.$el=n.__patch__(n.$el,e,t,!1,n.$options._parentElm,n.$options._refElm),n.$options._parentElm=n.$options._refElm=null),dt=i,r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n),n.$vnode&&n.$parent&&n.$vnode===n.$parent._vnode&&(n.$parent.$el=n.$el)},Sn.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},Sn.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){yt(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||l(t.$children,e),e._watcher&&e._watcher.teardown();for(var n=e._watchers.length;n--;)e._watchers[n].teardown();e._data.__ob__&&e._data.__ob__.vmCount--,e._isDestroyed=!0,e.__patch__(e._vnode,null),yt(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null),e.$vnode&&(e.$vnode.parent=null)}},Xt((On=An).prototype),On.prototype.$nextTick=function(e){return ze(e,this)},On.prototype._render=function(){var t,n=this,e=n.$options,r=e.render,o=e._parentVnode;o&&(n.$scopedSlots=o.data.scopedSlots||_),n.$vnode=o;try{t=r.call(n._renderProxy,n.$createElement)}catch(e){Ne(e,n,"render"),t=n._vnode}return t instanceof se||(t=le()),t.parent=o,t};var Fn,Nn,Rn,Dn=[String,RegExp,Array],Vn={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Dn,exclude:Dn,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)Pn(this.cache,e,this.keys)},mounted:function(){var e=this;this.$watch("include",function(t){Tn(e,function(e){return Mn(t,e)})}),this.$watch("exclude",function(t){Tn(e,function(e){return!Mn(t,e)})})},render:function(){var e=this.$slots.default,t=it(e),n=t&&t.componentOptions;if(n){var r=In(n),o=this.include,i=this.exclude;if(o&&(!r||!Mn(o,r))||i&&r&&Mn(i,r))return t;var a=this.cache,s=this.keys,c=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[c]?(t.componentInstance=a[c].componentInstance,l(s,c),s.push(c)):(a[c]=t,s.push(c),this.max&&s.length>parseInt(this.max)&&Pn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};Fn=An,Rn={get:function(){return T}},Object.defineProperty(Fn,"config",Rn),Fn.util={warn:te,extend:N,mergeOptions:je,defineReactive:we},Fn.set=ke,Fn.delete=Se,Fn.nextTick=ze,Fn.options=Object.create(null),x.forEach(function(e){Fn.options[e+"s"]=Object.create(null)}),N((Fn.options._base=Fn).options.components,Vn),Fn.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(-1<t.indexOf(e))return this;var n=g(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this},Fn.mixin=function(e){return this.options=je(this.options,e),this},jn(Fn),Nn=Fn,x.forEach(function(n){Nn[n]=function(e,t){return t?("component"===n&&u(t)&&(t.name=t.name||e,t=this.options._base.extend(t)),"directive"===n&&"function"==typeof t&&(t={bind:t,update:t}),this.options[n+"s"][e]=t):this.options[n+"s"][e]}}),Object.defineProperty(An.prototype,"$isServer",{get:K}),Object.defineProperty(An.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(An,"FunctionalRenderContext",{value:Kt}),An.version="2.5.16";var Ln=1;function Jn(e){this.instanceId="",this.nodeId=Ln++,this.parentNode=null,this.nodeType=3,this.text=e}function Wn(e){return o.createElement(e)}var qn=Object.freeze({namespaceMap:{},createElement:Wn,createElementNS:function(e,t){return o.createElement(e+":"+t)},createTextNode:function(e){return new Jn(e)},createComment:function(e){return o.createComment(e)},insertBefore:function(e,t,n){if(3!==t.nodeType)e.insertBefore(t,n);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var r=Wn("text");r.setAttr("value",t.text),e.insertBefore(r,n)}},removeChild:function(e,t){3!==t.nodeType?e.removeChild(t):e.setAttr("value","")},appendChild:function(e,t){if(3!==t.nodeType)e.appendChild(t);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var n=Wn("text");n.setAttr("value",t.text),e.appendChild(n)}},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.type},setTextContent:function(e,t){e.parentNode&&e.parentNode.setAttr("value",t)},setAttribute:function(e,t,n){e.setAttr(t,n)},setStyleScope:function(e,t){e.setAttr("@styleScope",t)}}),Bn={create:function(e,t){Un(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Un(e,!0),Un(t))},destroy:function(e){Un(e,!0)}};function Un(e,t){var n=e.data.ref;if(A(n)){var r=e.context,o=e.componentInstance||e.elm,i=r.$refs;t?Array.isArray(i[n])?l(i[n],o):i[n]===o&&(i[n]=void 0):e.data.refInFor?Array.isArray(i[n])?i[n].indexOf(o)<0&&i[n].push(o):i[n]=[o]:i[n]=o}}s("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),s("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0);var zn=s("text,number,password,search,email,tel,url"),Hn=new se("",{},[]),Gn=["create","activate","update","remove","destroy"];function Xn(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&A(e.data)===A(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=A(n=e.data)&&A(n=n.attrs)&&n.type,o=A(n=t.data)&&A(n=n.attrs)&&n.type;return r===o||zn(r)&&zn(o)}(e,t)||j(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&$(t.asyncFactory.error))}function Kn(e,t,n){var r,o,i={};for(r=t;r<=n;++r)A(o=e[r].key)&&(i[o]=r);return i}var Zn={create:Yn,update:Yn,destroy:function(e){Yn(e,Hn)}};function Yn(e,t){(e.data.directives||t.data.directives)&&function(t,n){var e,r,o,i=t===Hn,a=n===Hn,s=er(t.data.directives,t.context),c=er(n.data.directives,n.context),l=[],u=[];for(e in c)r=s[e],o=c[e],r?(o.oldValue=r.value,tr(o,"update",n,t),o.def&&o.def.componentUpdated&&u.push(o)):(tr(o,"bind",n,t),o.def&&o.def.inserted&&l.push(o));if(l.length){var f=function(){for(var e=0;e<l.length;e++)tr(l[e],"inserted",n,t)};i?Qe(n,"insert",f):f()}u.length&&Qe(n,"postpatch",function(){for(var e=0;e<u.length;e++)tr(u[e],"componentUpdated",n,t)});if(!i)for(e in s)c[e]||tr(s[e],"unbind",t,t,a)}(e,t)}var Qn=Object.create(null);function er(e,t){var n,r,o,i=Object.create(null);if(!e)return i;for(n=0;n<e.length;n++)(r=e[n]).modifiers||(r.modifiers=Qn),(i[(o=r,o.rawName||o.name+"."+Object.keys(o.modifiers||{}).join("."))]=r).def=Ie(t.$options,"directives",r.name);return i}function tr(t,n,r,e,o){var i=t.def&&t.def[n];if(i)try{i(r.elm,t,r,e,o)}catch(e){Ne(e,r.context,"directive "+t.name+" "+n+" hook")}}var nr=[Bn,Zn];function rr(e,t){if(e.data.attrs||t.data.attrs){var n,r,o=t.elm,i=e.data.attrs||{},a=t.data.attrs||{};a.__ob__&&(a=t.data.attrs=N({},a));var s="function"==typeof o.setAttrs,c={};for(n in a)r=a[n],i[n]!==r&&(s?c[n]=r:o.setAttr(n,r));for(n in i)null==a[n]&&(s?c[n]=void 0:o.setAttr(n));s&&o.setAttrs(c)}}var or={create:rr,update:rr};function ir(e,t){var n=t.elm,r=t.context,o=t.data,i=e.data;if(o.staticClass||o.class||i&&(i.staticClass||i.class)){var a=[],s=i.staticClass;s&&a.push.apply(a,s),i.class&&a.push.apply(a,i.class);var c,l,u,f,p=[],d=o.staticClass;if(d&&p.push.apply(p,d),o.class&&p.push.apply(p,o.class),"function"==typeof n.setClassList)n.setClassList(p);else{var h=(c=a,l=p,u=r.$options.style||{},f={},l.forEach(function(e){var t=u[e];N(f,t)}),c.forEach(function(e){var t=u[e];for(var n in t)f.hasOwnProperty(n)||(f[n]="")}),f);if("function"==typeof n.setStyles)n.setStyles(h);else for(var v in h)n.setStyle(v,h[v])}}}var ar,sr,cr={create:ir,update:ir};function lr(t,e,n,r,o,i){if(r)console.log("Weex do not support event in bubble phase.");else{if(n){var a=e,s=ar;e=function(e){null!==(1===arguments.length?a(e):a.apply(null,arguments))&&ur(t,null,null,s)}}if(sr&&sr._virtualComponents){ar._context=sr;var c=e;e=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=(t[0]||{}).componentId,o=this._context;r&&this._context&&(o=(this._context._virtualComponents||{})[r]||o);try{!function(e,t,n){void 0===n&&(n=null);var r=e.fns;if(!Array.isArray(r))return"function"==typeof r?r.apply(n,t):e.apply(n,t);for(var o=r.slice(),i=0;i<o.length;i++)o[i].apply(n,t)}(c,t,o)}catch(e){Ne(e,o,"Failed to invoke virtual component handler ("+r+")")}}}ar.addEvent(t,e,i)}}function ur(e,t,n,r){(r||ar).removeEvent(e)}function fr(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};ar=t.elm,sr=t.context,Ye(n,r,lr,ur,t.context),sr=ar=void 0}}var pr={create:fr,update:fr},dr=p(h);function hr(e,t){if(e.data.style||t.data.style){var n,r,o=t.elm,i=e.data.style||{},a=t.data.style||{},s=a.__ob__;Array.isArray(a)&&(a=t.data.style=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&N(t,e[n]);return t}(a)),s&&(a=t.data.style=N({},a));var c="function"==typeof o.setStyles,l={};for(r in i)a[r]||(c?l[dr(r)]="":o.setStyle(dr(r),""));for(r in a)n=a[r],c?l[dr(r)]=n:o.setStyle(dr(r),n);c&&o.setStyles(l)}}var vr={create:function(e,t){if(t.data.staticStyle){var n=t.elm,r=t.data.staticStyle,o="function"==typeof n.setStyles,i={};for(var a in r)r[a]&&(o?i[dr(a)]=r[a]:n.setStyle(dr(a),r[a]));o&&n.setStyles(i),hr(e,t)}else hr(e,t)},update:hr};function mr(e){if(e){if("object"!=typeof e)return"string"==typeof e?yr(e):void 0;var t={};return!1!==e.css&&N(t,yr(e.name||"v")),N(t,e),t}}var yr=p(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}});J&&!U&&(void 0===window.ontransitionend&&window.onwebkittransitionend,void 0===window.onanimationend&&window.onwebkitanimationend);J&&window.requestAnimationFrame&&window.requestAnimationFrame.bind(window);function gr(e,n){var r=n.elm;r._leaveCb&&(r._leaveCb.cancelled=!0,r._leaveCb());var t=mr(n.data.transition);if(t&&!r._enterCb){for(var o=t.enterClass,i=t.enterToClass,a=t.enterActiveClass,s=t.appearClass,c=t.appearToClass,l=t.appearActiveClass,u=t.beforeEnter,f=t.enter,p=t.afterEnter,d=t.enterCancelled,h=t.beforeAppear,v=t.appear,m=t.afterAppear,y=t.appearCancelled,g=dt,_=dt.$vnode;_&&_.parent;)g=(_=_.parent).context;var b=!g._isMounted||!n.isRootInsert;if(!b||v||""===v){var w=b?s:o,k=b?c:i,S=b?l:a,O=b&&h||u,C=b&&"function"==typeof v?v:f,x=b&&m||p,E=b&&y||d,$=C&&1<(C._length||C.length),A=n.context.$options.style||{},j=A[w],I=A["@TRANSITION"]&&A["@TRANSITION"][S]||{},M=function(e,t,n,r,o,i){var a={},s=t[n],c=t[r],l=t[o];if(s)for(var u in s)a[u]=e.style[u];if(l)for(var f in l)0!==f.indexOf("transition")&&(a[f]=l[f]);c&&N(a,c);return a}(r,A,w,k,S,n.context),T=0<Object.keys(M).length,P=r._enterCb=D(function(){P.cancelled?E&&E(r):x&&x(r),r._enterCb=null});if(setTimeout(function(){var e=r.parentNode,t=e&&e._pending&&e._pending[n.key];(t&&t.context===n.context&&t.tag===n.tag&&t.elm._leaveCb&&t.elm._leaveCb(),C&&C(r,P),T)?n.context.$requireWeexModule("animation").transition(r.ref,{styles:M,duration:I.duration||0,delay:I.delay||0,timingFunction:I.timingFunction||"linear"},$?R:P):$||P()},16),O&&O(r),j)if("function"==typeof r.setStyles)r.setStyles(j);else for(var F in j)r.setStyle(F,j[F]);T||$||P()}}}var _r=function(e){var r,t,g={},n=e.modules,_=e.nodeOps;for(r=0;r<Gn.length;++r)for(g[Gn[r]]=[],t=0;t<n.length;++t)A(n[t][Gn[r]])&&g[Gn[r]].push(n[t][Gn[r]]);function i(e){var t=_.parentNode(e);A(t)&&_.removeChild(t,e)}function b(e,t,n,r,o,i,a){if(A(e.elm)&&A(i)&&(e=i[a]=fe(e)),e.isRootInsert=!o,!function(e,t,n,r){var o=e.data;if(A(o)){var i=A(e.componentInstance)&&o.keepAlive;if(A(o=o.hook)&&A(o=o.init)&&o(e,!1,n,r),A(e.componentInstance))return d(e,t),j(i)&&function(e,t,n,r){for(var o,i=e;i.componentInstance;)if(i=i.componentInstance._vnode,A(o=i.data)&&A(o=o.transition)){for(o=0;o<g.activate.length;++o)g.activate[o](Hn,i);t.push(i);break}f(n,e.elm,r)}(e,t,n,r),!0}}(e,t,n,r)){var s=e.data,c=e.children,l=e.tag;if(A(l)){e.elm=e.ns?_.createElementNS(e.ns,l):_.createElement(l,e),p(e);var u=A(s)&&j(s.appendAsTree);u||(A(s)&&v(e,t),f(n,e.elm,r)),h(e,c,t),u&&(A(s)&&v(e,t),f(n,e.elm,r))}else j(e.isComment)?e.elm=_.createComment(e.text):e.elm=_.createTextNode(e.text),f(n,e.elm,r)}}function d(e,t){A(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,w(e)?(v(e,t),p(e)):(Un(e),t.push(e))}function f(e,t,n){A(e)&&(A(n)?n.parentNode===e&&_.insertBefore(e,t,n):_.appendChild(e,t))}function h(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)b(t[r],n,e.elm,null,!0,t,r);else I(e.text)&&_.appendChild(e.elm,_.createTextNode(String(e.text)))}function w(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return A(e.tag)}function v(e,t){for(var n=0;n<g.create.length;++n)g.create[n](Hn,e);A(r=e.data.hook)&&(A(r.create)&&r.create(Hn,e),A(r.insert)&&t.push(e))}function p(e){var t;if(A(t=e.fnScopeId))_.setStyleScope(e.elm,t);else for(var n=e;n;)A(t=n.context)&&A(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t),n=n.parent;A(t=dt)&&t!==e.context&&t!==e.fnContext&&A(t=t.$options._scopeId)&&_.setStyleScope(e.elm,t)}function y(e,t,n,r,o,i){for(;r<=o;++r)b(n[r],i,e,t,!1,n,r)}function k(e){var t,n,r=e.data;if(A(r))for(A(t=r.hook)&&A(t=t.destroy)&&t(e),t=0;t<g.destroy.length;++t)g.destroy[t](e);if(A(t=e.children))for(n=0;n<e.children.length;++n)k(e.children[n])}function S(e,t,n,r){for(;n<=r;++n){var o=t[n];A(o)&&(A(o.tag)?(a(o),k(o)):i(o.elm))}}function a(e,t){if(A(t)||A(e.data)){var n,r=g.remove.length+1;for(A(t)?t.listeners+=r:t=function(e,t){function n(){0==--n.listeners&&i(e)}return n.listeners=t,n}(e.elm,r),A(n=e.componentInstance)&&A(n=n._vnode)&&A(n.data)&&a(n,t),n=0;n<g.remove.length;++n)g.remove[n](e,t);A(n=e.data.hook)&&A(n=n.remove)?n(e,t):t()}else i(e.elm)}function O(e,t,n,r){for(var o=n;o<r;o++){var i=t[o];if(A(i)&&Xn(e,i))return o}}function C(e,t,n,r){if(e!==t){var o=t.elm=e.elm;if(j(e.isAsyncPlaceholder))A(t.asyncFactory.resolved)?E(e.elm,t,n):t.isAsyncPlaceholder=!0;else if(j(t.isStatic)&&j(e.isStatic)&&t.key===e.key&&(j(t.isCloned)||j(t.isOnce)))t.componentInstance=e.componentInstance;else{var i,a=t.data;A(a)&&A(i=a.hook)&&A(i=i.prepatch)&&i(e,t);var s=e.children,c=t.children;if(A(a)&&w(t)){for(i=0;i<g.update.length;++i)g.update[i](e,t);A(i=a.hook)&&A(i=i.update)&&i(e,t)}$(t.text)?A(s)&&A(c)?s!==c&&function(e,t,n,r,o){for(var i,a,s,c=0,l=0,u=t.length-1,f=t[0],p=t[u],d=n.length-1,h=n[0],v=n[d],m=!o;c<=u&&l<=d;)$(f)?f=t[++c]:$(p)?p=t[--u]:Xn(f,h)?(C(f,h,r),f=t[++c],h=n[++l]):Xn(p,v)?(C(p,v,r),p=t[--u],v=n[--d]):Xn(f,v)?(C(f,v,r),m&&_.insertBefore(e,f.elm,_.nextSibling(p.elm)),f=t[++c],v=n[--d]):(Xn(p,h)?(C(p,h,r),m&&_.insertBefore(e,p.elm,f.elm),p=t[--u]):($(i)&&(i=Kn(t,c,u)),$(a=A(h.key)?i[h.key]:O(h,t,c,u))?b(h,r,e,f.elm,!1,n,l):Xn(s=t[a],h)?(C(s,h,r),t[a]=void 0,m&&_.insertBefore(e,s.elm,f.elm)):b(h,r,e,f.elm,!1,n,l)),h=n[++l]);u<c?y(e,$(n[d+1])?null:n[d+1].elm,n,l,d,r):d<l&&S(0,t,c,u)}(o,s,c,n,r):A(c)?(A(e.text)&&_.setTextContent(o,""),y(o,null,c,0,c.length-1,n)):A(s)?S(0,s,0,s.length-1):A(e.text)&&_.setTextContent(o,""):e.text!==t.text&&_.setTextContent(o,t.text),A(a)&&A(i=a.hook)&&A(i=i.postpatch)&&i(e,t)}}}function x(e,t,n){if(j(n)&&A(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var m=s("attrs,class,staticClass,staticStyle,key");function E(e,t,n,r){var o,i=t.tag,a=t.data,s=t.children;if(r=r||a&&a.pre,t.elm=e,j(t.isComment)&&A(t.asyncFactory))return t.isAsyncPlaceholder=!0;if(A(a)&&(A(o=a.hook)&&A(o=o.init)&&o(t,!0),A(o=t.componentInstance)))return d(t,n),!0;if(A(i)){if(A(s))if(e.hasChildNodes())if(A(o=a)&&A(o=o.domProps)&&A(o=o.innerHTML)){if(o!==e.innerHTML)return!1}else{for(var c=!0,l=e.firstChild,u=0;u<s.length;u++){if(!l||!E(l,s[u],n,r)){c=!1;break}l=l.nextSibling}if(!c||l)return!1}else h(t,s,n);if(A(a)){var f=!1;for(var p in a)if(!m(p)){f=!0,v(t,n);break}!f&&a.class&&Ge(a.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,r,o,i){if(!$(t)){var a,s=!1,c=[];if($(e))s=!0,b(t,c,o,i);else{var l=A(e.nodeType);if(!l&&Xn(e,t))C(e,t,c,r);else{if(l){if(1===e.nodeType&&e.hasAttribute(M)&&(e.removeAttribute(M),n=!0),j(n)&&E(e,t,c))return x(t,c,!0),e;a=e,e=new se(_.tagName(a).toLowerCase(),{},[],void 0,a)}var u=e.elm,f=_.parentNode(u);if(b(t,c,u._leaveCb?null:f,_.nextSibling(u)),A(t.parent))for(var p=t.parent,d=w(t);p;){for(var h=0;h<g.destroy.length;++h)g.destroy[h](p);if(p.elm=t.elm,d){for(var v=0;v<g.create.length;++v)g.create[v](Hn,p);var m=p.data.hook.insert;if(m.merged)for(var y=1;y<m.fns.length;y++)m.fns[y]()}else Un(p);p=p.parent}A(f)?S(0,[e],0,0):A(e.tag)&&k(e)}}return x(t,c,s),t.elm}A(e)&&k(e)}}({nodeOps:qn,modules:[or,cr,pr,vr,{create:gr,activate:gr,remove:function(n,e){var r=n.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var t=mr(n.data.transition);if(!t)return e();if(r._leaveCb)return;var o=t.leaveClass,i=t.leaveToClass,a=t.leaveActiveClass,s=t.beforeLeave,c=t.leave,l=t.afterLeave,u=t.leaveCancelled,f=t.delayLeave,p=c&&1<(c._length||c.length),d=n.context.$options.style||{},h=d[o],v=d[i]||d[a],m=d["@TRANSITION"]&&d["@TRANSITION"][a]||{},y=r._leaveCb=D(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[n.key]=null),y.cancelled?u&&u(r):(e(),l&&l(r)),r._leaveCb=null});f?f(g):g();function g(){var e=n.context.$requireWeexModule("animation");function t(){e.transition(r.ref,{styles:v,duration:m.duration||0,delay:m.delay||0,timingFunction:m.timingFunction||"linear"},p?R:y)}y.cancelled||(n.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[n.key]=n),s&&s(r),h?e.transition(r.ref,{styles:h},t):t(),c&&c(r,y),v||p||y())}}}].concat(nr),LONG_LIST_THRESHOLD:10}),br=Object.getOwnPropertyNames(de);function wr(e,r){var o=e.$el;return o&&"function"==typeof o[r]?function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return o[r].apply(o,t)}:(te("Can't find component method \""+r+'" on '+o.type),R)}function kr(n,r){Array.isArray(r)&&(!function(p,n){for(var e=function(e,t){var f=br[e];P(n,f,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this.length,o=de[f];"function"==typeof o&&o.apply(this,t);var i=wr(p,"removeData"),a=wr(p,"insertRange"),s=wr(p,"setListData");switch(f){case"push":a(r,t);break;case"pop":i(r-1,1);break;case"shift":i(0,1);break;case"unshift":a(0,t);break;case"splice":var c=t[0],l=t[1],u=t.slice(2);0<l&&i(c,l),0<u.length&&a(c,u);break;case"sort":case"reverse":s(this.slice())}})},t=0,r=br.length;t<r;t++)e(t)}(n,r),r.forEach(function(t,e){u(t)&&!f(t,"[[Watched]]")&&(P(t,"[[Watched]]",!0),n.$watch(function(){for(var e in t)t[e]},function(){wr(n,"updateData")(r.indexOf(t),t)},{deep:!0}))}))}var Sr={name:"recycle-list",methods:{closest:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).closest.apply(e,n)},queryElement:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).queryElement.apply(e,n)},queryElementAll:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).queryElementAll.apply(e,n)},scrollToElement:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).scrollToElement.apply(e,n)},resetLoadmore:function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=this.$el).resetLoadmore.apply(e,n)}},render:function(e){var t=this;if(this._vnode&&this.$options["[[UseCache]]"])return P(this.$options,"[[UseCache]]",!1),this._vnode;var n=this.$options.parent,r=this.$attrs.bindingExpression;return n&&r&&(n.$watch(r,function(){return P(t.$options,"[[UseCache]]",!0)},{deep:!0,immediate:!0}),kr(this,this.$attrs.listData),n.$watch(r,function(e){kr(t,e)})),this._events._attach_slot=function(e){nn(t.$parent||t,e.position,e.refs)},this._events._detach_slot=function(e){nn(t.$parent||t,e.position,e.refs,!0)},e("weex:recycle-list",{on:this._events},this.$slots.default)},renderError:function(e,t){return e("text",{style:{fontSize:"36px",color:"#FF0000"},value:t.toString()})}};function Or(e){if(e.length)return e.map(function(e){var t,n,r=(t=e).tag?t.tag.replace(/vue\-component\-(\d+\-)?/,""):"",o={type:r};if(r){if(o.style=function(e){if(e&&e.data){var t=e.data,n=t.staticStyle,r=t.staticClass;if(e.data.style||e.data.class||n||r){var o=Object.assign({},n,e.data.style),i=e.context.$options.style||{};return[].concat(r,e.data.class).forEach(function(e){e&&i[e]&&Object.assign(o,i[e])}),o}}}(e),e.data&&(o.attr=e.data.attrs,e.data.on&&(o.events=e.data.on)),"span"===r&&((n=e).children&&1===n.children.length&&!n.children[0].tag))return o.attr=o.attr||{},o.attr.value=e.children[0].text.trim(),o}else o.type="span",o.attr={value:(e.text||"").trim()};return e.children&&e.children.length&&(o.children=Or(e.children)),o})}var Cr={name:"richtext",render:function(e){return e("weex:richtext",{on:this._events,attrs:{value:Or(this.$options._renderChildren||[])}})}},xr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function Er(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?Er(it(t.children)):e}function $r(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[h(i)]=o[i];return t}function Ar(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var jr={name:"transition",props:xr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(function(e){return e.tag||ot(e)})).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=Er(o);if(!i)return o;if(this._leaving)return Ar(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:I(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var s,c,l=(i.data||(i.data={})).transition=$r(this),u=this._vnode,f=Er(u);if(i.data.directives&&i.data.directives.some(function(e){return"show"===e.name})&&(i.data.show=!0),f&&f.data&&(s=i,(c=f).key!==s.key||c.tag!==s.tag)&&!ot(f)&&(!f.componentInstance||!f.componentInstance._vnode.isComment)){var p=f.data.transition=N({},l);if("out-in"===r)return this._leaving=!0,Qe(p,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),Ar(e,o);if("in-out"===r){if(ot(i))return u;var d,h=function(){d()};Qe(l,"afterEnter",h),Qe(l,"enterCancelled",h),Qe(p,"delayLeave",function(e){d=e})}}return o}}},Ir=N({tag:String,moveClass:String},xr);delete Ir.mode;var Mr={RecycleList:Sr,Richtext:Cr,Transition:jr,TransitionGroup:{props:Ir,created:function(){var e=this.$requireWeexModule("dom");this.getPosition=function(r){return new Promise(function(t,n){e.getComponentRect(r.ref,function(e){e.result?t(e.size):n(new Error("failed to get rect for element: "+r.tag))})})};var r=this.$requireWeexModule("animation");this.animate=function(t,n){return new Promise(function(e){r.transition(t.ref,n,e)})}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=$r(this),s=0;s<o.length;s++){var c=o[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(i.push(c),((n[c.key]=c).data||(c.data={})).transition=a)}if(r){var l=[],u=[];r.forEach(function(e){e.data.transition=a,n[e.key]?l.push(e):u.push(e)}),this.kept=e(t,null,l),this.removed=u}return e(t,null,i)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.getMoveData(e[0].context,t)},methods:{getMoveData:function(e,t){var n=e.$options.style||{};return n["@TRANSITION"]&&n["@TRANSITION"][t]}}}},Tr=s("template,script,style,element,content,slot,link,meta,svg,view,a,div,img,image,text,span,input,switch,textarea,spinner,select,slider,slider-neighbor,indicator,canvas,list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown",!0),Pr=(s("web,spinner,switch,video,textarea,canvas,indicator,marquee,countdown",!0),s("richtext,transition,transition-group,recycle-list",!0));s("embed,img,image,input,link,meta",!0);function Fr(e){return!(!e.$options||!e.$options.el)}An.mixin({beforeCreate:function(){Fr(this)&&Ue()},destroyed:function(){Fr(this)&&(Je.length=0,Le=Ve=null,Be=We=!1)}}),An.config.mustUseProp=function(e,t,n){return!1},An.config.isReservedTag=Tr,An.config.isRuntimeComponent=Pr,An.config.isUnknownElement=function(e){return!1},An.options.directives={},An.options.components=Mr,An.prototype.__patch__=_r,An.prototype.$mount=function(e,t){return n=this,r=e&&(i=this.$document,(a=i.createComment("root")).hasAttribute=a.removeAttribute=function(){},i.documentElement.appendChild(a),a),o=t,n.$el=r,n.$options.render||(n.$options.render=le),yt(n,"beforeMount"),new xt(n,function(){n._update(n._render(),o)},R,null,!0),o=!1,null==n.$vnode&&(n._isMounted=!0,yt(n,"mounted")),n;var n,r,o,i,a},e.Vue=An}});e(gr);var _r=n(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var f={};t.createInstanceContext=function(e,t,n){void 0===n&&(n={});var r,o,i,a,s=t.weex,c=(f[e]={instanceId:e,config:s.config,document:s.document,data:n}).Vue=function(e,t){var n={};gr(n,t.document);var r=n.Vue,o=f[e],i=/^weex:/i,a=r.config.isReservedTag||function(){return!1},s=r.config.isRuntimeComponent||function(){return!1};return r.config.isReservedTag=function(e){return!s(e)&&t.supports("@component/"+e)||a(e)||i.test(e)},r.config.parsePlatformTagName=function(e){return e.replace(i,"")},r.prototype.$instanceId=e,r.prototype.$document=o.document,r.prototype.$requireWeexModule=t.requireModule,r.mixin({beforeCreate:function(){var e=this.$options;if(e.el){var t=e.data,n=("function"==typeof t?t():t)||{};e.data=Object.assign(n,o.data),o.app=this}},mounted:function(){if(this.$options.el&&t.document&&o.app===this)try{t.document.taskCenter.send("dom",{action:"createFinish"},[])}catch(e){}}}),r.prototype.$getConfig=function(){if(o.app instanceof r)return o.config},r}(e,s),l=(r=e,o=s.requireModule,i=f[r],a=o("timer"),{setTimeout:function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),i.document.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return a.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),i.document.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){a.clearTimeout(e)},clearInterval:function(e){a.clearInterval(e)}}),u=Object.assign({Vue:c},l);return Object.freeze(u),u},t.destroyInstance=function(e){var t=f[e];if(t&&t.app instanceof t.Vue){try{t.app.$destroy(),t.document.destroy()}catch(e){}delete t.document,delete t.app}delete f[e]},t.refreshInstance=function(e,t){var n=f[e];if(!(n&&n.app instanceof n.Vue))return new Error("refreshInstance: instance "+e+" not found!");if(n.Vue&&n.Vue.set)for(var r in t)n.Vue.set(n.app,r,t[r]);n.document.taskCenter.send("dom",{action:"refreshFinish"},[])}}),br=e(_r),wr=_r.createInstanceContext,kr=_r.destroyInstance,Sr=_r.refreshInstance,Or=Object.freeze({default:br,__moduleExports:_r,createInstanceContext:wr,destroyInstance:kr,refreshInstance:Sr});var Cr=Object.freeze({$:function(e){console.warn("[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead");var t=this._ids[e];if(t)return t.vm},$el:function(e){var t=this._ids[e];if(t)return t.el},$vm:function(e){var t=this._ids[e];if(t)return t.vm},$renderThen:function(e){return this._app.differ.then(function(){e()})},$scrollTo:function(e,t){console.warn("[JS Framework] Vm#$scrollTo is deprecated, please use \"require('@weex-module/dom').scrollTo(el, options)\" instead");var n=this.$el(e);n&&this._app.requireModule("dom").scrollToElement(n.ref,{offset:t})},$transition:function(e,n,r){var o=this,i=this.$el(e);i&&n&&n.styles&&this._app.requireModule("animation").transition(i.ref,n,function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];o._setStyle(i,n.styles),r&&r.apply(void 0,e)})},$getConfig:function(e){var t=this._app.options;return"function"==typeof e&&(console.warn("[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, this api now can directly RETURN config info."),e(t)),t},$sendHttp:function(e,t){console.warn("[JS Framework] Vm#$sendHttp is deprecated, please use \"require('@weex-module/stream').sendHttp(params, callback)\" instead"),this._app.requireModule("stream").sendHttp(e,t)},$openURL:function(e){console.warn("[JS Framework] Vm#$openURL is deprecated, please use \"require('@weex-module/event').openURL(url)\" instead"),this._app.requireModule("event").openURL(e)},$setTitle:function(e){console.warn("[JS Framework] Vm#$setTitle is deprecated, please use \"require('@weex-module/pageInfo').setTitle(title)\" instead"),this._app.requireModule("pageInfo").setTitle(e)},$call:function(e,t){for(var n=[],r=arguments.length-2;0<r--;)n[r]=arguments[r+2];console.warn("[JS Framework] Vm#$call is deprecated, please use \"require('@weex-module/moduleName')\" instead");var o=this._app.requireModule(e);o&&o[t]&&o[t].apply(o,n)}});function xr(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];if("function"==typeof Object.assign)Object.assign.apply(Object,[e].concat(t));else{var r=t.shift();for(var o in r)e[o]=r[o];t.length&&xr.apply(void 0,[e].concat(t))}return e}function Er(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function $r(e,t){if(e.length){var n=e.indexOf(t);if(-1<n)return e.splice(n,1)}}var Ar=Object.prototype.hasOwnProperty;function jr(e,t){return Ar.call(e,t)}function Ir(n,r){return function(e){var t=arguments.length;return t?1<t?n.apply(r,arguments):n.call(r,e):n.call(r)}}function Mr(e){return null!==e&&"object"==typeof e}var Tr=Object.prototype.toString,Pr="[object Object]";function Fr(e){return Tr.call(e)===Pr}function Nr(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}var Rr,Dr="__proto__"in{};function Vr(){return"object"==typeof nativeSet?nativeSet.create():new Rr}function Lr(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}"undefined"!=typeof Set&&Set.toString().match(/native code/)?Rr=Set:((Rr=function(){this.set=Object.create(null)}).prototype.has=function(e){return void 0!==this.set[e]},Rr.prototype.add=function(e){null==e||this.set[e]||(this.set[e]=1)},Rr.prototype.clear=function(){this.set=Object.create(null)});var Jr=/^@weex-component\//,Wr=/^@weex-module\//,qr=/^\.{1,2}\//,Br=/\.js$/,Ur=function(e){return!!e.match(Jr)},zr=function(e){return!!e.match(Wr)},Hr=function(e){return!!e.match(qr)},Gr=function(e){return!Ur(e)&&!zr(e)&&!Hr(e)};function Xr(e){return e.replace(Jr,"").replace(Wr,"")}function Kr(e){return e.replace(Br,"")}var Zr=0;function Yr(){this.id=Zr++,this.subs=[]}Yr.target=null;var Qr=[];function eo(){Yr.target=null,Qr=[]}Yr.prototype.addSub=function(e){this.subs.push(e)},Yr.prototype.removeSub=function(e){$r(this.subs,e)},Yr.prototype.depend=function(){Yr.target&&Yr.target.addDep(this)},Yr.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()};var to=0;function no(e,t,n,r){r&&xr(this,r);var o="function"==typeof t;(this.vm=e)._watchers.push(this),this.expression=t,this.cb=n,this.id=++to,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=Vr(),this.newDepIds=Vr(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}no.prototype.get=function(){var e;e=this,Yr.target&&Qr.push(Yr.target),Yr.target=e;var t=this.getter.call(this.vm,this.vm);return this.deep&&function e(t,n){var r,o,i,a;n||(n=ro).clear();i=Array.isArray(t);a=Mr(t);if(i||a){if(t.__ob__){var s=t.__ob__.dep.id;if(n.has(s))return;n.add(s)}if(i)for(r=t.length;r--;)e(t[r],n);else if(a)for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}}(t),Yr.target=Qr.pop(),this.cleanupDeps(),t},no.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},no.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},no.prototype.update=function(e){this.lazy?this.dirty=!0:this.run()},no.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||(Mr(e)||this.deep)&&!this.shallow){var t=this.value;this.value=e,this.cb.call(this.vm,e,t)}this.queued=this.shallow=!1}},no.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},no.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},no.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||$r(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1,this.vm=this.cb=this.value=null}};var ro=Vr();var oo=Array.prototype,io=Object.create(oo);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(a){var s=oo[a];Er(io,a,function(){for(var e=arguments,t=arguments.length,n=new Array(t);t--;)n[t]=e[t];var r,o=s.apply(this,n),i=this.__ob__;switch(a){case"push":case"unshift":r=n;break;case"splice":r=n.slice(2)}return r&&i.observeArray(r),i.dep.notify(),o})}),Er(oo,"$set",function(e,t){return console.warn('[JS Framework] "Array.prototype.$set" is not a standard API, it will be removed in the next version.'),e>=this.length&&(this.length=e+1),this.splice(e,1,t)[0]}),Er(oo,"$remove",function(e){console.warn('[JS Framework] "Array.prototype.$remove" is not a standard API, it will be removed in the next version.'),this.length&&("number"!=typeof e&&(e=this.indexOf(e)),-1<e&&this.splice(e,1))});var ao=Object.getOwnPropertyNames(io);function so(e){(this.value=e,this.dep=new Yr,Er(e,"__ob__",this),Array.isArray(e))?((Dr?co:lo)(e,io,ao),this.observeArray(e)):this.walk(e)}function co(e,t){e.__proto__=t}function lo(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];Er(e,i,t[i])}}function uo(e,t){var n;if(Mr(e))return jr(e,"__ob__")&&e.__ob__ instanceof so?n=e.__ob__:(Array.isArray(e)||Fr(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new so(e)),n&&t&&n.addVm(t),n}so.prototype.walk=function(e){for(var t in e)this.convert(t,e[t])},so.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)uo(e[t])},so.prototype.convert=function(e,t){!function(o,e,i){var a=new Yr,t=Object.getOwnPropertyDescriptor(o,e);if(t&&!1===t.configurable)return;var s=t&&t.get,n=t&&t.set,c=uo(i);Object.defineProperty(o,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(o):i;if(Yr.target&&(a.depend(),c&&c.dep.depend(),Array.isArray(e)))for(var t=void 0,n=0,r=e.length;n<r;n++)(t=e[n])&&t.__ob__&&t.__ob__.dep.depend();return e},set:function(e){var t=s?s.call(o):i;e!==t&&(n?n.call(o,e):i=e,c=uo(e),a.notify())}})}(this.value,e,t)},so.prototype.addVm=function(e){(this.vms||(this.vms=[])).push(e)},so.prototype.removeVm=function(e){$r(this.vms,e)};var fo=["$index","$value","$event"];function po(t,n){(-1<fo.indexOf(n)||!Nr(n))&&Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:function(){return t._data[n]},set:function(e){t._data[n]=e}})}function ho(e){var t=e._data;Fr(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)po(e,n[r]);uo(t,e)}function vo(){}function mo(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};o.set="function"==typeof r?(o.get=yo(r,e),vo):(o.get=r.get?!1!==r.cache?yo(r.get,e):Ir(r.get,e):vo,r.set?Ir(r.set,e):vo),Object.defineProperty(e,n,o)}}function yo(e,t){var n=new no(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Yr.target&&n.depend(),n.value}}var go={nativeComponentMap:{text:!0,image:!0,container:!0,slider:{type:"slider",append:"tree"},cell:{type:"cell",append:"tree"}}},_o=go.nativeComponentMap,bo={attr:"setAttr",style:"setStyle",event:"addEvent"};function wo(e,t,n){var r,o,i,a,s,c;Oo(e,t,n.id,e),r=e,o=t,i=n.attr,xo(r,o,"attr",i),function(e,t,n){if("function"!=typeof n&&!Array.isArray(n))return;if(Array.isArray(n)&&!n.length)return t.setClassStyle({});var r=e._options&&e._options.style||{};if("function"==typeof n){var o=$o(e,n,function(e){Co(t,r,e)});Co(t,r,o)}else Co(t,r,n)}(e,t,n.classList),a=e,s=t,c=n.style,xo(a,s,"style",c),function(e,t,n){if(!n)return;var r=Object.keys(n),o=r.length;for(;o--;){var i=r[o],a=n[i];"string"==typeof a&&((a=e[a])||console.warn('[JS Framework] The event handler "'+a+'" is not defined.')),s=e,c=i,l=a,t.addEvent(c,Ir(l,s))}var s,c,l}(e,t,n.events)}function ko(e,t,n,r){void 0===r&&(r={}),function(e,t,n){var r=t._options&&t._options.style||{};if(!n._rootEl)return;var o="@originalRootEl";function i(e,t){"array"===Lr(e)&&e.unshift(t)}if(r[o]=n._rootEl.classStyle,"function"==typeof e){var a=$o(t,e,function(e){i(e,o),Co(n._rootEl,r,e)});i(a,o),Co(n._rootEl,r,a)}else null!=e&&(i(e,o),Co(n._rootEl,r,e))}(n.classList,e,t),function(r,o,i){var e=function(t){var e=r[t];if("function"==typeof e){var n=$o(o,e,function(e){i._rootEl&&i._rootEl.setStyle(t,e)});i._rootEl.setStyle(t,n)}else i._rootEl&&i._rootEl.setStyle(t,e)};for(var t in r)e(t)}(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function So(r,o,i,a){if(r){var e=function(t){if(!o||o[t]){var e=r[t];if("function"==typeof e){var n=$o(i,e,function(e){a[t]=e});a[t]=n}else a[t]=e}};for(var t in r)e(t)}}function Oo(t,e,n,r){var o=Object.create(null);if(Object.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return e||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;((n=i.call(t))||0===n)&&(t._ids[n]=o),$o(t,i,function(e){e&&(t._ids[e]=o)})}else n&&"string"==typeof n&&(t._ids[n]=o)}function Co(e,n,r){"string"==typeof r&&(r=r.split(/\s+/)),r.forEach(function(e,t){r.splice.apply(r,[t,1].concat(e.split(/\s+/)))});for(var o={},t=r.length,i=function(e){var t=n[r[e]];t&&Object.keys(t).forEach(function(e){o[e]=t[e]})},a=0;a<t;a++)i(a);e.setClassStyle(o)}function xo(e,t,n,r){if(r)for(var o=Object.keys(r),i=o.length;i--;){var a=o[i],s=r[a];"function"==typeof s?Eo(e,t,n,a,s):t[bo[n]](a,s)}}function Eo(r,o,e,i,t){var a=bo[e],n=$o(r,t,function(e){function t(){o[a](i,e)}var n=r&&r._app&&r._app.differ;n?n.append("element",o.depth||0,o.ref,t):t()});o[a](i,n)}function $o(e,t,n){return e._static?t.call(e,e):new no(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)}).value}function Ao(e,t){var n=e._app.doc.createComment("start"),r=e._app.doc.createComment("end"),o=jo++;if(t.element){var i=t.updateMark;i?(i.element&&(i=i.end),t.element.insertAfter(r,i),t.element.insertAfter(n,i),t.updateMark=r):(t.element.insertBefore(n,t.end),t.element.insertBefore(r,t.end)),t=t.element}else t.appendChild(n),t.appendChild(r);return{start:n,end:r,element:t,blockId:o}}var jo=1;function Io(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=Mo(e,t,o);return n.updateMark=t.element?t.end:t,i}if(!t.element)return n.element.insertBefore(t,r);n.element.insertBefore(t.start,r),n.element.insertBefore(t.end,r)}else{if(!t.element)return n.appendChild(t);n.appendChild(t.start),n.appendChild(t.end)}}function Mo(e,t,n){return t.element?function(e,t){var n=t.parentNode;if(n){for(var r,o=e.start,i=[o];o&&o!==e.end;)o=o.nextSibling,i.push(o);var a=t;return i.every(function(e){return r=n.insertAfter(e,a),a=e,-1!==r}),r}}(t,n):function(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}(t,n)}function To(e,t,n){void 0===n&&(n=!1),t.element?function(e,t){void 0===t&&(t=!1);var n=[],r=e.start.nextSibling;for(;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||Po(e.start);n.forEach(function(e){Po(e)}),t||Po(e.end)}(t,n):Po(t),t._vm&&t._vm.$emit("hook:destroyed")}function Po(e){var t=e.parentNode;t&&t.removeChild(e)}function Fo(e,t,n,r){if(-1!==(e._app||{}).lastSignal){if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),c=t,Array.isArray(c))return i=t,a=r,s=Ao(o=e,n),void i.forEach(function(e){Fo(o,e,s,a)});var o,i,a,s,c,l,u,f;if(r=r||{},"content"===(l=t).type||"slot"===l.type)return console.debug('[JS Framework] compile "content" block by',t),void(e._content=Ao(e,n));if(u=t,!r.hasOwnProperty("repeat")&&u.repeat)return console.debug('[JS Framework] compile "repeat" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `repeat` directive!"):function(e,t,n){var r=t.repeat,o="function"==typeof r,i=r.getter||r.expression||r;"function"!=typeof i&&(i=function(){return[]});var a=r.key||"$index",s=r.value||"$value",c=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,l=Ao(e,n);l.children=[],l.data=[],l.vms=[],function(c,i,l,e){var u=l.vms,f=l.children,t=e.getter,p=e.trackBy,d=e.oldStyle,h=e.key,v=e.value;function m(e,t,n){var r;d?Mr(r=e)?(r[h]=t,r.hasOwnProperty("INDEX")||Object.defineProperty(r,"INDEX",{value:function(){console.warn('[JS Framework] "INDEX" in repeat is deprecated, please use "$index" instead')}})):(console.warn("[JS Framework] Each list item must be an object in old-style repeat, please use `repeat={{v in list}}` instead."),(r={})[h]=t,r[v]=e):((r={})[h]=t,r[v]=e);var o=function(e,t){var n=Object.create(e);n._data=t,ho(n),mo(n),(n._realParent=e)._static&&(n._static=e._static);return n}(n,r);u.push(o),Fo(o,i,l,{repeat:e})}var n=Ro(c,l,t,"repeat",function(e){if(console.debug('[JS Framework] the "repeat" item has changed',e),l&&e){var r=f.slice(),o=u.slice(),t=l.data.slice(),i={},a={};e.forEach(function(e,t){var n=p?e[p]:d?e[h]:t;null!=n&&""!==n&&(i[n]=e)});var s=[];t.forEach(function(e,t){var n=p?e[p]:d?e[h]:t;i.hasOwnProperty(n)?(a[n]={item:e,index:t,key:n,target:r[t],vm:o[t]},s.push(e)):To(0,r[t])}),f.length=0,u.length=0,l.data=e.slice(),l.updateMark=l.start,e.forEach(function(e,t){var n=p?e[p]:d?e[h]:t,r=a[n];r?(r.item===s[0]?s.shift():(s.$remove(r.item),Mo(0,r.target,l.updateMark)),f.push(r.target),u.push(r.vm),d?r.vm=e:r.vm[v]=e,r.vm[h]=t,l.updateMark=r.target):m(e,t,c)}),delete l.updateMark}});l.data=n.slice(0),n.forEach(function(e,t){m(e,t,c)})}(e,t,l,{getter:i,key:a,value:s,trackBy:c,oldStyle:o})}(e,t,n));if(f=t,!r.hasOwnProperty("shown")&&f.shown)return console.debug('[JS Framework] compile "if" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `if` directive!"):function(e,t,n,r){var o={shown:!0},i=Ao(e,n);n.element&&n.children&&n.children.push(i);r.repeat&&(o.repeat=r.repeat);a=e,s=t,c=i,l=o,u=Ro(a,c,s.shown,"shown",function(e){console.debug('[JS Framework] the "if" item was changed',e),c&&!!c.display!=!!e&&(c.display=!!e,e?Fo(a,s,c,l):To(0,c,!0))}),c.display=!!u,u&&Fo(a,s,c,l);var a,s,c,l,u}(e,t,n,r));var p=r.type||t.type;if(d=r,"function"!=typeof p||d.hasOwnProperty("type")){var d,h,v,m,y,g,_,b,w=p,k=function(e,t,n){var r;e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]);e._options&&e._options.components&&(r=e._options.components[n]);t.component&&(r=r||{});return r}(e,t,w);if(k)return console.debug("[JS Framework] compile composed component by",t),v=k,m=t,y=n,g=w,_=r,b=new(h=e).constructor(g,v,h,y,void 0,{"hook:init":function(){h._static&&(this._static=h._static),Oo(h,null,m.id,this),this._externalBinding={parent:h,template:m}},"hook:created":function(){!function(e,t,n,r){n=n||{};var o=((t=t||{})._options||{}).props;Array.isArray(o)&&(o=o.reduce(function(e,t){return e[t]=!0,e},{})),So(r,o,e,t),So(n.attr,o,e,t)}(h,this,m,_.repeat)},"hook:ready":function(){this._content&&No(h,m,this._content)}}),void ko(h,b,m,y);console.debug("[JS Framework] compile native component by",t),function(e,t,n,r){var o;(function(e){var t=e.type,n=_o[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===Lr(e[r])&&"object"===Lr(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])})(t),o="_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),a=r,e._app.doc.createBody(a)):(console.debug("[JS Framework] compile to create element for "+r),i=r,e._app.doc.createElement(i));var i;var a;if(!e._rootEl){e._rootEl=o;var s=e._externalBinding||{},c=s.template,l=s.parent;if(c&&c.events&&l&&o)for(var u in c.events){var f=l[c.events[u]];f&&o.addEvent(u,Ir(f,l))}}wo(e,o,t),t.attr&&t.attr.append&&(t.append=t.attr.append);t.append&&(o.attr=o.attr||{},o.attr.append=t.append);var p="tree"===t.append,d=e._app||{};-1===d.lastSignal||p||(console.debug("[JS Framework] compile to append single node for",o),d.lastSignal=Io(e,o,n));-1!==d.lastSignal&&No(e,t,o);-1!==d.lastSignal&&p&&(console.debug("[JS Framework] compile to append whole tree for",o),d.lastSignal=Io(e,o,n))}(e,t,n,w)}else!function(n,r,e,t,o){var i=xr({type:t.call(n)},o),a=Ao(n,e);e.element&&e.children&&e.children.push(a);$o(n,t,function(e){var t=xr({type:e},o);To(0,a,!0),Fo(n,r,a,t)}),Fo(n,r,a,i)}(e,t,n,p,r)}}function No(t,e,n){var r=t._app||{},o=e.children;o&&o.length&&o.every(function(e){return Fo(t,e,n),-1!==r.lastSignal})}function Ro(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return $o(e,n,function(e){a.latestValue=e,i&&!a.recorded&&i.append(r,s,t.blockId,function(){var e=a.latestValue;o(e),a.recorded=!1,a.latestValue=void 0}),a.recorded=!0})}function Do(e,t){if(t instanceof Do)return t;this.timestamp=Date.now(),this.detail=t,this.type=e;var n=!1;this.stop=function(){n=!0},this.hasStopped=function(){return n}}function Vo(e,t){var n=this,r=this._vmEvents[e];if(r){var o=new Do(e,t);r.forEach(function(e){e.call(n,o)})}}function Lo(e,t){var n=new Do(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function Jo(t,e){var n=new Do(t,e);this.$emit(t,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.forEach(function(e){e.$broadcast(t,n)})}function Wo(e,t){if(e&&"function"==typeof t){var n=this._vmEvents,r=n[e]||[];r.push(t),n[e]=r,"hook:ready"===e&&this._ready&&this.$emit("hook:ready")}}function qo(e,t){if(e){var n=this._vmEvents;if(t){var r=n[e];r&&r.$remove(t)}else delete n[e]}}var Bo,Uo=["init","created","ready","destroyed"];function zo(e,t,n,r,o,i){n=n||{},this._parent=n._realParent?n._realParent:n,this._app=n._app||{},n._childrenVms&&n._childrenVms.push(this),!t&&this._app.customComponentMap&&(t=this._app.customComponentMap[e]);var a,s,c,l,u=(t=t||{}).data||{};(this._options=t,this._methods=t.methods||{},this._computed=t.computed||{},this._css=t.style||{},this._ids={},this._vmEvents={},this._childrenVms=[],this._type=e,function(t,e){var n=t._options||{},r=n.events||{};for(var o in r)t.$on(o,r[o]);for(var i in e)t.$on(i,e[i]);Uo.forEach(function(e){t.$on("hook:"+e,n[e])})}(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._type+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof u?u():u,o&&xr(this._data,o),(a=this)._watchers=[],ho(a),mo(a),function(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}(a),console.debug('[JS Framework] "created" lifecycle in Vm('+this._type+")"),this.$emit("hook:created"),this._created=!0,t.methods&&t.methods.ready&&(console.warn('"exports.methods.ready" is deprecated, please use "exports.created" instead'),t.methods.ready.call(this)),this._app.doc)&&(this._parentEl=r||this._app.doc.documentElement,c=(s=this)._options||{},l=c.template||{},c.replace?l.children&&1===l.children.length?Fo(s,l.children[0],s._parentEl):Fo(s,l.children,s._parentEl):Fo(s,l,s._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+s._type+")"),s.$emit("hook:ready"),s._ready=!0)}(Bo=zo.prototype).$emit=Vo,Bo.$dispatch=Lo,Bo.$broadcast=Jo,Bo.$on=Wo,Bo.$off=qo,zo.prototype.$watch=function(e,t){$o(this,e,t)},zo.set=function e(t,n,r){if(Array.isArray(t))return t.splice(n,1,r);if(jr(t,n))t[n]=r;else if(t._isVue)e(t._data,n,r);else{var o=t.__ob__;if(o){if(o.convert(n,r),o.dep.notify(),o.vms)for(var i=o.vms.length;i--;)po(o.vms[i],n);return r}t[n]=r}},zo.delete=function(e,t){if(jr(e,t)){delete e[t];var n=e.__ob__;if(n){if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;)o=n.vms[r],Nr(i=t)||delete o[i]}else e._isVue&&delete e._data[t]}var o,i};var Ho={};function Go(n,r){var e=function(e){var t=Ho[e];t||(t={},Ho[e]=t),Array.isArray(n[e])&&n[e].forEach(function(e){"string"==typeof e&&(e={name:e}),t[e.name]&&!r||(t[e.name]=e)})};for(var t in n)e(t)}function Xo(e,t){return e.customComponentMap[t]}function Ko(e,t,n){var r=e.customComponentMap;r[t]?console.error("[JS Framework] define a component("+t+") that already exists"):r[t]=n}var Zo=n(function(e,r){var f;r=e.exports=H,"object"==typeof process&&process.env,f=function(){},r.SEMVER_SPEC_VERSION="2.0.0";var o=256,i=Number.MAX_SAFE_INTEGER||9007199254740991,c=r.re=[],t=r.src=[],n=0,a=n++;t[a]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var l=n++;t[l]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var u=n++;t[u]="("+t[a]+")\\.("+t[a]+")\\.("+t[a]+")";var p=n++;t[p]="("+t[s]+")\\.("+t[s]+")\\.("+t[s]+")";var d=n++;t[d]="(?:"+t[a]+"|"+t[l]+")";var h=n++;t[h]="(?:"+t[s]+"|"+t[l]+")";var v=n++;t[v]="(?:-("+t[d]+"(?:\\."+t[d]+")*))";var m=n++;t[m]="(?:-?("+t[h]+"(?:\\."+t[h]+")*))";var y=n++;t[y]="[0-9A-Za-z-]+";var g=n++;t[g]="(?:\\+("+t[y]+"(?:\\."+t[y]+")*))";var _=n++,b="v?"+t[u]+t[v]+"?"+t[g]+"?";t[_]="^"+b+"$";var w="[v=\\s]*"+t[p]+t[m]+"?"+t[g]+"?",k=n++;t[k]="^"+w+"$";var S=n++;t[S]="((?:<|>)?=?)";var O=n++;t[O]=t[s]+"|x|X|\\*";var C=n++;t[C]=t[a]+"|x|X|\\*";var x=n++;t[x]="[v=\\s]*("+t[C]+")(?:\\.("+t[C]+")(?:\\.("+t[C]+")(?:"+t[v]+")?"+t[g]+"?)?)?";var E=n++;t[E]="[v=\\s]*("+t[O]+")(?:\\.("+t[O]+")(?:\\.("+t[O]+")(?:"+t[m]+")?"+t[g]+"?)?)?";var $=n++;t[$]="^"+t[S]+"\\s*"+t[x]+"$";var A=n++;t[A]="^"+t[S]+"\\s*"+t[E]+"$";var j=n++;t[j]="(?:^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])";var I=n++;t[I]="(?:~>?)";var M=n++;t[M]="(\\s*)"+t[I]+"\\s+",c[M]=new RegExp(t[M],"g");var T=n++;t[T]="^"+t[I]+t[x]+"$";var P=n++;t[P]="^"+t[I]+t[E]+"$";var F=n++;t[F]="(?:\\^)";var N=n++;t[N]="(\\s*)"+t[F]+"\\s+",c[N]=new RegExp(t[N],"g");var R=n++;t[R]="^"+t[F]+t[x]+"$";var D=n++;t[D]="^"+t[F]+t[E]+"$";var V=n++;t[V]="^"+t[S]+"\\s*("+w+")$|^$";var L=n++;t[L]="^"+t[S]+"\\s*("+b+")$|^$";var J=n++;t[J]="(\\s*)"+t[S]+"\\s*("+w+"|"+t[x]+")",c[J]=new RegExp(t[J],"g");var W=n++;t[W]="^\\s*("+t[x]+")\\s+-\\s+("+t[x]+")\\s*$";var q=n++;t[q]="^\\s*("+t[E]+")\\s+-\\s+("+t[E]+")\\s*$";var B=n++;t[B]="(<|>)?=?\\s*\\*";for(var U=0;U<35;U++)f(U,t[U]),c[U]||(c[U]=new RegExp(t[U]));function z(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof H)return e;if("string"!=typeof e)return null;if(e.length>o)return null;if(!(t.loose?c[k]:c[_]).test(e))return null;try{return new H(e,t)}catch(e){return null}}function H(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof H){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>o)throw new TypeError("version is longer than "+o+" characters");if(!(this instanceof H))return new H(e,t);f("SemVer",e,t),this.options=t,this.loose=!!t.loose;var n=e.trim().match(t.loose?c[k]:c[_]);if(!n)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+n[1],this.minor=+n[2],this.patch=+n[3],this.major>i||this.major<0)throw new TypeError("Invalid major version");if(this.minor>i||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>i||this.patch<0)throw new TypeError("Invalid patch version");n[4]?this.prerelease=n[4].split(".").map(function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(0<=t&&t<i)return t}return e}):this.prerelease=[],this.build=n[5]?n[5].split("."):[],this.format()}r.parse=z,r.valid=function(e,t){var n=z(e,t);return n?n.version:null},r.clean=function(e,t){var n=z(e.trim().replace(/^[=v]+/,""),t);return n?n.version:null},(r.SemVer=H).prototype.format=function(){return this.version=this.major+"."+this.minor+"."+this.patch,this.prerelease.length&&(this.version+="-"+this.prerelease.join(".")),this.version},H.prototype.toString=function(){return this.version},H.prototype.compare=function(e){return f("SemVer.compare",this.version,this.options,e),e instanceof H||(e=new H(e,this.options)),this.compareMain(e)||this.comparePre(e)},H.prototype.compareMain=function(e){return e instanceof H||(e=new H(e,this.options)),X(this.major,e.major)||X(this.minor,e.minor)||X(this.patch,e.patch)},H.prototype.comparePre=function(e){if(e instanceof H||(e=new H(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;var t=0;do{var n=this.prerelease[t],r=e.prerelease[t];if(f("prerelease compare",t,n,r),void 0===n&&void 0===r)return 0;if(void 0===r)return 1;if(void 0===n)return-1;if(n!==r)return X(n,r)}while(++t)},H.prototype.inc=function(e,t){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t),this.inc("pre",t);break;case"prerelease":0===this.prerelease.length&&this.inc("patch",t),this.inc("pre",t);break;case"major":0===this.minor&&0===this.patch&&0!==this.prerelease.length||this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":0===this.patch&&0!==this.prerelease.length||this.minor++,this.patch=0,this.prerelease=[];break;case"patch":0===this.prerelease.length&&this.patch++,this.prerelease=[];break;case"pre":if(0===this.prerelease.length)this.prerelease=[0];else{for(var n=this.prerelease.length;0<=--n;)"number"==typeof this.prerelease[n]&&(this.prerelease[n]++,n=-2);-1===n&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},r.inc=function(e,t,n,r){"string"==typeof n&&(r=n,n=void 0);try{return new H(e,n).inc(t,r).version}catch(e){return null}},r.diff=function(e,t){{if(Q(e,t))return null;var n=z(e),r=z(t);if(n.prerelease.length||r.prerelease.length){for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return"pre"+o;return"prerelease"}for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return o}},r.compareIdentifiers=X;var G=/^[0-9]+$/;function X(e,t){var n=G.test(e),r=G.test(t);return n&&r&&(e=+e,t=+t),n&&!r?-1:r&&!n?1:e<t?-1:t<e?1:0}function K(e,t,n){return new H(e,n).compare(new H(t,n))}function Z(e,t,n){return 0<K(e,t,n)}function Y(e,t,n){return K(e,t,n)<0}function Q(e,t,n){return 0===K(e,t,n)}function ee(e,t,n){return 0!==K(e,t,n)}function te(e,t,n){return 0<=K(e,t,n)}function ne(e,t,n){return K(e,t,n)<=0}function re(e,t,n,r){var o;switch(t){case"===":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e===n;break;case"!==":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e!==n;break;case"":case"=":case"==":o=Q(e,n,r);break;case"!=":o=ee(e,n,r);break;case">":o=Z(e,n,r);break;case">=":o=te(e,n,r);break;case"<":o=Y(e,n,r);break;case"<=":o=ne(e,n,r);break;default:throw new TypeError("Invalid operator: "+t)}return o}function oe(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof oe){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof oe))return new oe(e,t);f("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ie?this.value="":this.value=this.operator+this.semver.version,f("comp",this)}r.rcompareIdentifiers=function(e,t){return X(t,e)},r.major=function(e,t){return new H(e,t).major},r.minor=function(e,t){return new H(e,t).minor},r.patch=function(e,t){return new H(e,t).patch},r.compare=K,r.compareLoose=function(e,t){return K(e,t,!0)},r.rcompare=function(e,t,n){return K(t,e,n)},r.sort=function(e,n){return e.sort(function(e,t){return r.compare(e,t,n)})},r.rsort=function(e,n){return e.sort(function(e,t){return r.rcompare(e,t,n)})},r.gt=Z,r.lt=Y,r.eq=Q,r.neq=ee,r.gte=te,r.lte=ne,r.cmp=re,r.Comparator=oe;var ie={};function ae(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof ae)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new ae(e.raw,t);if(e instanceof oe)return new ae(e.value,t);if(!(this instanceof ae))return new ae(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function se(e){return!e||"x"===e.toLowerCase()||"*"===e}function ce(e,t,n,r,o,i,a,s,c,l,u,f,p){return((t=se(n)?"":se(r)?">="+n+".0.0":se(o)?">="+n+"."+r+".0":">="+t)+" "+(s=se(c)?"":se(l)?"<"+(+c+1)+".0.0":se(u)?"<"+c+"."+(+l+1)+".0":f?"<="+c+"."+l+"."+u+"-"+f:"<="+s)).trim()}function le(e,t,n){for(var r=0;r<e.length;r++)if(!e[r].test(t))return!1;if(n||(n={}),!t.prerelease.length||n.includePrerelease)return!0;for(r=0;r<e.length;r++)if(f(e[r].semver),e[r].semver!==ie&&0<e[r].semver.prerelease.length){var o=e[r].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}function ue(e,t,n){try{t=new ae(t,n)}catch(e){return!1}return t.test(e)}function fe(e,t,n,r){var o,i,a,s,c;switch(e=new H(e,r),t=new ae(t,r),n){case">":o=Z,i=ne,a=Y,s=">",c=">=";break;case"<":o=Y,i=te,a=Z,s="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ue(e,t,r))return!1;for(var l=0;l<t.set.length;++l){var u=t.set[l],f=null,p=null;if(u.forEach(function(e){e.semver===ie&&(e=new oe(">=0.0.0")),f=f||e,p=p||e,o(e.semver,f.semver,r)?f=e:a(e.semver,p.semver,r)&&(p=e)}),f.operator===s||f.operator===c)return!1;if((!p.operator||p.operator===s)&&i(e,p.semver))return!1;if(p.operator===c&&a(e,p.semver))return!1}return!0}oe.prototype.parse=function(e){var t=this.options.loose?c[V]:c[L],n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1],"="===this.operator&&(this.operator=""),n[2]?this.semver=new H(n[2],this.options.loose):this.semver=ie},oe.prototype.toString=function(){return this.value},oe.prototype.test=function(e){return f("Comparator.test",e,this.options.loose),this.semver===ie||("string"==typeof e&&(e=new H(e,this.options)),re(e,this.operator,this.semver,this.options))},oe.prototype.intersects=function(e,t){if(!(e instanceof oe))throw new TypeError("a Comparator is required");var n;if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return n=new ae(e.value,t),ue(this.value,n,t);if(""===e.operator)return n=new ae(this.value,t),ue(e.semver,n,t);var r=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),o=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),i=this.semver.version===e.semver.version,a=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),s=re(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=re(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||o||i&&a||s||c},(r.Range=ae).prototype.format=function(){return this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim(),this.range},ae.prototype.toString=function(){return this.range},ae.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var n=t?c[q]:c[W];e=e.replace(n,ce),f("hyphen replace",e),e=e.replace(c[J],"$1$2$3"),f("comparator trim",e,c[J]),e=(e=(e=e.replace(c[M],"$1~")).replace(c[N],"$1^")).split(/\s+/).join(" ");var r=t?c[V]:c[L],o=e.split(" ").map(function(e){return t=e,n=this.options,f("comp",t,n),s=n,t=t.trim().split(/\s+/).map(function(e){return function(a,e){f("caret",a,e),e&&"object"==typeof e||(e={loose:!!e,includePrerelease:!1});var t=e.loose?c[D]:c[R];return a.replace(t,function(e,t,n,r,o){var i;return f("caret",a,e,t,n,r,o),i=se(t)?"":se(n)?">="+t+".0.0 <"+(+t+1)+".0.0":se(r)?"0"===t?">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0":">="+t+"."+n+".0 <"+(+t+1)+".0.0":o?(f("replaceCaret pr",o),"-"!==o.charAt(0)&&(o="-"+o),"0"===t?"0"===n?">="+t+"."+n+"."+r+o+" <"+t+"."+n+"."+(+r+1):">="+t+"."+n+"."+r+o+" <"+t+"."+(+n+1)+".0":">="+t+"."+n+"."+r+o+" <"+(+t+1)+".0.0"):(f("no pr"),"0"===t?"0"===n?">="+t+"."+n+"."+r+" <"+t+"."+n+"."+(+r+1):">="+t+"."+n+"."+r+" <"+t+"."+(+n+1)+".0":">="+t+"."+n+"."+r+" <"+(+t+1)+".0.0"),f("caret return",i),i})}(e,s)}).join(" "),f("caret",t),a=n,t=t.trim().split(/\s+/).map(function(e){return function(a,e){e&&"object"==typeof e||(e={loose:!!e,includePrerelease:!1});var t=e.loose?c[P]:c[T];return a.replace(t,function(e,t,n,r,o){var i;return f("tilde",a,e,t,n,r,o),i=se(t)?"":se(n)?">="+t+".0.0 <"+(+t+1)+".0.0":se(r)?">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0":o?(f("replaceTilde pr",o),"-"!==o.charAt(0)&&(o="-"+o),">="+t+"."+n+"."+r+o+" <"+t+"."+(+n+1)+".0"):">="+t+"."+n+"."+r+" <"+t+"."+(+n+1)+".0",f("tilde return",i),i})}(e,a)}).join(" "),f("tildes",t),f("replaceXRanges",o=t,i=n),t=o.split(/\s+/).map(function(e){return function(u,e){u=u.trim(),e&&"object"==typeof e||(e={loose:!!e,includePrerelease:!1});var t=e.loose?c[A]:c[$];return u.replace(t,function(e,t,n,r,o,i){f("xRange",u,e,t,n,r,o,i);var a=se(n),s=a||se(r),c=s||se(o),l=c;return"="===t&&l&&(t=""),a?e=">"===t||"<"===t?"<0.0.0":"*":t&&l?(s&&(r=0),c&&(o=0),">"===t?(t=">=",s?(n=+n+1,o=r=0):c&&(r=+r+1,o=0)):"<="===t&&(t="<",s?n=+n+1:r=+r+1),e=t+n+"."+r+"."+o):s?e=">="+n+".0.0 <"+(+n+1)+".0.0":c&&(e=">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0"),f("xRange return",e),e})}(e,i)}).join(" "),f("xrange",t),f("replaceStars",r=t,n),t=r.trim().replace(c[B],""),f("stars",t),t;var t,n,r,o,i,a,s},this).join(" ").split(/\s+/);return this.options.loose&&(o=o.filter(function(e){return!!e.match(r)})),o=o.map(function(e){return new oe(e,this.options)},this)},ae.prototype.intersects=function(n,r){if(!(n instanceof ae))throw new TypeError("a Range is required");return this.set.some(function(e){return e.every(function(t){return n.set.some(function(e){return e.every(function(e){return t.intersects(e,r)})})})})},r.toComparators=function(e,t){return new ae(e,t).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})},ae.prototype.test=function(e){if(!e)return!1;"string"==typeof e&&(e=new H(e,this.options));for(var t=0;t<this.set.length;t++)if(le(this.set[t],e,this.options))return!0;return!1},r.satisfies=ue,r.maxSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ae(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&-1!==o.compare(e)||(o=new H(r=e,n)))}),r},r.minSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ae(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&1!==o.compare(e)||(o=new H(r=e,n)))}),r},r.validRange=function(e,t){try{return new ae(e,t).range||"*"}catch(e){return null}},r.ltr=function(e,t,n){return fe(e,t,"<",n)},r.gtr=function(e,t,n){return fe(e,t,">",n)},r.outside=fe,r.prerelease=function(e,t){var n=z(e,t);return n&&n.prerelease.length?n.prerelease:null},r.intersects=function(e,t,n){return e=new ae(e,n),t=new ae(t,n),e.intersects(t)},r.coerce=function(e){if(e instanceof H)return e;if("string"!=typeof e)return null;var t=e.match(c[j]);return null!=t?z((t[1]||"0")+"."+(t[2]||"0")+"."+(t[3]||"0")):null}});Zo.SEMVER_SPEC_VERSION,Zo.re,Zo.src,Zo.parse,Zo.valid,Zo.clean,Zo.SemVer,Zo.inc,Zo.diff,Zo.compareIdentifiers,Zo.rcompareIdentifiers,Zo.major,Zo.minor,Zo.patch,Zo.compare,Zo.compareLoose,Zo.rcompare,Zo.sort,Zo.rsort,Zo.gt,Zo.lt,Zo.eq,Zo.neq,Zo.gte,Zo.lte,Zo.cmp,Zo.Comparator,Zo.Range,Zo.toComparators,Zo.satisfies,Zo.maxSatisfying,Zo.minSatisfying,Zo.validRange,Zo.ltr,Zo.gtr,Zo.outside,Zo.prerelease,Zo.intersects,Zo.coerce;function Yo(e){if(Zo.valid(e))return e;for(var t=(e="string"==typeof e?e:"").split("."),n=0,r=[];n<3;){var o="string"==typeof t[n]&&t[n]?t[n]:"0";r.push(o),n++}return r.join(".")}function Qo(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return r.errorMessage="Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n,0<=o.indexOf("osversion")?r.code=1001:0<=o.indexOf("appversion")?r.code=1002:0<=o.indexOf("weexversion")?r.code=1003:0<=o.indexOf("devicemodel")&&(r.code=1004),r}function ei(e,t,n,r){var o;if(console.debug("[JS Framework] bootstrap for "+t),Ur(t))o=Xr(t);else{if(!Gr(t))return new Error("Wrong component name: "+t);if(!Xo(e,o=Kr(t)))return new Error("It's not a component: "+t)}if("string"==typeof(n=Fr(n)?n:{}).transformerVersion&&"string"==typeof global.transformerVersion&&!Zo.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);var i=function(e,t){t=Fr(t=t||global.WXEnvironment)?t:{};var n={isDowngrade:!1};if("function"===Lr(e)){var r=e.call(this,t,{semver:Zo,normalizeVersion:Yo});n=(r=!!r)?Qo("custom","","custom params"):n}else{var o=(e=Fr(e)?e:{})[(t.platform||"unknow").toLowerCase()]||{};for(var i in t){var a=i,s=a.toLowerCase(),c=t[i],l=0<=s.indexOf("version"),u=0<=s.indexOf("devicemodel"),f=o[i];if(f&&l){var p=Yo(f),d=Yo(t[i]);if(Zo.satisfies(d,p)){n=Qo(a,c,f);break}}else if(u&&0<=("array"===Lr(f)?f:[f]).indexOf(c)){n=Qo(a,c,f);break}}}return n}(n.downgrade);if(i.isDowngrade)return e.callTasks([{module:"instanceWrap",method:"error",args:[i.errorType,i.code,i.errorMessage]}]),new Error("Downgrade["+i.code+"]: "+i.errorMessage);n.viewport&&function(e,t){if(void 0===t&&(t={}),e&&e.callTasks)e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}(e,n.viewport),e.vm=new zo(o,null,{_app:e},null,r)}var ti=function(o,e){for(var t,n,r,i=[],a=arguments.length-2;0<a--;)i[a]=arguments[a+2];if(console.debug("[JS Framework] define a component "+e),"function"==typeof(r=1<i.length?i[1]:i[0])&&(n=r,r=null),n){var s={exports:{}};n(function(e){if(Ur(e)){var t=Xr(e);return Xo(o,t)}if(zr(e)){var n=Xr(e);return o.requireModule(n)}if(Hr(e)||Gr(e)){var r=Kr(e);return o.commonModules[r]}},s.exports,s),r=s.exports}if(Ur(e)){var c=Xr(e);Ko(o,c,r)}else if(zr(e)){Go(((t={})[Xr(e)]=r,t))}else if(Hr(e)){var l=Kr(e);o.commonModules[l]=r}else if(Gr(e)){var u=Kr(e);r.template||r.style||r.methods?Ko(o,u,r):o.commonModules[u]=r}};function ni(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&function e(t){delete t._app;delete t._computed;delete t._css;delete t._data;delete t._ids;delete t._methods;delete t._options;delete t._parent;delete t._parentEl;delete t._rootEl;if(t._watchers){for(var n=t._watchers.length;n--;)t._watchers[n].teardown();delete t._watchers}if(t._childrenVms){for(var r=t._childrenVms.length;r--;)e(t._childrenVms[r]);delete t._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+t._type+")");t.$emit("hook:destroyed");delete t._type;delete t._vmEvents}(e.vm),e.id="",e.options=null,e.blocks=null,e.vm=null,e.doc.taskCenter.destroyCallback(),e.doc.destroy(),e.doc=null,e.customComponentMap=null,e.commonModules=null}function ri(e){e.differ.flush()}function oi(r,e,o,t){var i;console.debug("[JS Framework] Intialize an instance with:\n",o);var n,a=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return ti.apply(void 0,[r].concat(e))},s=function(e,t,n){i=ei(r,e,t,n||o),ri(r),r.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+r.id+")")},c=zo,l=r.doc,u=function(e){return r.requireModule(Xr(e))},f={config:r.options,define:a,bootstrap:s,requireModule:u,document:l,Vm:c};Object.freeze(f),"function"==typeof e?n=e.toString().substr(12):e&&(n=e.toString()),n='(function(global){\n\n"use strict";\n\n '+n+" \n\n})(Object.create(this))";var p=global.WXEnvironment,d={};if(p&&"Web"!==p.platform){var h=r.requireModule("timer");Object.assign(d,{setTimeout:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return h.setTimeout(function(){e[0].apply(e,e.slice(2))},e[1]),r.doc.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return h.setInterval(function(){e[0].apply(e,e.slice(2))},e[1]),r.doc.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){h.clearTimeout(e)},clearInterval:function(e){h.clearInterval(e)}})}var v=Object.assign({define:a,require:function(t){return function(e){i=ei(r,t,{},e)}},bootstrap:s,register:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return function(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),Ko(e,t,n)}.apply(void 0,[r].concat(e))},render:function(e,t){i=ei(r,e,{},t)},__weex_define__:a,__weex_bootstrap__:s,__weex_document__:l,__weex_require__:u,__weex_viewmodel__:c,weex:f},d,t);return function(e,t){if("function"!=typeof compileAndRunBundle)return!1;var n=void 0,r=!1,o="(function (",i=[],a=[];for(var s in e)i.push(s),a.push(e[s]);for(var c=0;c<i.length-1;++c)o+=i[c],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var l=e.weex||{},u=l.config||{};(n=compileAndRunBundle(o,u.bundleUrl,u.bundleDigest,u.codeCachePath))&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}(v,n)||function(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}(v,n),i}var ii=function(e){this.id=e,this.map=[],this.hooks=[]};function ai(e,t){var n=e[t];for(var r in n)n[r]()}function si(e,t){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},this.doc=new go.Document(e,this.options.bundleUrl,null,go.Listener),this.differ=new ii(e)}ii.prototype.isEmpty=function(){return 0===this.map.length},ii.prototype.append=function(e,t,n,r){var o=this;void 0===t&&(t=0),this.hasTimer||(this.hasTimer=!0,setTimeout(function(){o.hasTimer=!1,o.flush(!0)},0));var i=this.map;i[t]||(i[t]={});var a=i[t];a[e]||(a[e]={}),"element"===e?(a[e][n]||(a[e][n]=[]),a[e][n].push(r)):a[e][n]=r},ii.prototype.flush=function(e){var t=this.map.slice();this.map.length=0,t.forEach(function(e){ai(e,"repeat"),ai(e,"shown"),function(e,t){var n=e[t];for(var r in n){var o=n[r];o.forEach(function(e){e()})}}(e,"element")});var n=this.hooks.slice();this.hooks.length=0,n.forEach(function(e){e()}),this.isEmpty()||this.flush()},ii.prototype.then=function(e){this.hooks.push(e)},si.prototype.requireModule=function(e){return function(r,o){var e=Ho[o],t={},n=function(n){Object.defineProperty(t,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return r.callTasks({module:o,method:n,args:e})}},set:function(e){if("function"==typeof e)return r.callTasks({module:o,method:n,args:[e]})}})};for(var i in e)n(i);return t}(this,e)},si.prototype.updateActions=function(){return ri(this)},si.prototype.callTasks=function(e){return t=this,"array"!==Lr(n=e)&&(n=[n]),n.forEach(function(e){r=t.doc.taskCenter.send("module",{module:e.module,method:e.method},e.args)}),r;var t,n,r},Object.freeze(si),Object.freeze(si.prototype);var ci={};var li=go.nativeComponentMap;function ui(e){"object"==typeof e&&function(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}(zo,e)}global.registerMethods=ui;var fi={fireEvent:function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return function t(n,e,r,o,i){if(console.debug('[JS Framework] Fire a "'+r+'" event on an element('+e+") in instance("+n.id+")"),!Array.isArray(e)){var a=n.doc.getRef(e);if(a){var s=n.doc.fireEvent(a,r,o,i);return n.differ.flush(),n.doc.taskCenter.send("dom",{action:"updateFinish"},[]),s}return new Error('invalid element reference "'+e+'"')}e.some(function(e){return!1!==t(n,e,r,o)})}.apply(void 0,[ci[e]].concat(t))},callback:function(e){for(var t=[],n=arguments.length-1;0<n--;)t[n]=arguments[n+1];return function(e,t,n,r){console.debug("[JS Framework] Invoke a callback("+t+") with",n,"in instance("+e.id+")");var o=e.doc.taskCenter.callback(t,n,r);return ri(e),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),o}.apply(void 0,[ci[e]].concat(t))}};ui(Cr),Object.freeze(zo);var pi=Object.freeze({registerComponents:function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?li[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(li[e.type]=e))})},registerModules:function(e){"object"==typeof e&&Go(e)},registerMethods:ui,createInstance:function(e,t,n,r,o){var i=(o||{}).services;eo();var a,s=ci[e];return n=n||{},(a=s?new Error('invalid instance id "'+e+'"'):(s=new si(e,n),oi(ci[e]=s,t,r,i)))instanceof Error?a:s},init:function(e){go.Document=e.Document,go.Element=e.Element,go.Comment=e.Comment,go.sendTasks=e.sendTasks,go.Listener=e.Listener},refreshInstance:function(e,t){var n=ci[e];return n?function(e,t){console.debug("[JS Framework] Refresh with",t,"in instance["+e.id+"]");var n=e.vm;return n&&t?("function"==typeof n.refreshData?n.refreshData(t):xr(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}(n,t):new Error('invalid instance id "'+e+'"')},destroyInstance:function(e){"function"==typeof markupState&&markupState(),eo();var t=ci[e];if(!t)return new Error('invalid instance id "'+e+'"');ni(t),delete ci[e];var n=Math.round(e);return 0<n&&(n%18||"function"!=typeof notifyTrimMemory||notifyTrimMemory()),ci},receiveTasks:function(r,e){if(ci[r]&&Array.isArray(e)){var o=[];return e.forEach(function(e){var t=fi[e.method],n=[].concat(e.args);"function"==typeof t&&(n.unshift(r),o.push(t.apply(void 0,n)))}),o}return new Error('invalid instance id "'+r+'" or tasks')},getRoot:function(e){var t,n=ci[e];return n?(t=(n.doc||{}).body||{}).toJSON?t.toJSON():{}:new Error('invalid instance id "'+e+'"')}}),di={Vanilla:yr,Vue:Or,Rax:e(n(function(e){e.exports=function(n){var r={};function o(e){if(r[e])return r[e].exports;var t=r[e]={i:e,l:!1,exports:{}};return n[e].call(t.exports,t,t.exports,o),t.l=!0,t.exports}return o.m=n,o.c=r,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},o.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=0)}([function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.getInstance=r,t.init=function(e){c=e.Document,e.Element,e.Comment},t.createInstanceContext=function(e,t,n){var r=l[e],o=t.weex;{if(null!=r)throw new Error('Instance id "'+e+'" existed when create instance');var i=o.config.bundleUrl;i?i.split("//")[0]||(i="https:"+i):(console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".'),i="about:blank");var a=new c(e,i);r=l[e]={document:a,instanceId:e,bundleUrl:i,__weex_data__:n,uid:0};var s={instanceId:e,bundleUrl:i,document:a,__weex_document__:a,__weex_options__:t,__weex_data__:n||{},callNative:function(){},__weex_config__:t};return s}},t.refreshInstance=function(e,t){var n=r(e).document;n.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:t}),n.taskCenter.send("dom",{action:"refreshFinish"},[])},t.destroyInstance=function(e){var t=r(e),n=(t.bundleCode,t.document);n.documentElement.fireEvent("destory",{timestamp:Date.now()}),n.destroy&&n.destroy();n.taskCenter&&n.taskCenter.destroyCallback&&n.taskCenter.destroyCallback();delete l[e]};var c=void 0,l={};function r(e){var t=l[e];if(!t)throw new Error('Invalid instance id "'+e+'"');return t}t.default=t}])})),Weex:pi};var hi,vi,mi,yi,gi=Object.freeze({$userTrack:function(e,t,n,r){console.error("[Upgrade Warning] $userTrack will be removed in the next version!"),console.error("[JS Framework] Vm#$userTrack is deprecated, please use \"require('@weex-module/userTrack').commit(type, name, comName, param)\" instead"),this._app.requireModule("userTrack").commit(e,t,n,r)},$sendMtop:function(e,t){console.error("[Upgrade Warning] $sendMtop will be removed in the next version!"),console.error("[JS Framework] Vm#$sendMtop is deprecated, please use \"require('@weex-module/stream').sendMtop(params, callback)\" instead"),"undefined"==typeof window?this._app.requireModule("windvane").call({class:"MtopWVPlugin",method:"send",data:e},t):this._app.requireModule("stream").sendMtop(e,t)},$callWindvane:function(e,t){console.error("[Upgrade Warning] $callWindvane will be removed in the next version!"),console.error("[JS Framework] Vm#$callWindvane is deprecated, please use \"require('@weex-module/windvane').call(params, callback)\" instead"),this._app.requireModule("windvane").call(e,t)},$setSpm:function(e,t){console.error("[Upgrade Warning] $setSpm will be removed in the next version!"),console.error("[JS Framework] Vm#$setSpm is deprecated, please use \"require('@weex-module/pageInfo').setSpm(a, b)\" instead"),this._app.requireModule("pageInfo").setSpm(e,t)},$getUserInfo:function(e){console.error("[Upgrade Warning] $getUserInfo will be removed in the next version!"),console.error("[JS Framework] Vm#$getUserInfo is deprecated, please use \"require('@weex-module/user').getUserInfo(callback)\" instead"),this._app.requireModule("user").getUserInfo(e)},$login:function(e){console.error("[Upgrade Warning] $login will be removed in the next version!"),console.error("[JS Framework] Vm#$login is deprecated, please use \"require('@weex-module/user').login(callback)\" instead"),this._app.requireModule("user").login(e)},$logout:function(e){console.error("[Upgrade Warning] $logout will be removed in the next version!"),console.error("[JS Framework] Vm#$logout is deprecated, please use \"require('@weex-module/user').logout(callback)\" instead"),this._app.requireModule("user").logout(e)}}),_i=n(function(e,t){console.log("Start windmill weex-vue-plugin (0.3.2) framework. Build at 2018-09-18 13:06"),e.exports=function(){"function"!=typeof Object.assign&&Object.defineProperty(Object,"assign",{writable:!0,enumerable:!1,configurable:!0,value:function(e,t){var n=arguments;if(null==e)throw new TypeError("Cannot convert undefined or null to object");for(var r=Object(e),o=1;o<arguments.length;o++){var i=n[o];if(null!=i)for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(r[a]=i[a])}return r}});var t,i=(t=1e5,function(){var e=String(t);return t+=1,e});function s(t,n,e){void 0===e&&(e=!0);var r=void 0!==global?global:"undefined"!=typeof self?self:new Function("return this")();try{Object.defineProperty(r,t,{value:n,configurable:!0,enumerable:!0,writable:!e})}catch(e){r[t]=n}}function c(e){return Object.prototype.toString.call(e).slice(8,-1)}function l(e){return"Object"===c(e)}function o(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n]}function f(o,i){var a;return void 0===i&&(i=0),"function"!=typeof setTimeout||"function"!=typeof clearTimeout?(console.warn("[Warn] There is no timer API in the current context."),o):function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=this;clearTimeout(a),a=setTimeout(function(){return o.apply(r,t)},i)}}var n=function(){},u={},a=["Android","iOS"];function r(e,t){return"object"==typeof process&&process&&process.env&&"test"===process.env.PURPOSE?"function"==typeof __test_logger__&&(n=__test_logger__,!0):(u.debugMode,!0)}function p(e,t){r()&&n("log",e)}function d(e,t){r()&&n("debug",e)}function h(e,t){r()&&n("warn",e)}function v(e,t){r()&&n("error",e)}function m(e){if(v(e),"test"!==process.env.PURPOSE)throw new Error(e)}n=function(e,t){var n,r="["+((n=e).charAt(0).toUpperCase()+n.slice(1))+"][wml-r] "+t;return u.isWeex&&-1<a.indexOf(u.platform)?console.log(r):console.error(r)};var y={network:["request","uploadFile"],miniApp:["setAppShareInfo","hideLauncherLoading","setWebViewTop","setWebViewBackgroundImage"],mtop:["request"],storage:["length","setItem","getItem","removeItem"],memoryStorage:["setItem","getItem"],tabBar:["show","hide"],navigator:["push","pop","openMessagePage","reloadPage","getBackStack","popToHome","navigateTo","redirectTo","switchTab"],user:["login","logout","info"],modal:["alert","confirm","toast","showLoading","hideLoading"],navigatorBar:["show","hide","setTitle","setRightItem","setStyle","setDrawer","setActionSheet","hasIndexBadge","scaleIndexBadge","resetIndexBadge","getHeight","openDrawer","isDrawerOpened","closeDrawer","setLeftItem","showMenu","hideMenu","getStatusBarHeight","setNavigationBar"],clipboard:["writeText","readText"],picker:["pick","pickDate","pickTime","chooseCity"],webSocket:["webSocket","send","close","onOpen","onMessage","onClose","onError"],calendar:["addEvent","checkEvent","removeEvent"],connection:["getType","getDownlinkMax","onChange"],screen:["setAlwaysOn","setBrightness","getScreenBrightness"],broadcast:["createChannel","postMessage","onMessage","close"],share:["doShare"],cookie:["read","write","getAllObjects"],audio:["load","play","pause","stop","setVolume","canPlayType"],wopc:["authLogin","checkAuthSession","doAuth","getSessionKey","setSessionKey"],WopcMtopPlugin:["request"],device:["onShake","vibrate"],keyboard:["hideKeyboard"],contact:["choosePhoneContact"],location:["getLocation"],alipay:["tradePay"],userTrack:["commit","commitut","commitEvent","customAdvance","pageAppear","pageDisappear","skipPage","updatePageUtparam","updateNextPageUtparam"],"nuvajs-exec":["exec"],aluWVJSBridge:["userIsLogin","refreshAlipayCookie"],TBDeviceInfo:["getUtdid"],actionSheet:["showActionSheet"],image:["chooseImage","previewImage","compressImage","getImageInfo","saveImage"],media:["startVoice","stopVoice"],audioRecord:["startRecord","stopRecord","cancelRecord"],audioPlayer:["playVoice","pauseVoice","stopVoice"],file:["saveFile","getFileInfo","getFileList","removeFile"],video:["chooseVideo","getVideoInfo"],phone:["makePhoneCall"],compass:["startCompass","stopCompass","onCompassChange"],tbsecurity:["secureToken"]};function g(o,e){var i=e||function(){for(var e,t=arguments,n=[],r=arguments.length;r--;)n[r]=t[r];return(e=o()).$call.apply(e,n)};return function(o){if(!o)return d("Require a universal module proxy."),{call:i};var e=y[o];if(Array.isArray(e)){d('Require the "'+o+'" module.');var t={};return e.forEach(function(r){t[r]=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return i.apply(void 0,[o+"."+r].concat(t))}}),t}h('Require unknown module "'+o+"\".It may not exist or haven't been registered.")}}var _="[[WorkerPageReady]]",b="[[RendererPageReady]]",w="[[SendInitialState]]",k="[[ReceivedInitialState]]",S="[[WorkerPageStateChange]]",O="[[RendererPageStateChange]]",C="__WINDMILL_MODULE_GETTER__",e=function(){};e.prototype.$on=function(e,t){return void 0===t&&(t=o),d('$on "'+e+'"'),!e&&m("invalid event name "+e+" for windmill.$on."),t===o&&m("bind event "+e+" with no callback through windmill.$on."),this.bridge.onReceiveMessage({data:{type:e},origin:this.label,type:"Event"},t)},e.prototype.$once=function(e,t){return void 0===t&&(t=o),d('$once "'+e+'"'),!e&&m("invalid event name "+e+" for windmill.$once."),t===o&&m("bind event "+e+" with no callback through windmill.$once."),this.bridge.onReceiveMessage({data:{type:e,once:!0},origin:this.label,type:"Event"},t)},e.prototype.$off=function(e,t){return d('$off "'+e+'"'),!e&&m("invalid event name "+e+" for windmill.$off."),this.bridge.unbindEventListener("Event."+e,t)},e.prototype.$cycle=function(e,t){return void 0===t&&(t=o),d('$cycle "'+e+'"'),e&&/^app:|^page(:|@)/.test(e)||m("invalid lifecycle name "+e+" for windmill.$cycle."),t===o&&m("hook lifecycle "+e+" with no callback function through windmill.$cycle."),"AppWorker"!==this.label&&/^app:/.test(e)&&m("Shouldn't bind lifecycle hook for app in a page client."),this.bridge.onReceiveMessage({type:"Lifecycle",origin:this.label,data:{type:e}},t)},e.prototype.$decycle=function(e,t){return d('$decycle "'+e+'"'),e&&/^app:|^page(:|@)/.test(e)||m("invalid lifecycle name "+e+" for windmill.$decycle."),this.bridge.unbindEventListener("Lifecycle."+e,t)},e.prototype.$emit=function(e,t,n){return void 0===t&&(t={}),d('$emit("'+e+'")'),!e&&m("invalid event name "+e+" for windmill.$emit."),n&&n!==this.label?this.bridge.postMessage({data:{type:e,data:t},origin:this.label,target:n,type:"Event"}):this.bridge.emitEvent(""+e,t)},e.prototype.$callAsync=function(n,r){var o=this;return void 0===r&&(r={}),d('$callAsync "'+n+'"'),n||m("invalid method name "+n+" for windmill.$callAsync."),new Promise(function(e,t){o.bridge.dispatchMessage({type:"ModuleCall",origin:o.label,target:"AppWorker",data:{method:n,params:r}},e,t,!1)})},e.prototype.$call=function(e,t,n,r){return void 0===t&&(t={}),void 0===n&&(n=o),void 0===r&&(r=o),d('$call "'+e+'", params: '+JSON.stringify(t)),e||m("invalid method name "+e+" for windmill.$call."),this.bridge.dispatchMessage({type:"ModuleCall",origin:this.label,target:"AppWorker",data:{method:e,params:t}},n,r,!0)},e.prototype.$registerModules=function(e){!function(r,o){if(void 0===o&&(o=!1),!l(r))return v("Invalid parameter type! The module definition is not a plain object.");var e=function(t){var e=r[t];y[t]?o||h('The "'+t+'" module has already been registered.It would be overridden.'):y[t]=[];var n=y[t];Array.isArray(e)?e.forEach(function(e){-1===n.indexOf(e)?n.push(e):o||h('The "'+e+'" of the "'+t+'" module has already been registered.')}):v('Invalid parameter type! The method list of the "'+t+'" module should be an Array.')};for(var t in r)e(t)}(e,!0)},e.prototype.$getAvailableModules=function(){return function(e){var t={};try{t=JSON.parse(JSON.stringify(e))}catch(e){}return t}(y)};var x="[[EVENT_MAP]]";function E(e,t){var n=e[x];return Array.isArray(n[t])||(n[t]=[]),n[t]}var $,A=function(){d("Create new EventEmitter."),Object.defineProperty(this,x,{configurable:!1,enumerable:!1,writable:!1,value:{}})};function j(t){var n;try{n=JSON.stringify(t)}catch(e){n=t}m("failed to postMessage: "+n)}function I(e,t,n,r,o,i){var a=t+"."+n;return e.WindVane?e.WindVane.call(t,n,r,o,i):m("should have WindVane in global context"+(a?" to call "+a:"")+".")}A.prototype.on=function(e,t){d('EventEmitter: on("'+e+'")');var n=E(this,e);return n.push({listener:t,once:!1,callCount:0}),this},A.prototype.once=function(e,t){d('EventEmitter: once("'+e+'")');var n=E(this,e);return n.push({listener:t,once:!0,callCount:0}),this},A.prototype.off=function(e,t){d('EventEmitter: off("'+e+'"'+(t?", listener":"")+")");var n=this[x];if(t){var r=n[e];if(Array.isArray(r)){var o=r.findIndex(function(e){return e.listener===t});-1!==o&&r.splice(o,1)}}else delete n[e];return this};var M=!(A.prototype.emit=function(t){for(var e=arguments,n=[],r=arguments.length-1;0<r--;)n[r]=e[r+1];d('EventEmitter: emit("'+t+'", '+JSON.stringify(n)+")");var o=this[x],i=o[t];return Array.isArray(i)&&(o[t]=i.filter(function(e){try{e.listener.apply(null,n),e.callCount+=1}catch(e){return v('Failed to emit "'+t+'" event.'),v(e.toString()),!0}return!e.once})),this}),T=function(){this._messages=[]};T.prototype.postMessage=function(e){d("cache message in lazyMsgModule. "+JSON.stringify(e)),this._messages.push(e)},T.prototype.replaceWith=function(e){P=!1,this._messageModule=e,this._flush()},T.prototype._flush=function(){var t=this;this._messages.forEach(function(e){return t._messageModule.postMessage(e)})};var P,F,N=new T;function R(e,t){var n,r=e?(n=e).requireModule("@weex/windmill")||n.requireModule("windmill"):function(){if(!$){var t="undefined"!=typeof window?window:global;$={postMessage:function(e){return I(t,"Windmill","postMessage",e,function(){},j)},onmessage:function(e){if(console.debug("Set onMessage for webview."),!M)return M=!0,I(t,"Windmill","onMessage",{},e,j)}}}return $}();if(!r)return m("can't find message module ("+(e?"windmill module":"message module in webview")+")."),P=!0,N;if("function"==typeof t){d('Set the "onmessage" method to the bridge through callback.');try{r.onmessage(t)}catch(e){v('Failed to set the "onmessage" method to the bridge through callback.'),v(e.toString())}}return P&&N.replaceWith(r),r}function D(e){var t=e.match(/([^@]+)(@\S+)/);return t&&t[1]||e}var V=function(e,t){var a=this;void 0===t&&(t={}),d("Create a new RendererBridge."),F=t.isWeex,this._emitter=new A,d("Register onmessage api for "+(F?"Weex windmill module":"webview")+"."),F&&(this._weex=e),this._onMessage=function(e){if(d("Receive message from the worker. (message: "+JSON.stringify(e)+")"),!l(e)&&(v("The parameter of onmessage should be a plain object! Not "+c(e)),"string"==typeof e))try{e=JSON.parse(e)}catch(e){return void v("Failed to parse the message string. "+e.toString())}var t=e.type,n=e.data;void 0===n&&(n={});var r=e.origin,o=e.callbackId;switch(t){case"Callback":a._emitter.emit("callback@AppWorker:"+o,n);break;case"Event":var i=D(n.type);a._emitter.emit(t+"."+i,Object.assign({origin:r},n,{type:i}));break;case"Lifecycle":a._emitter.emit(t+"."+n.lifecycle,n.options);break;case"SetData":a._emitter.emit("Event.setdata",n);break;default:m('Unknown message type received from worker: "'+t+'"')}},R(e,this._onMessage)};V.prototype.dispatchMessage=function(t,n,r,e){d("Dispatch message to worker. (message: "+JSON.stringify(t)+")"),t.callbackId=this._genCallbackId(function(e){return e.status&&"SUCCESS"===e.status?n(e):(e.status,v("call API "+t.data.method+" from renderer failed: "+e.status+", "+e.error),r(e))},{keepAlive:e});try{t.keepAlive=!0,this.postMessage(t)}catch(e){r(e)}},V.prototype.postMessage=function(e){try{d("Call postMessage to worker. (message: "+JSON.stringify(e)+")"),R(this._weex,this._onMessage).postMessage(e)}catch(e){m(e.message||e.toString()||"postMessage failed.")}},V.prototype._genCallbackId=function(e,t){var n=t.keepAlive,r=t.callbackId,o=r||i();return this._emitter[n?"on":"once"]("callback@AppWorker:"+o,e),o},V.prototype.onReceiveMessage=function(e,t){var n=e.type,r=e.data;void 0===r&&(r={});var o=r.type;"Event"===n&&(o=D(o),r.type=o);var i=r.once?"once":"on";this._emitter[i](n+"."+o,t)},V.prototype.unbindEventListener=function(e,t){this._emitter.off(D(e),t)},V.prototype.emitEvent=function(e,t){void 0===t&&(t={});var n=D(e);this._emitter.emit("Event."+n,{type:n,data:t})};var L=function(n){function e(e,t){n.call(this),e&&l(e.config)&&(this._name=e.config.pageName||"",this.label=e.config.clientId||"",e.config.availableModules?(this.$registerModules(e.config.availableModules),this._gotAvailableModulesFromWeex=!0):h("No available modules in weex options.")),d("Create a new RendererRuntime. ("+this.label+", "+this._name+")"),this.bridge=new V(e,t),this._init()}return n&&(e.__proto__=n),((e.prototype=Object.create(n&&n.prototype)).constructor=e).prototype._init=function(){var t=this;this.bridge.onReceiveMessage({origin:"AppWorker",target:this.label,type:"Event",data:{type:"registerModules"}},function(e){e&&"registerModules"===e.type&&(d("Register available modules in renderer. ("+Object.keys(e.data)+")"),t.$registerModules(e.data))})},e.prototype.ready=function(){this.bridge.dispatchMessage({origin:this.label,target:"AppWorker",type:"Event",data:{type:"[[RendererRuntimeReady]]",data:{label:this.label,handshake:!this._gotAvailableModulesFromWeex}}},o,o)},e}(e),J=["$on","$once","$off","$emit","$cycle","$decycle","$call","$callAsync","$navTo","$getAvailableModules"];function W(e,t){var n=!(!e||!e.requireModule);!function(e){if(!e||!e.platform)return console.error("set logger environment failed.");Object.assign(u,e)}({platform:n&&e.config.env.platform,debugMode:n&&e.config.env.debugMode,isWeex:n}),d("Setup Windmill renderer framework."),e&&!e.requireModule&&(t=e,e=void 0),t||(t={}),d("Instantiate renderer in "+(((t=Object.assign({},t)).isWeex=n)?"Weex container":"WindVane container")+".");var o,i,r=new L(e,t),a=(o=r,i={},J.forEach(function(r){"function"==typeof o[r]&&(i[r]=function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];return o[r].apply(o,t)})}),i);return d("Prepare runtime APIs: "+JSON.stringify(J)),t.exposeModuleGetter&&s(C,g(function(){return a})),r.ready(),a}var q=/^@(windmill|weex)\/([\w_-]+)/;function B(i,e,t){if(!i.config||"windmill"!==i.config.container)return i;if("function"!=typeof i.requireModule)return i;var a=i.requireModule,s=t||g(function(){return e});return i.requireModule=function(e){var t="weex",n=e,r=q.exec(e);switch(r?(t=r[1],n=r[2]):"string"==typeof i.config.container&&(t=i.config.container),t){case"weex":return a.call(i,n);case"windmill":var o=s(n);return!o&&i.isRegisteredModule(n)?(h('Trying to call weex module "'+n+'" in windmill context!This is NOT a good practice, please use windmill module instead!'),a.call(i,n)):o;default:v('Failed to require scoped module "'+n+'", the "'+t+'" scope is unknown.')}},i}function U(s,c,e){var l={},n=e&&e.normalizeEventName||function(e){return e},r=!(!e||!e.noTriggerWorker);function o(e,t,n,r){void 0===r&&(r=!1);var o=c.getId();l[o]||(l[o]={});var i=l[o];if(i[e]||(i[e]=[]),i[e].push({handler:t,wrap:n}),r)return s.$once(e,n);s.$on(e,n)}var i={on:function(e,t){o(n(e),t,function(e){t.call(c.getVm(),e.data)})},once:function(e,t){o(n(e),t,function(e){t.call(c.getVm(),e.data)},!0)},off:function(e,t){!function(e,n){var t=c.getId(),r=l[t];if(!r)return h("Unbind event from page "+t+" with no event handlers.");var o,i,a=r[e];a?n?(a.forEach(function(e,t){e.handler===n&&(o=e,i=t)}),o&&o.wrap&&(a.splice(i,1),s.$off(e,o.wrap))):((l[t]||(l[t]={}))[e]=[],s.$off(e)):h("Unbind event '"+e+"' which has no event handler.")}(n(e),t)},emit:function(e,t){s.$emit(n(e),t),r&&s.$emit(e+"@"+c.getId(),t,"AppWorker")},call:"default"},a=function(){};return["on","off","emit","once","call"].reduce(function(e,t){var o,n="$"+t,r=i[t];return e[n]="function"==typeof r?r:"default"===r?(o=n,function(){for(var e=arguments,t=[],n=arguments.length;n--;)t[n]=e[n];var r=s[o];return r.apply(void 0,t)}):a,e},{})}var z="AppWorker";function H(e){switch(c(e)){case"Object":for(var t in e)H(e[t]);break;case"Array":e.forEach(H)}}return function(e){var a=e.createInstanceContext,t=Object.assign({},e);return t.createInstanceContext=function(e,t,n){var r=t&&t.weex;if(!r||"windmill"!==r.config.container)return a(e,t,n);var l,u,o=Object.assign({},a(e,t,n)),i=W(r);return o.weex=B(r,i),o.requireModule=function(e){return r.requireModule(e)},o.__vue_page__=(l=o,u=i,function(){function e(e,t){var n=this,r=t||l,o=r.Vue,i=r.weex,a=i.config,s=a.clientId,c=a.pageName;if(p("Create Page with id "+s+", pageName "+c+"."),this._id=i.config.clientId||null,this._name=i.config.pageName||null,this._vm=null,this._instanceContext=t||l,this._Vue=o,this._weex=i,this._windmill=u,this._hold=!1,this._options=e,this._state="function"==typeof e.data?e.data():e.data,e.data=function(){return n._state},o.prototype.$page=U(this._windmill,this),d("bind with $page: "+Object.keys(o.prototype.$page)),e._noLazy){p("Init vm instantly in Page constructor with no lazy.");try{this._initVm()}catch(e){v("[windmill-vue-renderer] init vm instantly failed: "+(e&&e.message))}}this._shakeHandsBeforeInit(),this._windmill.$once(w,this._onStateInit.bind(this))}return e.prototype.getVm=function(){return this._vm},e.prototype.getId=function(){return this._id},e.prototype._initVm=function(){var n=this,e=this._vm=new this._Vue(this._options),t=e.$options.data,r=0;e.$watch(function(){for(var e in t)H(t[e]);return r=(r+1)%2},function(e,t){n._hold?n._hold=!1:n._debouncedWatcherCb(e,t)},{sync:!0})},e.prototype._shakeHandsBeforeInit=function(){d("start handshaking with worker."),this._sendPageReady(),this._windmill.$once(_,this._onWorkerReady.bind(this))},e.prototype._sendPageReady=function(){d("Send "+b+" to worker."),this._windmill.$emit(b+"@"+this._id,{},z)},e.prototype._onWorkerReady=function(t){var n;try{n=JSON.stringify(t)}catch(e){n=t+""}d(_+" event received: "+n+".");var e=t.data,r=e.clientId,o=e.pageName;r&&(this._id=r),o&&(this._name=o),this._sendPageReady()},e.prototype._onStateInit=function(t){var n,r=this;try{n=JSON.stringify(t)}catch(e){n=t+""}d(w+" event received: "+n),this._windmill.$off(_),this._windmill.$on(S,this._onDataSync.bind(this));var e=t.data,o=t.origin,i=e.clientId,a=e.pageName,s=i||o;s&&(this._id=s),a&&(this._name=a),this._state=Object.assign(this._state||{},e.initialState||{}),this._windmill.$emit(k+"@"+this._id,{},z);var c=this._vm;if(d("debounce watcher callback for page data watcher binding."),this._debouncedWatcherCb=f(function(e,t){d("emit "+O+" event."),r._windmill.$emit(O+"@"+r._id,r._vm&&r._vm.$options.data,z)},1e3/60),c)this._mergeData(e);else try{p("Init vm after "+w+"."),this._initVm()}catch(e){v("[windmill-vue-renderer] "+(e&&e.message))}},e.prototype._onDataSync=function(t){var n;try{n=JSON.stringify(t)}catch(e){n=t+""}d(S+" event received: "+n);var e=t.data;this._mergeData(e,!0)},e.prototype._mergeData=function(e,t){void 0===t&&(t=!1);var n=this._vm,r=n.$options.data;for(var o in e)t&&(this._hold=!0),n.$set(r,o,e[o])},e}()),Object.freeze(o),o},t}}()});di.Vue=_i(di.Vue),function(e){var t=lr.init,n=lr.config;n.frameworks=e;var r=fn.native,o=fn.transformer;for(var i in hr)lr.service.register(i,hr[i]);lr.freezePrototype(),global.frameworkVersion=r,global.transformerVersion=o;var a=t(n),s=function(r){global[r]=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var n=a[r].apply(a,e);return n instanceof Error&&console.error(n.toString()),n}};for(var c in a)s(c)}(di),Object.freeze(Object),Object.freeze(Array),un(hi=Object.prototype,"__defineGetter__",vi="Object.prototype"),un(hi,"__defineSetter__",vi),un(hi,"__lookupGetter__",vi),un(hi,"__lookupSetter__",vi),un(hi,"constructor",vi),un(hi,"hasOwnProperty",vi),un(hi,"isPrototypeOf",vi),un(hi,"propertyIsEnumerable",vi),un(hi,"toLocaleString",vi),un(hi,"toString",vi),un(hi,"valueOf",vi),Object.seal(hi),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),un(mi=Error.prototype,"name",yi="Error.prototype"),un(mi,"message",yi),un(mi,"toString",yi),un(mi,"constructor",yi),Object.seal(mi),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype),global.registerMethods(gi)});
//# sourceMappingURL=weex-js-framework.min.js.map
