(this.nativeLog||function(e){console.log(e)})("START WEEX HTML5: 0.5.0, Build 2017-08-14 14:07."),this.getJSFMVersion=function(){return"0.21.9"};var global=this,process={env:{}},setTimeout=global.setTimeout;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Weex=t()}(this,function(){"use strict";function e(e,t){if("undefined"==typeof document)return t;e=e||"";var n=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");return r.type="text/css",n.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e)),t}function t(e){return e&&e.__esModule?e.default:e}function n(e,t){return t={exports:{}},e(t,t.exports),t.exports}function r(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=Ql(t),this.reject=Ql(n)}function o(){Tc.forEach(function(e){var t=Tc.indexOf(e);Lc[e]={},Tc.forEach(function(n){Tc.indexOf(n)<=t&&(Lc[e][n]=!0)})})}function i(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return Lc[t]&&Lc[t][e]}function a(e){return e.map(function(e){return e="[object object]"===Object.prototype.toString.call(e).toLowerCase()?JSON.stringify(e):String(e)})}function s(){if(void 0===setTimeout&&"function"==typeof Nc){var e={},t=0;global.setTimeout=function(n,r){e[++t]=n,Nc(t.toString(),r)},global.setTimeoutCallback=function(t){"function"==typeof e[t]&&(e[t](),delete e[t])}}}function l(){Object.freeze(Object),Object.freeze(Array),c(),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),u(),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype)}function c(){var e=Object.prototype,t="Object.prototype";d(e,"__defineGetter__",t),d(e,"__defineSetter__",t),d(e,"__lookupGetter__",t),d(e,"__lookupSetter__",t),d(e,"constructor",t),d(e,"hasOwnProperty",t),d(e,"isPrototypeOf",t),d(e,"propertyIsEnumerable",t),d(e,"toLocaleString",t),d(e,"toString",t),d(e,"valueOf",t),Object.seal(e)}function u(){var e=Error.prototype,t="Error.prototype";d(e,"name",t),d(e,"message",t),d(e,"toString",t),d(e,"constructor",t),Object.seal(e)}function d(e,t,n){if(e.hasOwnProperty(t)){var r=e[t];Object.defineProperty(e,t,{get:function(){return r},set:function(r){if(this===e)throw Error("Cannot assign to read only property "+t+" of "+n);return Object.defineProperty(this,t,{value:r,writable:!0}),r}})}}function f(){return(Bc++).toString()}function p(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1)}function h(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 v(e){if("function"!=typeof atob)return new ArrayBuffer(0);var t=atob(e),n=new Uint8Array(t.length);return Array.prototype.forEach.call(t,function(e,t){n[t]=e.charCodeAt(0)}),n.buffer}function m(e){var t=p(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:h(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:h(e.buffer)};default:return JSON.stringify(e)}}function y(e){if("Object"===p(e)){if(e["@type"]&&"binary"===e["@type"])return v(e.base64||"");var t={};for(var n in e)t[n]=y(e[n]);return t}return"Array"===p(e)?e.map(y):e}function g(e,t){e&&(Fc[e]=t)}function b(e){return Fc[e]}function A(e){delete Fc[e]}function w(e){var t=Fc[e];return t&&t.taskCenter?t.taskCenter:null}function _(e,t,n){var r=e.documentElement;if(!(r.pureChildren.length>0||t.parentNode)){var o=r.children,i=o.indexOf(n);i<0?o.push(t):o.splice(i,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,C(t,r)):(t.children.forEach(function(e){e.parentNode=t}),E(e,t),t.docId=e.id,t.ownerDocument=e,C(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),x(e,t)):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function x(e,t){var n=t.toJSON(),r=n.children;delete n.children;var o=e.taskCenter.send("dom",{action:"createBody"},[n]);return r&&r.forEach(function(t){o=e.taskCenter.send("dom",{action:"addElement"},[n.ref,t,-1])}),o}function E(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function C(e,t){e.parentNode=t,t.docId&&(e.docId=t.docId,e.ownerDocument=t.ownerDocument,e.ownerDocument.nodeMap[e.nodeId]=e,e.depth=t.depth+1),e.children.forEach(function(t){C(t,e)})}function k(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function S(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function O(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&&(i.previousSibling=e)),n}function I(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 l=t[s-1],c=t[s];return t.splice(s,0,e),r&&(l&&(l.nextSibling=e),e.previousSibling=l,e.nextSibling=c,c&&(c.previousSibling=e)),o===s?-1:n}function j(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)}}function T(e,t){if(t&&t.length){var n=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Wc);t.forEach(function(t){n.prototype[t]=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o=w(this.docId);if(o)return o.send("component",{ref:this.ref,component:e,method:t},n)}}),$c[e]=n}}function L(e){return $c[e]}function P(e){return"String"===p(e)?{"@binding":e}:e}function M(e){for(var t,n,r=[],o=Qc.lastIndex=0;t=Qc.exec(e);){(n=t.index)>o&&r.push(e.slice(o,n));var i=P(t[1].trim());r.push(i),o=n+t[0].length}return o<e.length&&r.push(e.slice(o)),1===r.length?r[0]:r}function N(e){if("String"===p(e)&&Qc.test(e))return M(e);if("Object"===p(e)){var t={};for(var n in e)t[n]=N(e[n]);return t}return"Array"===p(e)?e.map(N):e}function B(e,t){b(e).nodeMap[t.nodeId]=t}function R(){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},t=Gc.prototype;for(var n in e)!function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return Hc(e,[{module:"dom",method:n,args:t}],"-1")}}(n);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return Hc(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return Hc(e,[{module:t,method:n,args:r}])}}function F(e,t){W(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),Jc.push({name:e,options:t}))}function D(e){Jc.some(function(t,n){if(t.name===e)return Jc.splice(n,1),!0})}function W(e){return $(e)>=0}function $(e){return Jc.map(function(e){return e.name}).indexOf(e)}function Q(e){var t=Kc.exec(e);if(t)try{return JSON.parse(t[1]).framework}catch(e){}return"Weex"}function U(e,t,n){var r=Object.create(null);return r.service=Object.create(null),Jc.forEach(function(o){o.name;var i=o.options.create;if(i){var a=i(e,t,n);Object.assign(r.service,a),Object.assign(r,a.instance)}}),delete r.service.instance,Object.freeze(r.service),r}function z(e){if(Zc[e])return Zc[e].framework}function V(e){Xc[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];"registerComponents"===e&&H(t[0]);for(var r in qc){var o=qc[r];o&&o[e]&&o[e].apply(o,t)}}}function H(e){Array.isArray(e)&&e.forEach(function(e){e&&e.type&&e.methods&&T(e.type,e.methods)})}function G(e){Xc[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=z(r);if(o&&qc[o]){var i=(s=qc[o])[e].apply(s,t),a={framework:o};return"refreshInstance"===e?Jc.forEach(function(e){var t=e.options.refresh;t&&t(r,{info:a,runtime:Yc})}):"destroyInstance"===e&&(Jc.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:a,runtime:Yc})}),delete Zc[r]),i}return new Error('invalid instance id "'+r+'"');var s}}function q(e,t){Xc[t]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=z(r);return o&&qc[o]?(i=qc[o])[e].apply(i,t):new Error('invalid instance id "'+r+'"');var i}}function Y(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}function J(e,t){var n=t||global.callNative;return"function"!=typeof n&&console.error("[JS Runtime] no default handler"),function(t){Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var o=Z(e,t[r],n);if(-1===o)return o}}}function K(e,t){return"dom"===e&&nu[t]&&"function"==typeof global[nu[t]]}function Z(e,t,n){var r=t.module,o=t.method,i=t.args;return K(r,o)?global[nu[o]].apply(global,[e].concat(i,["-1"])):n(e,[t],"-1")}function X(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)}function ee(e){for(var t=[],n=arguments.length-1;n-- >0;)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&&ee.apply(void 0,[e].concat(t))}return e}function te(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function ne(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function re(e,t){return Su.call(e,t)}function oe(e,t){return function(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}}function ie(e){return null!==e&&"object"==typeof e}function ae(e){return Ou.call(e)===Iu}function se(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function le(){return"object"==typeof nativeSet?nativeSet.create():new iu}function ce(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}function ue(e){return e.replace(Tu,"").replace(Lu,"")}function de(e){return e.replace(Mu,"")}function fe(){this.id=Du++,this.subs=[]}function pe(e){fe.target&&Wu.push(fe.target),fe.target=e}function he(){fe.target=Wu.pop()}function ve(){fe.target=null,Wu=[]}function me(e,t,n,r){r&&ee(this,r);var o="function"==typeof t;this.vm=e,e._watchers.push(this),this.expression=t,this.cb=n,this.id=++$u,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=le(),this.newDepIds=le(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}function ye(e,t){var n,r,o,i;if(t||(t=Qu).clear(),o=Array.isArray(e),i=ie(e),o||i){if(e.__ob__){var a=e.__ob__.dep.id;if(t.has(a))return;t.add(a)}if(o)for(n=e.length;n--;)ye(e[n],t);else if(i)for(n=(r=Object.keys(e)).length;n--;)ye(e[r[n]],t)}}function ge(e){this.value=e,this.dep=new fe,te(e,"__ob__",this),Array.isArray(e)?((ju?be:Ae)(e,zu,Vu),this.observeArray(e)):this.walk(e)}function be(e,t){e.__proto__=t}function Ae(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];te(e,i,t[i])}}function we(e,t){if(ie(e)){var n;return re(e,"__ob__")&&e.__ob__ instanceof ge?n=e.__ob__:(Array.isArray(e)||ae(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new ge(e)),n&&t&&n.addVm(t),n}}function _e(e,t,n){var r=new fe,o=Object.getOwnPropertyDescriptor(e,t);if(!o||!1!==o.configurable){var i=o&&o.get,a=o&&o.set,s=we(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=i?i.call(e):n;if(fe.target&&(r.depend(),s&&s.dep.depend(),Array.isArray(t)))for(var o=void 0,a=0,l=t.length;a<l;a++)(o=t[a])&&o.__ob__&&o.__ob__.dep.depend();return t},set:function(t){t!==(i?i.call(e):n)&&(a?a.call(e,t):n=t,s=we(t),r.notify())}})}}function xe(e,t,n){if(Array.isArray(e))return e.splice(t,1,n);if(re(e,t))e[t]=n;else if(e._isVue)xe(e._data,t,n);else{var r=e.__ob__;if(r){if(r.convert(t,n),r.dep.notify(),r.vms)for(var o=r.vms.length;o--;)Ee(r.vms[o],t);return n}e[t]=n}}function Ee(e,t){(Hu.indexOf(t)>-1||!se(t))&&Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return e._data[t]},set:function(n){e._data[t]=n}})}function Ce(e,t){se(t)||delete e[t]}function ke(e){e._watchers=[],Se(e),Ie(e),Te(e)}function Se(e){var t=e._data;ae(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)Ee(e,n[r]);we(t,e)}function Oe(){}function Ie(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};"function"==typeof r?(o.get=je(r,e),o.set=Oe):(o.get=r.get?!1!==r.cache?je(r.get,e):oe(r.get,e):Oe,o.set=r.set?oe(r.set,e):Oe),Object.defineProperty(e,n,o)}}function je(e,t){var n=new me(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),fe.target&&n.depend(),n.value}}function Te(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}function Le(e){var t=e.type,n=qu[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===ce(e[r])&&"object"===ce(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])}function Pe(e,t,n){De(e,t,n.id,e),We(e,t,n.attr),Qe(e,t,n.classList),Ue(e,t,n.style),Ve(e,t,n.events)}function Me(e,t,n,r){t=t||{},n=n||{};var o=(t._options||{}).props;Array.isArray(o)&&(o=o.reduce(function(e,t){return e[t]=!0,e},{})),Be(r,o,e,t),Be(n.attr,o,e,t)}function Ne(e,t,n,r){void 0===r&&(r={}),Fe(n.classList,e,t),Re(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function Be(e,t,n,r){if(e){for(var o in e)!function(o){if(!t||t[o]){var i=e[o];if("function"==typeof i){var a=qe(n,i,function(e){r[o]=e});r[o]=a}else r[o]=i}}(o)}}function Re(e,t,n){for(var r in e)!function(r){var o=e[r];if("function"==typeof o){var i=qe(t,o,function(e){n._rootEl&&n._rootEl.setStyle(r,e)});n._rootEl.setStyle(r,i)}else n._rootEl&&n._rootEl.setStyle(r,o)}(r)}function Fe(e,t,n){function r(e,t){"array"===ce(e)&&e.unshift(t)}var o=t._options&&t._options.style||{};if(n._rootEl){var i="@originalRootEl";if(o[i]=n._rootEl.classStyle,"function"==typeof e){var a=qe(t,e,function(e){r(e,i),$e(n._rootEl,o,e)});r(a,i),$e(n._rootEl,o,a)}else null!=e&&(r(e,i),$e(n._rootEl,o,e))}}function De(e,t,n,r){var o=Object.create(null);if(Object.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return t||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;((n=i.call(e))||0===n)&&(e._ids[n]=o),qe(e,i,function(t){t&&(e._ids[t]=o)})}else n&&"string"==typeof n&&(e._ids[n]=o)}function We(e,t,n){He(e,t,"attr",n)}function $e(e,t,n){"string"==typeof n&&(n=n.split(/\s+/)),n.forEach(function(e,t){n.splice.apply(n,[t,1].concat(e.split(/\s+/)))});for(var r={},o=n.length,i=0;i<o;i++)!function(e){var o=t[n[e]];o&&Object.keys(o).forEach(function(e){r[e]=o[e]})}(i);e.setClassStyle(r)}function Qe(e,t,n){if("function"==typeof n||Array.isArray(n))if(!Array.isArray(n)||n.length){var r=e._options&&e._options.style||{};if("function"==typeof n){var o=qe(e,n,function(e){$e(t,r,e)});$e(t,r,o)}else $e(t,r,n)}else t.setClassStyle({})}function Ue(e,t,n){He(e,t,"style",n)}function ze(e,t,n,r){t.addEvent(n,oe(r,e))}function Ve(e,t,n){if(n)for(var r=Object.keys(n),o=r.length;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.')),ze(e,t,i,a)}}function He(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?Ge(e,t,n,a,s):t[Yu[n]](a,s)}}function Ge(e,t,n,r,o){var i=Yu[n],a=qe(e,o,function(n){function o(){t[i](r,n)}var a=e&&e._app&&e._app.differ;a?a.append("element",t.depth,t.ref,o):o()});t[i](r,a)}function qe(e,t,n){return e._static?t.call(e,e):new me(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)}).value}function Ye(e,t){return e._app.doc.createBody(t)}function Je(e,t){return e._app.doc.createElement(t)}function Ke(e,t){var n=Ze(e),r=Xe(e),o=Ju++;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}}function Ze(e){return e._app.doc.createComment("start")}function Xe(e){return e._app.doc.createComment("end")}function et(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=tt(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 tt(e,t,n){return t.element?rt(t,n):nt(t,n)}function nt(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}function rt(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}}function ot(e,t,n){void 0===n&&(n=!1),t.element?at(t,n):it(t),t._vm&&t._vm.$emit("hook:destroyed")}function it(e){var t=e.parentNode;t&&t.removeChild(e)}function at(e,t){void 0===t&&(t=!1);for(var n=[],r=e.start.nextSibling;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||it(e.start),n.forEach(function(e){it(e)}),t||it(e.end)}function st(e){var t=e._options||{},n=t.template||{};t.replace?n.children&&1===n.children.length?lt(e,n.children[0],e._parentEl):lt(e,n.children,e._parentEl):lt(e,n,e._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+e._type+")"),e.$emit("hook:ready"),e._ready=!0}function lt(e,t,n,r){if(-1!==(e._app||{}).lastSignal)if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),ct(t))vt(e,t,n,r);else{if(r=r||{},ut(t))return console.debug('[JS Framework] compile "content" block by',t),void(e._content=Ke(e,n));if(dt(t,r))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!"):mt(e,t,n));if(ft(t,r))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!"):yt(e,t,n,r));var o=r.type||t.type;if(pt(o,r))gt(e,t,n,o,r);else{var i=o,a=ht(e,t,i);if(a)return console.debug("[JS Framework] compile composed component by",t),void bt(e,a,t,n,i,r);console.debug("[JS Framework] compile native component by",t),At(e,t,n,i)}}}function ct(e){return Array.isArray(e)}function ut(e){return"content"===e.type||"slot"===e.type}function dt(e,t){return!t.hasOwnProperty("repeat")&&e.repeat}function ft(e,t){return!t.hasOwnProperty("shown")&&e.shown}function pt(e,t){return"function"==typeof e&&!t.hasOwnProperty("type")}function ht(e,t,n){var r;return e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]),e._options&&e._options.components&&(r=e._options.components[n]),t.component&&(r=r||{}),r}function vt(e,t,n,r){var o=Ke(e,n);t.forEach(function(t){lt(e,t,o,r)})}function mt(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",l=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,c=Ke(e,n);c.children=[],c.data=[],c.vms=[],_t(e,t,c,{getter:i,key:a,value:s,trackBy:l,oldStyle:o})}function yt(e,t,n,r){var o={shown:!0},i=Ke(e,n);n.element&&n.children&&n.children.push(i),r.repeat&&(o.repeat=r.repeat),xt(e,t,i,o)}function gt(e,t,n,r,o){var i=ee({type:r.call(e)},o),a=Ke(e,n);n.element&&n.children&&n.children.push(a),qe(e,r,function(n){var r=ee({type:n},o);ot(e,a,!0),lt(e,t,a,r)}),lt(e,t,a,i)}function bt(e,t,n,r,o,i){var a=new(0,e.constructor)(o,t,e,r,void 0,{"hook:init":function(){e._static&&(this._static=e._static),De(e,null,n.id,this),this._externalBinding={parent:e,template:n}},"hook:created":function(){Me(e,this,n,i.repeat)},"hook:ready":function(){this._content&&wt(e,n,this._content)}});Ne(e,a,n,r)}function At(e,t,n,r){Le(t);var o;if("_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),o=Ye(e,r)):(console.debug("[JS Framework] compile to create element for "+r),o=Je(e,r)),!e._rootEl){e._rootEl=o;var i=e._externalBinding||{},a=i.template,s=i.parent;if(a&&a.events&&s&&o)for(var l in a.events){var c=s[a.events[l]];c&&o.addEvent(l,oe(c,s))}}Pe(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 u="tree"===t.append,d=e._app||{};-1===d.lastSignal||u||(console.debug("[JS Framework] compile to append single node for",o),d.lastSignal=et(e,o,n)),-1!==d.lastSignal&&wt(e,t,o),-1!==d.lastSignal&&u&&(console.debug("[JS Framework] compile to append whole tree for",o),d.lastSignal=et(e,o,n))}function wt(e,t,n){var r=e._app||{},o=t.children;o&&o.length&&o.every(function(t){return lt(e,t,n),-1!==r.lastSignal})}function _t(e,t,n,r){function o(e,r,o){var a;c?(a=e,ie(e)?(a[u]=r,a.hasOwnProperty("INDEX")||Object.defineProperty(a,"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."),(a={})[u]=r,a[d]=e)):((a={})[u]=r,a[d]=e);var s=Ct(o,a);i.push(s),lt(s,t,n,{repeat:e})}var i=n.vms,a=n.children,s=r.getter,l=r.trackBy,c=r.oldStyle,u=r.key,d=r.value,f=Et(e,n,s,"repeat",function(t){if(console.debug('[JS Framework] the "repeat" item has changed',t),n&&t){var r=a.slice(),s=i.slice(),f=n.data.slice(),p={},h={};t.forEach(function(e,t){var n=l?e[l]:c?e[u]:t;null!=n&&""!==n&&(p[n]=e)});var v=[];f.forEach(function(t,n){var o=l?t[l]:c?t[u]:n;p.hasOwnProperty(o)?(h[o]={item:t,index:n,key:o,target:r[n],vm:s[n]},v.push(t)):ot(e,r[n])}),a.length=0,i.length=0,n.data=t.slice(),n.updateMark=n.start,t.forEach(function(t,r){var s=l?t[l]:c?t[u]:r,f=h[s];f?(f.item===v[0]?v.shift():(v.$remove(f.item),tt(e,f.target,n.updateMark,!0)),a.push(f.target),i.push(f.vm),c?f.vm=t:f.vm[d]=t,f.vm[u]=r,n.updateMark=f.target):o(t,r,e)}),delete n.updateMark}});n.data=f.slice(0),f.forEach(function(t,n){o(t,n,e)})}function xt(e,t,n,r){var o=Et(e,n,t.shown,"shown",function(o){console.debug('[JS Framework] the "if" item was changed',o),n&&!!n.display!=!!o&&(n.display=!!o,o?lt(e,t,n,r):ot(e,n,!0))});n.display=!!o,o&&lt(e,t,n,r)}function Et(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return qe(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 Ct(e,t){var n=Object.create(e);return n._data=t,Se(n),Ie(n),n._realParent=e,e._static&&(n._static=e._static),n}function kt(e,t){if(t instanceof kt)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 St(e,t){var n=this,r=this._vmEvents[e];if(r){var o=new kt(e,t);r.forEach(function(e){e.call(n,o)})}}function Ot(e,t){var n=new kt(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function It(e,t){var n=new kt(e,t);this.$emit(e,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.forEach(function(t){t.$broadcast(e,n)})}function jt(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 Tt(e,t){if(e){var n=this._vmEvents;if(t){var r=n[e];r&&r.$remove(t)}else delete n[e]}}function Lt(e,t){var n=e._options||{},r=n.events||{};for(var o in r)e.$on(o,r[o]);for(var i in t)e.$on(i,t[i]);Ku.forEach(function(t){e.$on("hook:"+t,n[t])})}function Pt(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=(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,Lt(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._type+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof a?a():a,o&&ee(this._data,o),ke(this),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,st(this))}function Mt(e,t){for(var n in e)!function(n){var r=Zu[n];r||(r={},Zu[n]=r),e[n].forEach(function(e){"string"==typeof e&&(e={name:e}),r[e.name]&&!t||(r[e.name]=e)})}(n)}function Nt(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}function Bt(e,t){var n=Zu[t],r={};for(var o in n)!function(n){Object.defineProperty(r,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var r=[],o=arguments.length;o--;)r[o]=arguments[o];return e.callTasks({module:t,method:n,args:r})}},set:function(r){if("function"==typeof r)return e.callTasks({module:t,method:n,args:[r]})}})}(o);return r}function Rt(e,t){return e.customComponentMap[t]}function Ft(e,t,n){var r=e.customComponentMap;r[t]?console.error("[JS Framework] define a component("+t+") that already exists"):r[t]=n}function Dt(e){if(Xu.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 Wt(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return r.errorMessage=function(e,t,n){return"Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n}(e,t,n),o.indexOf("osversion")>=0?r.code=1001:o.indexOf("appversion")>=0?r.code=1002:o.indexOf("weexversion")>=0?r.code=1003:o.indexOf("devicemodel")>=0&&(r.code=1004),r}function $t(e,t){t=ae(t=t||global.WXEnvironment)?t:{};var n={isDowngrade:!1};if("function"===ce(e)){var r=e.call(this,t,{semver:Xu,normalizeVersion:Dt});n=(r=!!r)?Wt("custom","","custom params"):n}else{var o=(e=ae(e)?e:{})[(t.platform||"unknow").toLowerCase()]||{};for(var i in t){var a=i,s=a.toLowerCase(),l=t[i],c=s.indexOf("version")>=0,u=s.indexOf("devicemodel")>=0,d=o[i];if(d&&c){var f=Dt(d),p=Dt(t[i]);if(Xu.satisfies(p,f)){n=Wt(a,l,d);break}}else if(u&&("array"===ce(d)?d:[d]).indexOf(l)>=0){n=Wt(a,l,d);break}}}return n}function Qt(e,t){if(void 0===t&&(t={}),e&&e.callTasks)return e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}function Ut(e,t,n,r){console.debug("[JS Framework] bootstrap for "+t);var o;if(Nu(t))o=ue(t);else{if(!Fu(t))return new Error("Wrong component name: "+t);if(o=de(t),!Rt(e,o))return new Error("It's not a component: "+t)}if("string"==typeof(n=ae(n)?n:{}).transformerVersion&&"string"==typeof global.transformerVersion&&!Xu.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);var i=$t(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&&Qt(e,n.viewport),e.vm=new Pt(o,null,{_app:e},null,r)}function zt(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),Ft(e,t,n)}function Vt(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):ee(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}function Ht(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&Gt(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 Gt(e){if(delete e._app,delete e._computed,delete e._css,delete e._data,delete e._ids,delete e._methods,delete e._options,delete e._parent,delete e._parentEl,delete e._rootEl,e._watchers){for(var t=e._watchers.length;t--;)e._watchers[t].teardown();delete e._watchers}if(e._childrenVms){for(var n=e._childrenVms.length;n--;)Gt(e._childrenVms[n]);delete e._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+e._type+")"),e.$emit("hook:destroyed"),delete e._type,delete e._vmEvents}function qt(e){var t=(e.doc||{}).body||{};return t.toJSON?t.toJSON():{}}function Yt(e,t,n,r,o){console.debug('[JS Framework] Fire a "'+n+'" event on an element('+t+") in instance("+e.id+")");{if(!Array.isArray(t)){var i=e.doc.getRef(t);if(i){var a=e.doc.fireEvent(i,n,r,o);return e.differ.flush(),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),a}return new Error('invalid element reference "'+t+'"')}t.some(function(t){return!1!==Yt(e,t,n,r)})}}function Jt(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 Kt(e),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),o}function Kt(e){e.differ.flush()}function Zt(e,t){var n;return"array"!==ce(t)&&(t=[t]),t.forEach(function(t){n=e.doc.taskCenter.send("module",{module:t.module,method:t.method},t.args)}),n}function Xt(e,t,n,r){console.debug("[JS Framework] Intialize an instance with:\n",n);var o,i=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return ed.apply(void 0,[e].concat(t))},a=function(t,r,i){o=Ut(e,t,r,i||n),Kt(e),e.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+e.id+")")},s=Pt,l=e.doc,c=function(t){return e.requireModule(ue(t))},u={config:e.options,define:i,bootstrap:a,requireModule:c,document:l,Vm:s};Object.freeze(u);var d;"function"==typeof t?d=t.toString().substr(12):t&&(d=t.toString()),d='(function(global){\n\n"use strict";\n\n '+d+" \n\n})(Object.create(this))";var f=global.WXEnvironment,p={};if(f&&"Web"!==f.platform){var h=e.requireModule("timer");Object.assign(p,{setTimeout:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return h.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),e.doc.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return h.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),e.doc.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){h.clearTimeout(e)},clearInterval:function(e){h.clearInterval(e)}})}var v=Object.assign({define:i,require:function(t){return function(n){o=Ut(e,t,{},n)}},bootstrap:a,register:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return zt.apply(void 0,[e].concat(t))},render:function(t,n){o=Ut(e,t,{},n)},__weex_define__:i,__weex_bootstrap__:a,__weex_document__:l,__weex_require__:c,__weex_viewmodel__:s,weex:u},p,r);return tn(v,d)||en(v,d),o}function en(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);return n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}function tn(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 l=0;l<i.length-1;++l)o+=i[l],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var c=(e.weex||{}).config||{};(n=compileAndRunBundle(o,c.bundleUrl,c.bundleDigest,c.codeCachePath))&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}function nn(e,t){var n=e[t];for(var r in n)n[r]()}function rn(e,t){var n=e[t];for(var r in n)n[r].forEach(function(e){e()})}function on(e,t){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},this.doc=new Gu.Document(e,this.options.bundleUrl,null,Gu.Listener),this.differ=new td(e)}function an(e){"object"==typeof e&&Nt(Pt,e)}function sn(e){return Array.isArray?Array.isArray(e):"[object Array]"===Object.prototype.toString.call(e)}function ln(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}function cn(e){("number"!=typeof e||e<=0)&&(e=10);var t=Math.pow(10,e);return Math.floor(Date.now()+Math.random()*t)%t}function un(e,t){var n,r,o,i=null,a=0,s=function(){a=Date.now(),i=null,n=e.apply(r,o)};return function(){var l=Date.now(),c=t-(l-a);return r=this,o=Array.prototype.slice.call(arguments),c<=0?(clearTimeout(i),i=null,a=l,n=e.apply(r,o)):i||(i=setTimeout(s,c)),n}}function dn(e){return e?e.replace(/([A-Z])/g,function(e,t){return"-"+t.toLowerCase()}):""}function fn(e){return["default","go","next","search","send"].indexOf(e)>-1?e:"done"}function pn(e){if(!(this instanceof pn))return new pn(e);this.instanceId=e.instanceId,this.weexInstance=e,pd[this.instanceId]=this}function hn(e,t){callJS(e,[t])}function vn(e,t,n,r,o){return gn(e,{component:o.component,ref:t,method:n,args:r})}function mn(e,t,n,r,o){return gn(e,{module:t,method:n,args:r})}function yn(e,t,n){var r=[];if("string"==typeof t)try{r=JSON.parse(t)}catch(e){console.error("invalid tasks:",t)}else sn(t)&&(r=t);var o=r.length;r[o-1].callbackId=n||0===n?n:-1;for(var i=0;i<o;i++)gn(e,r[i])}function gn(e,t){var n=void 0===t.module?An(e,t):bn(e,t),r=t.callbackId;return!r&&0!==r&&"0"!==r||"-1"===r||-1===r||wn(e,r),n}function bn(e,t){var n,r,o=t.module,i=t.method,a=t.args||t.arguments||[];if((n=sd.apiModule[o])&&(r=n[i]))return r.apply(global.weex.getInstance(e),a)}function An(e,t){var n=t.component,r=t.ref,o=t.method,i=t.args||t.arguments||[],a=global.weex.getInstance(e).getComponentManager().getComponent(r);if(!a)return console.error("[h5-render] component of ref "+r+" doesn't exist.");var s;return(s=a[o])?s.apply(a,i):console.error("[h5-render] component "+n+" doesn't have a method named "+o+".")}function wn(e,t){pn.getSender(e).performCallback(t)}function _n(){if(ld.debug){if(arguments[0].match(/^perf/))return void console.info.apply(console,arguments);console.debug.apply(console,arguments)}}function xn(){global.callNative=yn,global.callNativeComponent=vn,global.callNativeModule=mn,global.nativeLog=_n}function En(e){var t=e.data.event;return!(!t||-1===t.indexOf("appear")&&-1===t.indexOf("disappear"))}function Cn(e){if(En(e)&&(vd.push(e),!md)){md=!0;var t=un(In,100);window.addEventListener("scroll",t,!1)}}function kn(e){var t=e.node.getBoundingClientRect();return t.right>0&&t.left<window.innerWidth&&t.bottom>0&&t.top<window.innerHeight}function Sn(e,t){return e.left<t.right&&e.right>t.left&&e.top<t.bottom&&e.bottom>t.top}function On(e){var t=e.getParentScroller();return t?kn(e)&&Sn(e.node.getBoundingClientRect(),t.node.getBoundingClientRect()):kn(e)}function In(e){var t;if("scrolling"===e.originalType)t=e.direction;else{var n=window.scrollY;t=n>=yd?"up":"down",yd=n}for(var r=vd.length,o=0;o<r;o++){var i=vd[o],a=On(i);a?i.dispatchEvent("appear",{direction:t}):a||i.dispatchEvent("disappear",{direction:t})}}function jn(e){this.id=e,this.batched=!1,this.updates=[],this.componentMap={},gd[this.id]=this}function Tn(e,t){(0,wd[e.loader])(e,t)}function Ln(e,t){"function"==typeof t&&(wd[e]=t)}function Pn(e){return-1!==_d.indexOf(e)?{}:{number:function(e){return e+"px"},string:function(t){var n=t.match(/^([+-]?\d.*)+([p,w]x)$/);if(n&&3===n.length){if("px"===n[2])return parseFloat(n[1])+"px";if("wx"===n[2])return parseFloat(n[1])*global.WXEnvironment.devicePixelRatio+"px"}if(e.match(/transform/)&&t.match(/translate/)){var r=t.replace(/\d*\.?\d+px/g,function(e){return parseInt(parseFloat(e))+"px"});return r.match(/wx/)&&(r=r.replace(/\d*\.?\d+wx/g,function(e){return parseInt(parseFloat(e))*global.WXEnvironment.devicePixelRatio+"px"})),r}return e.match(/^border$/)&&t.match(/^\d+(?:[w,p]x)?\s+/)&&(t=t.replace(/^(\d+(?:[w,p]x)?)/,function(e,n){return parseFloat(n)*(t.match(/^\d+(?:wx)+/)?global.WXEnvironment.devicePixelRatio:1)+"px"})),t}}}function Mn(){return""+xd++}function Nn(e,t,n){function r(e,t){return e+"{"+Object.keys(t).map(function(e){return dn(e)+":"+t[e]+"!important;"}).join("")+"}"}var o=e.node.getAttribute("data-pseudo-id");if(!o){o=Mn(),e.node.setAttribute("data-pseudo-id",o);var i=document.createElement("style");i.type="text/css",i.setAttribute("data-pseudo-id",o),document.getElementsByTagName("head")[0].appendChild(i);var a=Object.keys(n).map(function(e){var t=n[e];return r('[data-pseudo-id="'+o+'"]'+e,t)}).join("");return i.appendChild(document.createTextNode(a))}var s=Array.prototype.slice.call(document.styleSheets||[]).filter(function(e){return e.ownerNode.getAttribute("data-pseudo-id")===o});if(s&&!(s.length<=0)){var l=l[0],c=l.cssRules||l.rules;Object.keys(n).forEach(function(e){var t=n[e],i='[data-pseudo-id="'+o+'"]'+e,a=Array.prototype.slice.call(c).reduce(function(e,t,n){return t.selectorText===i&&(e.idx=n),e},{idx:-1}).idx;if(-1!==a){var s=c[a].cssText.match(/^[^{]+\{([^}]+)\}/);if(s&&s[1]){var u=s[1].split(";").reduce(function(e,t){var n=t.match(/(\S+)\s*:\s*(\S+)/);return n&&n[1]&&n[2]&&(e[n[1]]=n[2]),e},{});ee(u,t),Object.keys(u).forEach(function(e){u[e]||delete u[e]}),l.deleteRule(a),l.insertRule(r(i,u),c.length-1)}}else l.insertRule(r(i,t),c.length)})}}function Bn(e){if(!(!e instanceof Dn)){var t,n=e.component.getParentScroller();n?(t=e.parent=n,e.parentElement=t.node):(t=e.parent=e.component.getRootContainer(),e.parentElement=t)}}function Rn(e){var t=e.component,n=e.element;t.stickyPlaceholder=e.element.cloneNode(!0),t.stickyPlaceholder.removeAttribute("data-ref"),t.stickyPlaceholder.classList.add("weex-sticky-placeholder"),n.classList.add("weex-sticky"),e.preMarginTop=n.style.marginTop,e.preTop=n.style.top,n.style.marginTop=e.top||"0px",n.parentNode.insertBefore(t.stickyPlaceholder,n),n.style.position="fixed";var r;r=e.parent instanceof HTMLElement?0:e.parentElement.getBoundingClientRect().top,n.style.top=r+"px",e.parentElement.appendChild(n)}function Fn(e,t){var n=e.component,r=e.element;if(t=t?t+"":e.prePosition,r.style.position=t,r.style.marginTop=e.preMarginTop||"",r.style.top=e.preTop||"",r.classList.remove("weex-sticky"),n.stickyPlaceholder){var o=n.stickyPlaceholder.parentNode;o.insertBefore(r,n.stickyPlaceholder),o.removeChild(n.stickyPlaceholder),n.stickyPlaceholder=null}}function Dn(e,t){t=t||{},this.component=e,this.element=e.node,this.prePosition=this.element.style.position,this.withinParent=t.withinParent||!1,this.parent=null,this.init()}function Wn(){setTimeout(function(){return lib.img.fire()},0)}function $n(e){Bd||(Bd=setTimeout(function(){Wn(),clearTimeout(Bd),Bd=null},16))}function Qn(e){var t=e.querySelectorAll("[img-src]"),n=e.querySelectorAll("[i-lazy-src]");(t.length>0||n.length>0)&&Wn()}function Un(e,t){e.removeAttribute("img-src"),e.removeAttribute("i-lazy-src"),e.removeAttribute("src"),e.setAttribute("img-src",t),Wn()}function zn(e){if("object"!=typeof e||e instanceof HTMLElement||(e=e.node),e)return"image"===e.tagName.toLowerCase()?$n(e):Qn(e)}function Vn(e,t){if(Rd.indexOf(t)<=-1)return!0;if(void 0===e._appear&&"disappear"===t)return!1;var n;return(n=void 0===e._appear&&"appear"===t||t!==e._appear)&&(e._appear=t),n}function Hn(e,t){this.data=e,this.node=this.create(t),this.createChildren(),this.updateAttrs(this.data.attr||{}),this.data.classStyle&&this.updateStyle(this.data.classStyle),this.updateStyle(this.data.style||{}),this.bindEvents(this.data.event||[])}function Gn(e){Hn.call(this,e)}function qn(e,t,n,r){var o=this,i=r&&!!r.once,a=Fd[e];a||(a=Fd[e]={});var s=a[t];s||(s=a[t]=[]),s.push(function(e){return o.sender.performCallback(n,e,!i)})}function Yn(e,t){try{delete Fd[e][t]}catch(e){}}function Jn(e,t,n){"globalEvent"!==e&&(t.addEventListener=function(t,n,r){return qn.call(this,e,t,n,r)},t.removeAllEventListeners=function(t){return Yn.call(this,e,t)},[{name:"addEventListener",args:["string","function","object"]},{name:"removeAllEventListeners",args:["string"]}].forEach(function(t){return n[e].push(t)}))}function Kn(e){e.init(this)}function Zn(e,t){for(var n=e;n;){if(n.contains(t)||n==t)return n;n=n.parentNode}return null}function Xn(e,t,n){var r=$d.createEvent("HTMLEvents");if(r.initEvent(t,!0,!0),"object"==typeof n)for(var o in n)r[o]=n[o];e.dispatchEvent(r)}function er(e,t,n,r,o,i,a,s){var l=Math.atan2(s-i,a-o)-Math.atan2(r-t,n-e),c=Math.sqrt((Math.pow(s-i,2)+Math.pow(a-o,2))/(Math.pow(r-t,2)+Math.pow(n-e,2))),u=[o-c*e*Math.cos(l)+c*t*Math.sin(l),i-c*t*Math.cos(l)-c*e*Math.sin(l)];return{rotate:l,scale:c,translate:u,matrix:[[c*Math.cos(l),-c*Math.sin(l),u[0]],[c*Math.sin(l),c*Math.cos(l),u[1]],[0,0,1]]}}function tr(e){for(h=0;h<e.changedTouches.length;h++){v=e.changedTouches[h];if(!(m=zd[v.identifier]))return;m.lastTouch||(m.lastTouch=m.startTouch),m.lastTime||(m.lastTime=m.startTime),m.velocityX||(m.velocityX=0),m.velocityY||(m.velocityY=0),m.duration||(m.duration=0);var t=Date.now()-m.lastTime,n=(v.clientX-m.lastTouch.clientX)/t,r=(v.clientY-m.lastTouch.clientY)/t;t>70&&(t=70),m.duration+t>70&&(m.duration=70-t),m.velocityX=(m.velocityX*m.duration+n*t)/(m.duration+t),m.velocityY=(m.velocityY*m.duration+r*t)/(m.duration+t),m.duration+=t,m.lastTouch={};for(var o in v)m.lastTouch[o]=v[o];m.lastTime=Date.now();var i=v.clientX-m.startTouch.clientX,a=v.clientY-m.startTouch.clientY,s=Math.sqrt(Math.pow(i,2)+Math.pow(a,2)),l=!(Math.abs(i)>Math.abs(a)),c=l?a>=0?"down":"up":i>=0?"right":"left";("tapping"===m.status||"pressing"===m.status)&&s>10&&(m.status="panning",m.isVertical=l,m.direction=c,Xn(m.element,"panstart",{touch:v,touches:e.touches,changedTouches:e.changedTouches,touchEvent:e,isVertical:m.isVertical,direction:c})),"panning"===m.status&&(m.panTime=Date.now(),Xn(m.element,"panmove",{displacementX:i,displacementY:a,touch:v,touches:e.touches,changedTouches:e.changedTouches,touchEvent:e,isVertical:m.isVertical,direction:c}))}if(2==Object.keys(zd).length){for(var u,d=[],f=[],p=[],h=0;h<e.touches.length;h++){var v=e.touches[h],m=zd[v.identifier];d.push([m.startTouch.clientX,m.startTouch.clientY]),f.push([v.clientX,v.clientY])}for(var o in zd)p.push(zd[o].element);u=er(d[0][0],d[0][1],d[1][0],d[1][1],f[0][0],f[0][1],f[1][0],f[1][1]),Xn(Zn(p[0],p[1]),"dualtouch",{transform:u,touches:e.touches,touchEvent:e})}}function nr(e){if(2==Object.keys(zd).length){var t=[];for(var n in zd)t.push(zd[n].element);Xn(Zn(t[0],t[1]),"dualtouchend",{touches:Ud.call(e.touches),touchEvent:e})}for(var r=0;r<e.changedTouches.length;r++){var o=e.changedTouches[r],i=o.identifier,a=zd[i];if(a){if(a.pressingHandler&&(clearTimeout(a.pressingHandler),a.pressingHandler=null),"tapping"===a.status&&(a.timestamp=Date.now(),Xn(a.element,"tap",{touch:o,touchEvent:e}),Vd&&a.timestamp-Vd.timestamp<300&&Xn(a.element,"doubletap",{touch:o,touchEvent:e}),Vd=a),"panning"===a.status){var s=Date.now(),l=s-a.startTime,c=o.clientX-a.startTouch.clientX,u=o.clientY-a.startTouch.clientY,d=Math.sqrt(a.velocityY*a.velocityY+a.velocityX*a.velocityX)>.5&&s-a.lastTime<100,f={duration:l,isSwipe:d,velocityX:a.velocityX,velocityY:a.velocityY,displacementX:c,displacementY:u,touch:o,touches:e.touches,changedTouches:e.changedTouches,touchEvent:e,isVertical:a.isVertical,direction:a.direction};Xn(a.element,"panend",f),d&&Xn(a.element,"swipe",f)}"pressing"===a.status&&Xn(a.element,"pressend",{touch:o,touchEvent:e}),delete zd[i]}}0===Object.keys(zd).length&&(Qd.removeEventListener("touchmove",tr,!1),Qd.removeEventListener("touchend",nr,!1),Qd.removeEventListener("touchcancel",rr,!1))}function rr(e){if(2==Object.keys(zd).length){var t=[];for(var n in zd)t.push(zd[n].element);Xn(Zn(t[0],t[1]),"dualtouchend",{touches:Ud.call(e.touches),touchEvent:e})}for(var r=0;r<e.changedTouches.length;r++){var o=e.changedTouches[r],i=o.identifier,a=zd[i];a&&(a.pressingHandler&&(clearTimeout(a.pressingHandler),a.pressingHandler=null),"panning"===a.status&&Xn(a.element,"panend",{touch:o,touches:e.touches,changedTouches:e.changedTouches,touchEvent:e}),"pressing"===a.status&&Xn(a.element,"pressend",{touch:o,touchEvent:e}),delete zd[i])}0===Object.keys(zd).length&&(Qd.removeEventListener("touchmove",tr,!1),Qd.removeEventListener("touchend",nr,!1),Qd.removeEventListener("touchcancel",rr,!1))}function or(){}function ir(e){document.querySelector("meta[name=viewport]").setAttribute("content","width="+e+", user-scalable=no")}function ar(e){if(!(this instanceof ar))return new ar(e);this.width=e.width||window.innerWidth,this.bundleUrl=e.bundleUrl||location.href,this.instanceId=e.appId,this.rootId=e.rootId||Kd+cn(10),this.jsonpCallback=e.jsonpCallback||Zd,this.source=e.source,this.loader=e.loader,this.embed=e.embed,ir(Jd),(e.downgrade||[]).forEach(function(e){ld.downgrade[e]=!0}),this.data=e.data,this.sender=new pn(this),Xd[this.instanceId]=this,Tn({jsonpCallback:this.jsonpCallback,source:this.source,loader:this.loader},function(e,t){e?console.error("load bundle err:",e):this.createApp(ld,t)}.bind(this))}function sr(e,t){return[[(e/3+(e+t)/3-e)/(t-e),(e*e/3+e*t*2/3-e*e)/(t*t-e*e)],[(t/3+(e+t)/3-e)/(t-e),(t*t/3+e*t*2/3-e*e)/(t*t-e*e)]]}function lr(e){if(this.v=e.v||0,this.a=e.a||0,void 0!==e.t&&(this.t=e.t),void 0!==e.s&&(this.s=e.s),void 0===this.t)if(void 0===this.s)this.t=-this.v/this.a;else{var t=(Math.sqrt(this.v*this.v+2*this.a*this.s)-this.v)/this.a,n=(-Math.sqrt(this.v*this.v+2*this.a*this.s)-this.v)/this.a;this.t=Math.min(t,n)}void 0===this.s&&(this.s=this.a*this.t*this.t/2+this.v*this.t)}function cr(){lib.scroll.outputDebugLog&&console.log.apply(console,arguments)}function ur(e){var t=e.getBoundingClientRect();if(!t){(t={}).width=e.offsetWidth,t.height=e.offsetHeight,t.left=e.offsetLeft,t.top=e.offsetTop;for(var n=e.offsetParent;n;)t.left+=n.offsetLeft,t.top+=n.offsetTop,n=n.offsetParent;t.right=t.left+t.width,t.bottom=t.top+t.height}return t}function dr(e){return 0-e.options[e.axis+"PaddingTop"]}function fr(e){var t=ur(e.element),n=ur(e.viewport),r=dr(e);if("y"===e.axis)o=0-t.height+n.height;else var o=0-t.width+n.width;return Math.min(o+e.options[e.axis+"PaddingBottom"],r)}function pr(e,t){return t>e.minScrollOffset?t-e.minScrollOffset:t<e.maxScrollOffset?t-e.maxScrollOffset:void 0}function hr(e,t){return t>e.minScrollOffset?t=e.minScrollOffset:t<e.maxScrollOffset&&(t=e.maxScrollOffset),t}function vr(e,t,n){cr(e.element.scrollId,t,n);var r=Af.createEvent("HTMLEvents");if(r.initEvent(t,!1,!0),r.scrollObj=e,n)for(var o in n)r[o]=n[o];e.element.dispatchEvent(r),e.viewport.dispatchEvent(r)}function mr(e){var t,n={x:0,y:0},r=getComputedStyle(e.element)[If+"Transform"],o=new RegExp("^matrix3d\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)"),i=new RegExp("^matrix\\((?:[-\\d.]+,\\s*){4}([-\\d.]+),\\s*([-\\d.]+)\\)$");return"none"!==r&&(t=r.match(o)||r.match(i))&&(n.x=parseFloat(t[1])||0,n.y=parseFloat(t[2])||0),n}function yr(e,t){return e=parseFloat(e),t=parseFloat(t),0!=e&&(e+="px"),0!=t&&(t+="px"),Tf?"translate3d("+e+", "+t+", 0)":"translate("+e+", "+t+")"}function gr(e,t,n){e.element.style[If+"Transition"]=""===t&&""===n?"":Of+"transform "+t+" "+n+" 0s"}function br(e,t){var n=0,r=0;"object"==typeof t?(n=t.x,r=t.y):"y"===e.axis?r=t:n=t,e.element.style[If+"Transform"]=yr(n,r)}function Ar(e,t){function n(e,n){t.useFrameAnimation||(f=null,clearTimeout(p),p=setTimeout(function(){f&&(f=null,lib.animation.requestFrame(e))},n||400),f=e)}function r(e){if(!l.enabled)return!1;if(void 0!==e.isVertical){if(!("y"===l.axis&&e.isVertical||"x"===l.axis&&!e.isVertical))return!1;e.stopPropagation()}return!0}function o(e){if(r(e)){var o=mr(l)[l.axis],i=pr(l,o);if(i){var s=hr(l,o);if(t.useFrameAnimation){var c=s-o;(d=new lib.animation(400,lib.cubicbezier.ease,0,function(e,t){var n=(o+c*t).toFixed(2);br(l,n),vr(l,"scrolling")})).onend(a),d.play()}else{var u=s.toFixed(0);n(a,400),gr(l,"0.4s","ease"),br(l,u),lib.animation.requestFrame(function e(){v&&l.enabled&&(vr(l,"scrolling"),lib.animation.requestFrame(e))})}i>0?vr(l,"y"===l.axis?"pulldownend":"pullrightend"):i<0&&vr(l,"y"===l.axis?"pullupend":"pullleftend")}else v&&a()}}function i(e){y=!0;var r,o,i,s,c,u,f,p,h,g,b,A,w,_,x,E,C;if(s=mr(l)[l.axis],!pr(l,s)){r=e["velocity"+l.axis.toUpperCase()];var k=2,S=.0015;t.inertia&&Cf[t.inertia]&&(k=Cf[t.inertia][0],S=Cf[t.inertia][1]),r>k&&(r=k),r<-k&&(r=-k),o=S*(r/Math.abs(r)),i=(u=new lib.motion({v:r,a:-o})).t,c=s+u.s;var O=pr(l,c);if(O){cr("inertial calculation has exceeded the boundary",O),f=r,p=o,O>0?(g=l.minScrollOffset,A=1):(g=l.maxScrollOffset,A=-1),h=(b=new lib.motion({v:A*f,a:-A*p,s:Math.abs(g-s)})).t;var I=b.generateCubicBezier();_=(w=f-p*h)/Math.abs(w)*.03,x=(C=new lib.motion({v:w,a:-_})).t,E=g+C.s;C.generateCubicBezier();if(t.noBounce)if(cr("no bounce effect"),s!==g)if(t.useFrameAnimation){var j=g-s,T=lib.cubicbezier(I[0][0],I[0][1],I[1][0],I[1][1]);(d=new lib.animation(h.toFixed(0),T,0,function(e,t){mr(l,(s+j*t).toFixed(2)),vr(l,"scrolling",{afterFlick:!0})})).onend(a),d.play()}else{P=g.toFixed(0);n(a,1e3*(h/1e3).toFixed(2)),gr(l,(h/1e3).toFixed(2)+"s","cubic-bezier("+I+")"),br(l,P)}else a();else if(s!==E)if(cr("scroll for inertia","s="+E.toFixed(0),"t="+((h+x)/1e3).toFixed(2)),t.useFrameAnimation){var j=E-s,T=lib.cubicbezier.easeOut;(d=new lib.animation((h+x).toFixed(0),T,0,function(e,t){br(l,(s+j*t).toFixed(2)),vr(l,"scrolling",{afterFlick:!0})})).onend(function(){if(l.enabled){var e=g-E,t=lib.cubicbezier.ease;(d=new lib.animation(400,t,0,function(t,n){br(l,(E+e*n).toFixed(2)),vr(l,"scrolling",{afterFlick:!0})})).onend(a),d.play()}}),d.play()}else{P=E.toFixed(0);n(function(e){if(l.enabled)if(cr("inertial bounce","s="+g.toFixed(0),"t=400"),E!==g){var t=g.toFixed(0);gr(l,"0.4s","ease"),br(l,t),n(a,400)}else a()},1e3*((h+x)/1e3).toFixed(2)),gr(l,((h+x)/1e3).toFixed(2)+"s","ease-out"),br(l,P)}else a()}else{cr("inertial calculation hasn't exceeded the boundary");var L=u.generateCubicBezier();if(t.useFrameAnimation){var j=c-s,T=lib.cubicbezier(L[0][0],L[0][1],L[1][0],L[1][1]);(d=new lib.animation(i.toFixed(0),T,0,function(e,t){var n=(s+j*t).toFixed(2);br(l,n),vr(l,"scrolling",{afterFlick:!0})})).onend(a),d.play()}else{var P=c.toFixed(0);n(a,1e3*(i/1e3).toFixed(2)),gr(l,(i/1e3).toFixed(2)+"s","cubic-bezier("+L+")"),br(l,P)}}m=!0,t.useFrameAnimation||lib.animation.requestFrame(function e(){v&&m&&l.enabled&&(vr(l,"scrolling",{afterFlick:!0}),lib.animation.requestFrame(e))})}}function a(){l.enabled&&(y=!1,setTimeout(function(){!y&&v&&(v=!1,m=!1,t.useFrameAnimation?(d&&d.stop(),d=null):gr(l,"",""),vr(l,"scrollend"))},50))}var s=this,l=this;if(t=t||{},t.noBounce=!!t.noBounce,t.padding=t.padding||{},null==t.isPrevent?t.isPrevent=!0:t.isPrevent=!!t.isPrevent,null==t.isFixScrollendClick?t.isFixScrollendClick=!0:t.isFixScrollendClick=!!t.isFixScrollendClick,t.padding?(t.yPaddingTop=-t.padding.top||0,t.yPaddingBottom=-t.padding.bottom||0,t.xPaddingTop=-t.padding.left||0,t.xPaddingBottom=-t.padding.right||0):(t.yPaddingTop=0,t.yPaddingBottom=0,t.xPaddingTop=0,t.xPaddingBottom=0),t.direction=t.direction||"y",t.inertia=t.inertia||"normal",this.options=t,l.axis=t.direction,this.element=e,this.viewport=e.parentNode,this.plugins={},this.element.scrollId=setTimeout(function(){_f[l.element.scrollId+""]=l},1),this.viewport.addEventListener("touchstart",function(e){if(r(e))if(v&&a(),t.useFrameAnimation)d&&d.stop(),d=null;else{var n=mr(l);br(l,n),gr(l,"",""),f=null,clearTimeout(p)}},!1),this.viewport.addEventListener("touchend",o,!1),this.viewport.addEventListener("touchcancel",o,!1),this.viewport.addEventListener("panstart",function(e){r(e)&&(l.transformOffset=mr(l),l.minScrollOffset=dr(l),l.maxScrollOffset=fr(l),h=2.5,y=!0,v=!0,m=!1,vr(l,"scrollstart"),g=e["displacement"+l.axis.toUpperCase()])},!1),this.viewport.addEventListener("panmove",function(e){if(r(e)){var t=e["displacement"+l.axis.toUpperCase()];if(Math.abs(t-g)<5)e.stopPropagation();else{g=t;var n=l.transformOffset[l.axis]+t;n>l.minScrollOffset?(n=l.minScrollOffset+(n-l.minScrollOffset)/h,h*=1.003):n<l.maxScrollOffset&&(n=l.maxScrollOffset-(l.maxScrollOffset-n)/h,h*=1.003),h>4&&(h=4);var o=pr(l,n);o&&(vr(l,o>0?"y"===l.axis?"pulldown":"pullright":"y"===l.axis?"pullup":"pullleft",{boundaryOffset:Math.abs(o)}),l.options.noBounce&&(n=hr(l,n))),br(l,n.toFixed(2)),vr(l,"scrolling")}}},!1),this.viewport.addEventListener("panend",function(e){r(e)&&e.isSwipe&&i(e)},!1),t.isPrevent&&(this.viewport.addEventListener("touchstart",function(e){Lf=!0},!1),l.viewport.addEventListener("touchend",function(e){Lf=!1},!1)),t.isFixScrollendClick){var c,u;this.viewport.addEventListener("scrolling",function(){c=!0,u&&clearTimeout(u),u=setTimeout(function(e){c=!1},400)},!1);this.viewport.addEventListener("click",function(e){return!c&&!v||(e.preventDefault(),e.stopPropagation(),!1)}),this.viewport.addEventListener("tap",function(e){c||v||setTimeout(function(){var t=document.createEvent("HTMLEvents");t.initEvent("niceclick",!0,!0),e.target.dispatchEvent(t)},300)})}if(t.useFrameAnimation){var d;Object.defineProperty(this,"animation",{get:function(){return d}})}else{var f,p=0;e.addEventListener(kf?"transitionend":If+"TransitionEnd",function(e){if(f){var t=f;f=null,clearTimeout(p),lib.animation.requestFrame(function(){t(e)})}},!1)}var h,v,m,y;Object.defineProperty(this,"isScrolling",{get:function(){return!!v}});var g,b={init:function(){return this.enable(),this.refresh(),this.scrollTo(0),this},enable:function(){return this.enabled=!0,this},disable:function(){var e=this.element;return this.enabled=!1,this.options.useFrameAnimation?d&&d.stop():lib.animation.requestFrame(function(){e.style[If+"Transform"]=getComputedStyle(e)[If+"Transform"]}),this},getScrollWidth:function(){return ur(this.element).width},getScrollHeight:function(){return ur(this.element).height},getScrollLeft:function(){return-mr(this).x-this.options.xPaddingTop},getScrollTop:function(){return-mr(this).y-this.options.yPaddingTop},getMaxScrollLeft:function(){return-l.maxScrollOffset-this.options.xPaddingTop},getMaxScrollTop:function(){return-l.maxScrollOffset-this.options.yPaddingTop},getBoundaryOffset:function(){return Math.abs(pr(this,mr(this)[this.axis])||0)},refresh:function(){function e(e,t){var n=t?["top","bottom"]:["left","right"];return parseFloat(getComputedStyle(e.firstElementChild)["margin-"+n[0]])+parseFloat(getComputedStyle(e.lastElementChild)["margin-"+n[1]])}var t,n=this.element,r="y"===this.axis,o=r?"height":"width";if(null!=this.options[o])t=this.options[o];else if(n.childElementCount<=0)n.style[o]="auto",t=null;else if(this.options.useElementRect)n.style[o]="auto",t=(a=ur(n))[o],t+=e(n,r);else{var i,a,s=n.firstElementChild,l=n.lastElementChild;if(document.createRange&&!this.options.ignoreOverflow&&((i=document.createRange()).selectNodeContents(n),a=ur(i)),a)t=a[o];else{for(;s&&0===ur(s)[o]&&s.nextElementSibling;)s=s.nextElementSibling;for(;l&&l!==s&&0===ur(l)[o]&&l.previousElementSibling;)l=l.previousElementSibling;t=ur(l)[r?"bottom":"right"]-ur(s)[r?"top":"left"]}t+=e(n,r)}return n.style[o]=t?t+"px":"auto",this.transformOffset=mr(this),this.minScrollOffset=dr(this),this.maxScrollOffset=fr(this),this.scrollTo(-this.transformOffset[this.axis]-this.options[this.axis+"PaddingTop"]),vr(this,"contentrefresh"),this},offset:function(e){var t=ur(this.element),n=ur(e);if("y"===this.axis)(r={top:n.top-t.top-this.options.yPaddingTop,left:n.left-t.left,right:t.right-n.right,width:n.width,height:n.height}).bottom=r.top+r.height;else{var r={top:n.top-t.top,bottom:t.bottom-n.bottom,left:n.left-t.left-this.options.xPaddingTop,width:n.width,height:n.height};r.right=r.left+r.width}return r},getRect:function(e){var t=ur(this.viewport),n=ur(e);if("y"===this.axis)(r={top:n.top-t.top,left:n.left-t.left,right:t.right-n.right,width:n.width,height:n.height}).bottom=r.top+r.height;else{var r={top:n.top-t.top,bottom:t.bottom-n.bottom,left:n.left-t.left,width:n.width,height:n.height};r.right=r.left+r.width}return r},isInView:function(e){var t=this.getRect(this.viewport),n=this.getRect(e);return"y"===this.axis?t.top<n.bottom&&t.bottom>n.top:t.left<n.right&&t.right>n.left},scrollTo:function(e,t){var r=this;this.element;if(e=-e-this.options[this.axis+"PaddingTop"],e=hr(this,e),v=!0,!0===t)if(this.options.useFrameAnimation){var o=mr(r)[this.axis],i=e-o;(d=new lib.animation(400,lib.cubicbezier.easeInOut,0,function(e,t){var n=(o+i*t).toFixed(2);br(r,n),vr(r,"scrolling")})).onend(a),d.play()}else{n(a,400),gr(r,"0.4s","ease-in-out"),br(r,e);function s(){v&&r.enabled&&(vr(r,"scrolling"),lib.animation.requestFrame(s))}lib.animation.requestFrame(s)}else this.options.useFrameAnimation||gr(r,"",""),br(r,e),a();return this},scrollToElement:function(e,t,n){var r=this.offset(e);return r=r["y"===this.axis?"top":"left"],n&&(r+=n),this.scrollTo(r,t)},getViewWidth:function(){return ur(this.viewport).width},getViewHeight:function(){return ur(this.viewport).height},addPulldownHandler:function(e){var t=this;return this.element.addEventListener("pulldownend",function(n){t.disable(),e.call(t,n,function(){t.scrollTo(0,!0),t.refresh(),t.enable()})},!1),this},addPullupHandler:function(e){var t=this;return this.element.addEventListener("pullupend",function(n){t.disable(),e.call(t,n,function(){t.scrollTo(t.getScrollHeight(),!0),t.refresh(),t.enable()})},!1),this},addScrollstartHandler:function(e){var t=this;return this.element.addEventListener("scrollstart",function(n){e.call(t,n)},!1),this},addScrollingHandler:function(e){var t=this;return this.element.addEventListener("scrolling",function(n){e.call(t,n)},!1),this},addScrollendHandler:function(e){var t=this;return this.element.addEventListener("scrollend",function(n){e.call(t,n)},!1),this},addContentrenfreshHandler:function(e){var t=this;this.element.addEventListener("contentrefresh",function(n){e.call(t,n)},!1)},addEventListener:function(e,t,n){var r=this;this.element.addEventListener(e,function(e){t.call(r,e)},!!n)},removeEventListener:function(e,t){var n=this;this.element.removeEventListener(e,function(e){t.call(n,e)})},enablePlugin:function(e,t){var n=xf[e];return n&&!this.plugins[e]&&(this.plugins[e]=!0,t=t||{},n.call(this,e,t)),this}};for(var A in b)s[A]=b[A]}function wr(e){e.renderendHandler||(e.renderendHandler=function(){e.scroller.refresh()}),window.addEventListener("renderend",e.renderendHandler)}function _r(e){e.renderendHandler&&window.removeEventListener("renderend",e.renderendHandler)}function xr(e){var t=e.Component;return{create:function(e){var n=lib.scroll,r=t.prototype.create.call(this,e);return r.classList.add("weex-container"),r.classList.add("scrollable-wrap"),this.scrollElement=document.createElement("div"),this.scrollElement.classList.add("weex-container"),this.scrollElement.classList.add("scrollable-element"),this.scrollElement.classList.add("dir-"+this.direction),this.scrollElement.style.webkitBoxOrient=Pf[this.direction][1],this.scrollElement.style.webkitFlexDirection=Pf[this.direction][0],this.scrollElement.style.flexDirection=Pf[this.direction][0],r.appendChild(this.scrollElement),this.scroller=new n({useElementRect:"v"===this.direction,scrollElement:this.scrollElement,direction:"h"===this.direction?"x":"y"}),this.scroller.init(),this.offset=0,r},createChildren:function(){var e=this,t=this.data.children,n=this.data.ref,r=this.getComponentManager();if(t&&t.length){for(var o=document.createDocumentFragment(),i=!1,a=0;a<t.length;a++){t[a].instanceId=e.data.instanceId;var s=r.createElement(t[a]);o.appendChild(s.node),s.parentRef=n,!i&&s.data.style&&s.data.style.hasOwnProperty("flex")&&(i=!0)}this.scrollElement.appendChild(o)}setTimeout(function(){this.scroller.refresh()}.bind(this),0)},appendChild:function(e){var t=this.data.children,n=this.getComponentManager().createElement(e);return this.scrollElement.appendChild(n.node),setTimeout(function(){this.scroller.refresh()}.bind(this),0),t&&t.length?t.push(e):this.data.children=[e],n},insertBefore:function(e,t){var n=this.data.children,r=0,o=!1;if(n&&n.length&&t){var i;for(i=n.length;r<i&&n[r].ref!==t.data.ref;r++);r===i&&(o=!0)}else o=!0;if(o)this.scrollElement.appendChild(e.node),n.push(e.data);else{var a=t.refreshPlaceholder||t.loadingPlaceholder;a?this.scrollElement.insertBefore(e.node,a):t.fixedPlaceholder?this.scrollElement.insertBefore(e.node,t.fixedPlaceholder):t.stickyPlaceholder?this.scrollElement.insertBefore(e.node,t.stickyPlaceholder):this.scrollElement.insertBefore(e.node,t.node),n.splice(r,0,e.data)}setTimeout(function(){this.scroller.refresh()}.bind(this),0)},removeChild:function(e){var t=this.data.children,n=0,r=this.getComponentManager();if(t&&t.length){var o;for(o=t.length;n<o&&t[n].ref!==e.data.ref;n++);n<o&&t.splice(n,1)}r.removeComponent(e.data.ref);var i=e.refreshPlaceholder||e.loadingPlaceholder;e.unsetPosition(),i&&this.scrollElement.removeChild(i),e.node.parentNode.removeChild(e.node),setTimeout(function(){this.scroller.refresh()}.bind(this),0)},bindEvents:function(e){t.prototype.bindEvents.call(this,e),this.scroller.addEventListener("scrolling",function(e){var t,n=e.scrollObj,r=n.getScrollTop(),o=n.getScrollLeft(),i="v"===this.direction?r:o;t=i-this.offset>=0?"v"===this.direction?"up":"left":"v"===this.direction?"down":"right",this.dispatchEvent("scroll",{originalType:"scrolling",scrollTop:n.getScrollTop(),scrollLeft:n.getScrollLeft(),offset:i,direction:t},{bubbles:!0}),this.offset=i;var a=Math.abs(n.maxScrollOffset)-this.offset;a<=this.loadmoreoffset&&this.isAvailableToFireloadmore?(this.isAvailableToFireloadmore=!1,this.dispatchEvent("loadmore")):a>this.loadmoreoffset&&!this.isAvailableToFireloadmore&&(this.isAvailableToFireloadmore=!0)}.bind(this))},onAppend:function(){wr(this)},onRemove:function(){_r(this)}}}function Er(e){return{create:function(){var t=e.prototype.create.call(this);return t.classList.add("list-wrap"),this.scrollElement.classList.add("list-element"),t},createChildren:function(){return(this.data.children||[]).forEach(function(e){var t=e.type;-1===Ff.indexOf(t)&&console.warn('[h5-render] invalid child type "'+t+'" for list.')}),e.prototype.createChildren.call(this)},appendChild:function(t){var n=t.type;return-1===Ff.indexOf(n)&&console.warn('[h5-render] invalid child type "'+n+'" for list.'),e.prototype.appendChild.call(this,t)},insertBefore:function(t,n){var r=t.data.type;return-1===Ff.indexOf(r)&&console.warn('[h5-render] invalid child type "'+r+'" for list.'),e.prototype.insertBefore.call(this,t,n)}}}function Cr(e,t){e.node.style.height=t+"px"}function kr(e,t){e.node.style.height=e.clamp+"px",e.dispatchEvent("refresh"),e.isRefreshing=!0}function Sr(e){e.display=!0,e.node.style.display="-webkit-box",e.node.style.display="-webkit-flex",e.node.style.display="flex"}function Or(e){e.display=!1,e.node.style.display="none",e.isRefreshing=!1}function Ir(e,t){e.node.style.height=t+"px"}function jr(e,t){e.node.style.height=e.clamp+"px",e.dispatchEvent("loading"),e.isLoading=!0}function Tr(e){e.display=!0,e.node.style.display="-webkit-box",e.node.style.display="-webkit-flex",e.node.style.display="flex"}function Lr(e){e.display=!1,e.node.style.display="none",e.isLoading=!1}function Pr(){return fp=(fp+1)%up,dp[fp]?Pr():fp}function Mr(e,t){var n=Pr(),r=Date.now();return dp[n]=lp(function o(){(dp[n]||0===dp[n])&&(Date.now()-r<t?dp[n]=lp(o):(delete dp[n],e()))}),n}function Nr(e){var t=dp[e];t&&cp(t),delete dp[e]}function Br(e){var t,n={x:0,y:0},r=getComputedStyle(e)[yp+"Transform"],o=new RegExp("^matrix3d\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)"),i=/^matrix\((?:[-\d.]+,\s*){4}([-\d.]+),\s*([-\d.]+)\)$/;return"none"!==r&&(t=r.match(o)||r.match(i))&&(n.x=parseFloat(t[1])||0,n.y=parseFloat(t[2])||0),n}function Rr(e,t){return e=parseFloat(e),t=parseFloat(t),0!=e&&(e+="px"),0!=t&&(t+="px"),wp?"translate3d("+e+", "+t+", 0)":"translate("+e+", "+t+")"}function Fr(e){return _p.call(e)}function Dr(e){function t(){e.isPageShow=!0,e.autoPlay&&!e.isDomRendering&&e.play()}function n(){e.isPageShow=!1,e.stop()}global.addEventListener("pageshow",t),global.addEventListener("pagehide",n),document.addEventListener("visibilitychange",function(){"visible"===document.visibilityState?t():"hidden"===document.visibilityState&&n()})}function Wr(e){global.addEventListener("renderend",function(){e.isDomRendering=!1,e.autoPlay&&e.isPageShow&&e.play()}),global.addEventListener("renderbegin",function(){e.isDomRendering=!0,e.stop()})}function $r(e){e.indicator&&e.indicator.setIndex(e.currentIndex)}function Qr(e){return e._sliderChangeHandler||(e._sliderChangeHandler=function(e){var t=this.carrousel.items.index;this.currentIndex=t,$r(this),this.dispatchEvent("change",{index:t})}.bind(e)),e._sliderChangeHandler}function Ur(e){e.createChildren(),e.onAppend()}function zr(e){var t=e.items.length;if(void 0!==e.index&&t>e.index)for(var n=0;n<t;n++){var r=e.items[n];e.index===n?(r.classList.add("active"),r.style.backgroundColor=e.itemSelectedColor):r.style.backgroundColor=e.itemColor}}function Vr(e,t,n){e.slider.slideTo(t)}function Hr(e){var t=e.node,n=document.createElement("span");n.className="fold-toggle iconfont",n.innerHTML="&#xe661;",t.appendChild(n),n.addEventListener("click",function(){e.unfolding?Yr(e):qr(e)})}function Gr(e){var t=document.createElement("div");t.className="tabheader-mask",e.mask=t,t.addEventListener("touchmove",function(e){e.preventDefault()}),t.addEventListener("click",function(){Yr(e)}),document.body.appendChild(t)}function qr(e){if(!e.flag){var t=document.createComment("tabheader");e.flag=t,e.node.parentNode.insertBefore(t,e.node)}e.mask||Gr(e),e._scrollVal=e._body.scrollLeft,e._topVal=e.node.getBoundingClientRect().top,e._styleTop=e.node.style.top,document.body.appendChild(e.node),e.node.classList.add("unfold-header"),e.node.style.height="auto";var n=e.node.getBoundingClientRect().height;n+e._topVal>window.innerHeight&&(e._topVal=e._topVal+(window.innerHeight-n-e._topVal)),e.node.style.top=e._topVal+"px",e.mask.classList.add("unfold-header"),e.mask.style.height=window.innerHeight+"px",e.unfolding=!0}function Yr(e){!0===e.unfolding&&(e.mask.classList.remove("unfold-header"),e.node.classList.remove("unfold-header"),e.node.style.height="",e.node.style.top=e._styleTop,e.flag.parentNode.insertBefore(e.node,e.flag),e._body.scrollLeft=e._scrollVal,Xr(e),e.unfolding=!1)}function Jr(e){Kr(e),Zr(e)}function Kr(e){e.box.addEventListener("click",function(t){var n=t.target;if("UL"!==n.nodeName){"LI"===n.parentNode.nodeName&&(n=n.parentNode);var r=n.getAttribute("data-floor");e.data.attr.selectedIndex!=r&&no(n,"select",{index:r})}})}function Zr(e){e.node.addEventListener("select",function(t){var n;void 0!==t.index?n=t.index:t.data&&void 0!==t.data.index&&(n=t.data.index),void 0!==n&&e.attr.selectedIndex.call(e,n)})}function Xr(e,t){if(!t){var n=e.data.attr;t=e.node.querySelector('[data-floor="'+n.selectedIndex+'"]')}if(t){var r=to(e._body.getBoundingClientRect(),t);eo(e._body,r)}}function eo(e,t,n){t&&(void 0===n&&(n=Math.abs(t)),n<=0||setTimeout(function(){t>0?e.scrollLeft+=2:e.scrollLeft-=2,eo(e,t,n-=2)}))}function to(e,t){var n,r=t.previousSibling,o=t.nextSibling;if(r){var i=r.getBoundingClientRect();if(i.left<e.left)return n=i.left}if(o){var a=o.getBoundingClientRect();if(a.right>e.right)return n=a.right-e.right}var s=t.getBoundingClientRect();return s.left<e.left?n=s.left:s.right>e.right&&(n=s.right-e.right),n}function no(e,t,n){var r=document.createEvent("Event");r.data=n;for(var o in n)n.hasOwnProperty(o)&&(r[o]=n[o]);r.initEvent(t,!0,!0),e.dispatchEvent(r)}function ro(e){return!!e&&("#"===e.charAt(0)&&7===e.length)}function oo(e,t){if(t){for(var n=["::-webkit-input-placeholder",":-moz-placeholder","::-moz-placeholder",":-ms-input-placeholder",":placeholder-shown"],r="",o="color: "+t+";",i=0,a=n.length;i<a;i++)r+="."+e.className+n[i]+"{"+o+"}";Bp(r,e.styleId,!0)}}function io(e){var t=e.Atomic;return{create:function(){var e=this,t=document.createElement("video");return t.classList.add("weex-video"),t.classList.add("weex-element"),t.controls=!0,t.autoplay=this.autoPlay,t.setAttribute("playsinline",""),t.setAttribute("webkit-playsinline",""),t.setAttribute("play-status",this.playStatus),this.node=t,this.autoPlay&&"play"===this.playStatus&&setTimeout(function(){e.play()},0),t},bindEvents:function(e){var n=this;t.prototype.bindEvents.call(this,e);var r={start:"play",finish:"ended",fail:"error"};for(var o in r)n.node.addEventListener(r[o],function(e,t){this.dispatchEvent(e,t.data)}.bind(n,o))},play:function(){var e=this.node.getAttribute("src");e||(e=this.node.getAttribute("data-src"))&&this.node.setAttribute("src",e);try{this.node.play()}catch(e){}},pause:function(){this.node.pause()},stop:function(){this.node.pause(),this.node.autoplay=!1,this.node.setAttribute("data-src",this.node.src),this.node.src=""}}}function ao(e,t){var n=[];for(var r in t)n.push(r+" "+t[r]);e.style.transition=n.join(", "),e.style.webkitTransition=n.join(", ")}function so(e){var t=Math.min(e.width,e.height),n=Math.max(e.width,e.height);e.node.style.width=n+"px",e.node.style.height=t+"px",e.node.style.borderRadius=t/2+"px",e.jack.style.width=e.jack.style.height=t+"px"}function lo(e,t){var n=e.checked,r=e.node,o=e.jack;t&&n?n=!1:t&&!n&&(n=!0),!0===n?(e.checked=!0,window.getComputedStyle?o.style.left=parseInt(window.getComputedStyle(r).width)-parseInt(window.getComputedStyle(o).width)+"px":o.style.left=parseInt(r.currentStyle.width)-parseInt(o.currentStyle.width)+"px",e.options.color&&uo(e),co(e)):(e.checked=!1,o.style.left=0,r.style.boxShadow="inset 0 0 0 0 "+e.options.secondaryColor,r.style.borderColor=e.options.secondaryColor,r.style.backgroundColor=e.options.secondaryColor!==eh.secondaryColor?e.options.secondaryColor:"#fff",o.style.backgroundColor=e.options.jackSecondaryColor!==e.options.jackColor?e.options.jackSecondaryColor:e.options.jackColor,co(e))}function co(e){var t={},n={"background-color":e.options.speed,left:e.options.speed.replace(/[a-z]/,"")/2+"s"};t=e.checked?{border:e.options.speed,"box-shadow":e.options.speed,"background-color":3*e.options.speed.replace(/[a-z]/,"")+"s"}:{border:e.options.speed,"box-shadow":e.options.speed},ao(e.node,t),ao(e.jack,n)}function uo(e){var t=e.node.offsetHeight/2;e.node.style.backgroundColor=e.options.color,e.node.style.borderColor=e.options.color,e.node.style.boxShadow="inset 0 0 0 "+t+"px "+e.options.color,e.jack.style.backgroundColor=e.options.jackColor}function fo(e){return e._clickHandler||(e._clickHandler=function(){lo(e,!0),e.dispatchEvent("change",{value:e.checked})}),e._clickHandler}function po(e){var t=e.Component;return{create:function(){var e=document.createElement("a");return e.classList.add("weex-container"),e.style.textDecoration="none",e},bindEvents:function(e){t.prototype.bindEvents.call(this,e),this.node.addEventListener("click",function(e){e._alreadyFired&&e.target!==this.node||(e._alreadyFired=!0,location.href=this.href)}.bind(this))}}}function ho(){return lh+Xp(10)}function vo(e){if(!e.styleSheet){var t,n,r,o,i=document.styleSheets;e:for(t=0,n=i.length;t<n;t++){var a=i[t].rules;if(a)for(r=0,o=a.length;r<o;r++){var s=a.item(r);if((s.type===CSSRule.KEYFRAMES_RULE||s.type===CSSRule.WEBKIT_KEYFRAMES_RULE)&&"weex-spinner"===s.name)break e}}e.styleSheet=i[t]}}function mo(e,t){vo(e);for(var n=yo(t),r=e.styleSheet.rules,o=0,i=r.length;o<i;o++){var a=r.item(o);if((a.type===CSSRule.KEYFRAMES_RULE||a.type===CSSRule.WEBKIT_KEYFRAMES_RULE)&&"weex-spinner"===a.name)for(var s=a.cssRules,l=0,c=s.length;l<c;l++){var u=s[l];u.type!==CSSRule.KEYFRAME_RULE&&u.type!==CSSRule.WEBKIT_KEYFRAME_RULE||(u.style.boxShadow=n[l])}}}function yo(e){if(e){for(var t=["0em -2.6em 0em 0em","1.8em -1.8em 0 0em","2.5em 0em 0 0em","1.75em 1.75em 0 0em","0em 2.5em 0 0em","-1.8em 1.8em 0 0em","-2.6em 0em 0 0em","-1.8em -1.8em 0 0em"],n=["1","0.2","0.2","0.2","0.2","0.2","0.5","0.7"].map(function(t){return"rgba("+e.r+","+e.g+","+e.b+","+t+")"}),r=[],o=0;o<t.length;o++)!function(e){var o=fh(n,e,"r");r.push(t.map(function(e,t){return e+" "+o[t]}).join(", "))}(o);return r}}function go(e,t){var n=t.data;if("string"==typeof n)try{n=JSON.parse(n)}catch(e){}if(n&&"weex"===n.type){if(!hh(n.content))return console.error("[h5-render] weex msg received by web component. msg.content should be a array:",n.content);callNative(e.getComponentManager().instanceId,n.content)}}function bo(e){var t=e.Atomic;return{create:function(){var e=document.createElement("div");return e.classList.add("weex-container"),this.web=document.createElement("iframe"),e.appendChild(this.web),this.web.classList.add("weex-element"),this.web.style.width="100%",this.web.style.height="100%",this.web.style.border="none",e},bindEvents:function(e){t.prototype.bindEvents.call(this,e);var n=this;this.web.addEventListener("load",function(e){n.dispatchEvent("pagefinish",{url:n.web.src})}),window.addEventListener("message",go.bind(null,this))},goBack:function(){this.web.contentWindow.history.back()},goForward:function(){this.web.contentWindow.history.forward()},reload:function(){this.web.contentWindow.location.reload()}}}function Ao(e){function t(){e.isPageShow=!0,e.autoPlay&&!e.isDomRendering&&e.play()}function n(){e.isPageShow=!1,e.stop()}global.addEventListener("pageshow",t),global.addEventListener("pagehide",n),document.addEventListener("visibilitychange",function(){"visible"===document.visibilityState?t():"hidden"===document.visibilityState&&n()})}function wo(e){global.addEventListener("renderend",function(){e.isDomRendering=!1,e.autoPlay&&e.isPageShow&&e.play()}),global.addEventListener("renderbegin",function(){e.isDomRendering=!0,e.stop()})}function _o(e,t,n){n.extra.width=n.style.width||e.width,n.extra.height=n.style.height||e.height;var r=e.getComponentManager().createElement(n);r.parentRef=e.data.ref,r.slider=e,e.indicator=r,t.appendChild(r.node)}function xo(e,t,n){setTimeout(function(){return _o(e,t,n)},0)}function Eo(e){e.indicator&&e.indicator.setIndex(e.currentIndex)}function Co(e,t,n){var r="all "+t+"ms "+n;e.style.webkitTransition=r,e.style.transition=r,setTimeout(function(){e.style.webkitTransition="",e.style.transition=""},t)}function ko(e,t,n,r){Co(e,n||kh,r||"ease");for(var o in t)e.style[o]=t[o]}function So(e,t){var n=e.slides[t].node;n.style.opacity=e.neighborAlpha;var r="scale("+e.neighborScale+")";n.style.webkitTransform=r,n.style.transform=r,n.style.width=e.width+"px",n.style.height=e.height+"px",n.style.position="absolute",n.style.top="0px",n.style.left="0px"}function Oo(e){function t(e){var t=e.getAttribute("img-src")||e.getAttribute("i-lazy-src");lib.img.applySrc(e,t,e.dataset.placeholder)}for(var n=e.node.querySelectorAll("[img-src]")||[],r=e.node.querySelectorAll("[i-lazy-src]")||[],o=0;o<n.length;o++)t(n[o]);for(var i=0;i<r.length;i++)t(r[i])}function Io(e){Oo(e),e.total=e.slides.length,e.currentIndex=0;var t=e.data.style.width||0,n=e.data.style.height||0;e.width=parseFloat(t)||e.node.getBoundingClientRect().width,e.height=parseFloat(n)||e.node.getBoundingClientRect().height;for(var r=e.slides.length,o=0;o<r;o++)So(e,o);setTimeout(function(){return e.slideTo(0)},0)}function jo(e){setTimeout(Io.bind(null,e),0)}function To(e,t){return 0===t?0:(t+e)%t}function Lo(e){var t=e.currentIndex+1;setTimeout(function(){return e.slideTo(t)},0),e.playTimer=setTimeout(function(){return Lo(e)},e.interval+kh)}function Po(e){var t,n,r=e.node;r.addEventListener("panstart",function(r){r.isVertical||(r.preventDefault(),r.stopPropagation(),e.stop(),n=!0,t=0)}),r.addEventListener("panmove",function(t){if(!t.isVertical&&n){t.preventDefault(),t.stopPropagation();var r=t.displacementX;Mo(e,r)}}),r.addEventListener("panend",function(r){!r.isVertical&&n&&(r.preventDefault(),r.stopPropagation(),t=r.displacementX,r.isSwipe?t<0?e.slideToNext():e.slideToPrev():Math.abs(t)<e.width/2?e.slideTo(e.currentIndex):t<0?e.slideToNext():e.slideToPrev(),n=!1,e.play())}),r.addEventListener("swipe",function(e){e.isVertical||(e.preventDefault(),e.stopPropagation())})}function Mo(e,t){var n="translate("+t+"px, 0px) scale("+Sh+")",r=e.mainSlide.node;r.style.webkitTransform=n,r.style.transform=n;var o="translate("+(e.leftTranslate+t)+"px, 0px) scale("+e.neighborScale+")",i=e.leftSlide.node;i.style.webkitTransform=o,i.style.transform=o;var a="translate("+(e.rightTranslate+t)+"px, 0px) scale("+e.neighborScale+")",s=e.rightSlide.node;s.style.webkitTransform=a,s.style.transform=a}function No(e,t){var n="translate("+({left:"-",right:""}[t]+e.width)+"px, 0px)",r=e[t+"Slide"].node;r.style.webkitTransform=n,r.style.transform=n}function Bo(e,t){t=t||[];for(var n=e.slides.length,r=0;r<n;r++)t.indexOf(r)<=-1&&(e.slides[r].node.style.opacity=0)}function Ro(e){return"Array"===Object.prototype.toString.call(e).slice(8,-1)}function Fo(e){return"Object"===Object.prototype.toString.call(e).slice(8,-1)}function Do(e,t,n){if(Ro(n))return n.forEach(function(n){return Do(e,t,n)});if(Fo(n)){var r=n.type,o=n.attr,i=n.style,a=n.children;delete n.children;var s=e.getComponentManager().createElement({type:Ph[r],ref:Nh(),attr:o,style:i});s.node.style.display=Lh[r],t.appendChild(s.node),Ro(a)&&a.forEach(function(e){return Do(s,s.node,e)})}}function Wo(e,t,n){var r=t.styles||{},o="all "+(t.duration||1e3)+"ms "+(t.timingFunction||"ease")+" "+(t.delay||0)+"ms",i=e.node,a=function(e){e.stopPropagation(),i.removeEventListener("webkitTransitionEnd",a),i.removeEventListener("transitionend",a),i.style.transition="",i.style.webkitTransition="",n()};i.style.transition=o,i.style.webkitTransition=o,i.addEventListener("webkitTransitionEnd",a),i.addEventListener("transitionend",a),e.updateStyle(r)}function $o(){var e=document.getElementById(Uh);return e||((e=document.createElement("input")).setAttribute("id",Uh),e.style.cssText="height:1px;width:1px;border:none;",document.body.appendChild(e)),e}function Qo(e){if(e)return Uo(e)}function Uo(e){for(var t in Qo.prototype)e[t]=Qo.prototype[t];return e}function zo(e){switch(qh(e)){case"object":n={};for(var t in e)e.hasOwnProperty(t)&&(n[t]=zo(e[t]));return n;case"array":for(var n=new Array(e.length),r=0,o=e.length;r<o;r++)n[r]=zo(e[r]);return n;case"regexp":var i="";return i+=e.multiline?"m":"",i+=e.global?"g":"",i+=e.ignoreCase?"i":"",new RegExp(e.source,i);case"date":return new Date(e.getTime());default:return e}}function Vo(e){if(!(this instanceof Vo))return new Vo(e);this._from=e,this.ease("linear"),this.duration(500)}function Ho(){return{top:window.pageYOffset||document.documentElement.scrollTop,left:window.pageXOffset||document.documentElement.scrollLeft}}function Go(){this.wrap=document.querySelector(kv),this.node=document.querySelector(Sv),this.wrap||this.createWrap(),this.node||this.createNode(),this.clearNode(),this.createNodeContent(),this.bindEvents()}function qo(e){this.msg=e.message||"",this.callback=e.callback,this.okTitle=e.okTitle||"OK",Iv.call(this),this.node.classList.add("amfe-alert")}function Yo(e){this.msg=e.message||"",this.callback=e.callback,this.okTitle=e.okTitle||"OK",this.cancelTitle=e.cancelTitle||"Cancel",Tv.call(this),this.node.classList.add("amfe-confirm")}function Jo(e){this.msg=e.message||"",this.defaultMsg=e.default||"",this.callback=e.callback,this.okTitle=e.okTitle||"OK",this.cancelTitle=e.cancelTitle||"Cancel",Pv.call(this),this.node.classList.add("amfe-prompt")}function Ko(e,t){var n=function(){Bv.removeEventListener("transitionend",n),Bv.removeEventListener("webkitTransitionEnd",n),t&&t()};Bv||((Bv=document.createElement("div")).classList.add(Dv,"hide"),document.body.appendChild(Bv)),Bv.textContent=e,Bv.addEventListener("transitionend",n),Bv.addEventListener("webkitTransitionEnd",n),setTimeout(function(){Bv.classList.remove("hide")},0)}function Zo(e){var t=function(){Bv.removeEventListener("transitionend",t),Bv.removeEventListener("webkitTransitionEnd",t),e&&e()};Bv&&(Bv.addEventListener("transitionend",t),Bv.addEventListener("webkitTransitionEnd",t),setTimeout(function(){Bv.classList.add("hide")},0))}function Xo(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function ei(e){switch(e.arrayFormat){case"index":return function(t,n,r){return null===n?[ni(t,e),"[",r,"]"].join(""):[ni(t,e),"[",ni(r,e),"]=",ni(n,e)].join("")};case"bracket":return function(t,n){return null===n?ni(t,e):[ni(t,e),"[]=",ni(n,e)].join("")};default:return function(t,n){return null===n?ni(t,e):[ni(t,e),"=",ni(n,e)].join("")}}}function ti(e){var t;switch(e.arrayFormat){case"index":return function(e,n,r){t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===r[e]&&(r[e]={}),r[e][t[1]]=n):r[e]=n};case"bracket":return function(e,n,r){t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==r[e]?r[e]=[].concat(r[e],n):r[e]=[n]:r[e]=n};default:return function(e,t,n){void 0!==n[e]?n[e]=[].concat(n[e],t):n[e]=t}}}function ni(e,t){return t.encode?t.strict?dm(e):encodeURIComponent(e):e}function ri(e){return Array.isArray(e)?e.sort():"object"==typeof e?ri(Object.keys(e)).sort(function(e,t){return Number(e)-Number(t)}).map(function(t){return e[t]}):e}function oi(e,t,n){var r,o="jsonp_"+ ++hm;e.url||console.error("[h5-render] config.url should be set in _jsonp for 'fetch' API."),global[o]=function(e){return function(n){t({status:200,ok:!0,statusText:"OK",data:n}),delete global[e]}}(o);var i=document.createElement("script");try{r=lib.httpurl(e.url)}catch(t){console.error("[h5-render] invalid config.url in _jsonp for 'fetch' API: "+e.url)}r.params.callback=o,i.type="text/javascript",i.src=r.toString(),i.onerror=function(e){return function(n){console.error("[h5-render] unexpected error in _jsonp for 'fetch' API",n),t({status:vm,ok:!1,statusText:"",data:""}),delete global[e]}}(o),document.getElementsByTagName("head")[0].insertBefore(i,null)}function ii(e,t,n){var r=new XMLHttpRequest;r.responseType=e.type,r.open(e.method,e.url,!0),!0===e.withCredentials&&(r.withCredentials=!0);var o=e.headers||{};for(var i in o)r.setRequestHeader(i,o[i]);r.onload=function(e){t({status:r.status,ok:r.status>=200&&r.status<300,statusText:r.statusText,data:r.response,headers:r.getAllResponseHeaders().split("\n").reduce(function(e,t){var n=t.match(/(.+): (.+)/);return n&&(e[n[1]]=n[2]),e},{})})},n&&(r.onprogress=function(e){n({readyState:r.readyState,status:r.status,length:e.loaded,total:e.total,statusText:r.statusText,headers:r.getAllResponseHeaders().split("\n").reduce(function(e,t){var n=t.match(/(.+): (.+)/);return n&&(e[n[1]]=n[2]),e},{})})}),r.onerror=function(e){console.error("[h5-render] unexpected error in _xhr for 'fetch' API",e),t({status:vm,ok:!1,statusText:"",data:""})},r.send(e.body||null)}e("* {\n  margin: 0;\n  padding: 0;\n  text-size-adjust: none;\n}\n\nul, ol {\n  list-style: none;\n}\n\n.weex-container {\n  box-sizing: border-box;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-flex-shrink: 0;\n  flex-shrink: 0;\n  -webkit-flex-grow: 0;\n  flex-grow: 0;\n  -webkit-flex-basis: auto;\n  flex-basis: auto;\n  align-items: stretch;\n  box-align: stretch;\n  align-content: flex-start;\n  position: relative;\n  border: 0 solid black;\n  margin: 0;\n  padding: 0;\n  min-width: 0;\n}\n\n.weex-element {\n  box-sizing: border-box;\n  position: relative;\n  -webkit-flex-shrink: 0;\n  flex-shrink: 0;\n  -webkit-flex-grow: 0;\n  flex-grow: 0;\n  -webkit-flex-basis: auto;\n  flex-basis: auto;\n  border: 0 solid black;\n  margin: 0;\n  padding: 0;\n  min-width: 0;\n}\n",void 0);var ai={browser:"0.5.0",framework:"0.21.9","vue-render":"0.12.3",transformer:">=0.1.5 <0.5"};Array.from||(Array.from=function(){var e=Object.prototype.toString,t=function(t){return"function"==typeof t||"[object Function]"===e.call(t)},n=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(t>0?1:-1)*Math.floor(Math.abs(t)):t},r=Math.pow(2,53)-1,o=function(e){var t=n(e);return Math.min(Math.max(t,0),r)};return function(e){var n=this,r=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var i,a=arguments.length>1?arguments[1]:void 0;if(void 0!==a){if(!t(a))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(i=arguments[2])}for(var s,l=o(r.length),c=t(n)?Object(new n(l)):new Array(l),u=0;u<l;)s=r[u],c[u]=a?void 0===i?a(s,u):a.call(i,s,u):s,u+=1;return c.length=l,c}}());var si="undefined"!=typeof window?window:void 0!==global?global:"undefined"!=typeof self?self:{},li=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)}),ci=n(function(e){var t=e.exports={version:"2.5.0"};"number"==typeof __e&&(__e=t)}),ui=function(e){return"object"==typeof e?null!==e:"function"==typeof e},di=ui,fi=function(e){if(!di(e))throw TypeError(e+" is not an object!");return e},pi=function(e){try{return!!e()}catch(e){return!0}},hi=!pi(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),vi=ui,mi=li.document,yi=vi(mi)&&vi(mi.createElement),gi=function(e){return yi?mi.createElement(e):{}},bi=!hi&&!pi(function(){return 7!=Object.defineProperty(gi("div"),"a",{get:function(){return 7}}).a}),Ai=ui,wi=fi,_i=bi,xi=function(e,t){if(!Ai(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!Ai(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!Ai(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!Ai(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},Ei=Object.defineProperty,Ci={f:hi?Object.defineProperty:function(e,t,n){if(wi(e),t=xi(t,!0),wi(n),_i)try{return Ei(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}},ki=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Si=Ci,Oi=ki,Ii=hi?function(e,t,n){return Si.f(e,t,Oi(1,n))}:function(e,t,n){return e[t]=n,e},ji={}.hasOwnProperty,Ti=function(e,t){return ji.call(e,t)},Li=0,Pi=Math.random(),Mi=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++Li+Pi).toString(36))},Ni=n(function(e){var t=li,n=Ii,r=Ti,o=Mi("src"),i=Function.toString,a=(""+i).split("toString");ci.inspectSource=function(e){return i.call(e)},(e.exports=function(e,i,s,l){var c="function"==typeof s;c&&(r(s,"name")||n(s,"name",i)),e[i]!==s&&(c&&(r(s,o)||n(s,o,e[i]?""+e[i]:a.join(String(i)))),e===t?e[i]=s:l?e[i]?e[i]=s:n(e,i,s):(delete e[i],n(e,i,s)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||i.call(this)})}),Bi=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},Ri=Bi,Fi=function(e,t,n){if(Ri(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}},Di=li,Wi=ci,$i=Ii,Qi=Ni,Ui=Fi,zi=function(e,t,n){var r,o,i,a,s=e&zi.F,l=e&zi.G,c=e&zi.S,u=e&zi.P,d=e&zi.B,f=l?Di:c?Di[t]||(Di[t]={}):(Di[t]||{}).prototype,p=l?Wi:Wi[t]||(Wi[t]={}),h=p.prototype||(p.prototype={});l&&(n=t);for(r in n)i=((o=!s&&f&&void 0!==f[r])?f:n)[r],a=d&&o?Ui(i,Di):u&&"function"==typeof i?Ui(Function.call,i):i,f&&Qi(f,r,i,e&zi.U),p[r]!=i&&$i(p,r,a),u&&h[r]!=i&&(h[r]=i)};Di.core=Wi,zi.F=1,zi.G=2,zi.S=4,zi.P=8,zi.B=16,zi.W=32,zi.U=64,zi.R=128;var Vi=zi,Hi={}.toString,Gi=function(e){return Hi.call(e).slice(8,-1)},qi=Gi,Yi=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==qi(e)?e.split(""):Object(e)},Ji=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e},Ki=Yi,Zi=Ji,Xi=function(e){return Ki(Zi(e))},ea=Math.ceil,ta=Math.floor,na=function(e){return isNaN(e=+e)?0:(e>0?ta:ea)(e)},ra=na,oa=Math.min,ia=function(e){return e>0?oa(ra(e),9007199254740991):0},aa=na,sa=Math.max,la=Math.min,ca=Xi,ua=ia,da=function(e,t){return(e=aa(e))<0?sa(e+t,0):la(e,t)},fa=li,pa=fa["__core-js_shared__"]||(fa["__core-js_shared__"]={}),ha=function(e){return pa[e]||(pa[e]={})},va=ha("keys"),ma=Mi,ya=function(e){return va[e]||(va[e]=ma(e))},ga=Ti,ba=Xi,Aa=function(e){return function(t,n,r){var o,i=ca(t),a=ua(i.length),s=da(r,a);if(e&&n!=n){for(;a>s;)if((o=i[s++])!=o)return!0}else for(;a>s;s++)if((e||s in i)&&i[s]===n)return e||s||0;return!e&&-1}}(!1),wa=ya("IE_PROTO"),_a="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),xa=function(e,t){var n,r=ba(e),o=0,i=[];for(n in r)n!=wa&&ga(r,n)&&i.push(n);for(;t.length>o;)ga(r,n=t[o++])&&(~Aa(i,n)||i.push(n));return i},Ea=_a,Ca=Object.keys||function(e){return xa(e,Ea)},ka=Ji,Sa=function(e){return Object(ka(e))},Oa=Ca,Ia={f:Object.getOwnPropertySymbols},ja={f:{}.propertyIsEnumerable},Ta=Sa,La=Yi,Pa=Object.assign,Ma=!Pa||pi(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=Pa({},e)[n]||Object.keys(Pa({},t)).join("")!=r})?function(e,t){for(var n=arguments,r=Ta(e),o=arguments.length,i=1,a=Ia.f,s=ja.f;o>i;)for(var l,c=La(n[i++]),u=a?Oa(c).concat(a(c)):Oa(c),d=u.length,f=0;d>f;)s.call(c,l=u[f++])&&(r[l]=c[l]);return r}:Pa,Na=Vi;Na(Na.S+Na.F,"Object",{assign:Ma}),Object.setPrototypeOf||(Object.setPrototypeOf=function(e,t){function n(e,t){return r.call(e,t),e}var r;try{(r=e.getOwnPropertyDescriptor(e.prototype,"__proto__").set).call({},null)}catch(t){if(e.prototype!=={}.__proto__||void 0==={__proto__:null}.__proto__)return;r=function(e){this.__proto__=e},n.polyfill=n(n({},null),e.prototype)instanceof e}return n}(Object));var Ba=si.WXEnvironment;Ba&&"iOS"===Ba.platform&&(si.Promise=void 0);var Ra=n(function(e){var t=ha("wks"),n=Mi,r=li.Symbol,o="function"==typeof r;(e.exports=function(e){return t[e]||(t[e]=o&&r[e]||(o?r:n)("Symbol."+e))}).store=t}),Fa=Gi,Da=Ra("toStringTag"),Wa="Arguments"==Fa(function(){return arguments}()),$a=function(e,t){try{return e[t]}catch(e){}},Qa=function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=$a(t=Object(e),Da))?n:Wa?Fa(t):"Object"==(r=Fa(t))&&"function"==typeof t.callee?"Arguments":r},Ua=Qa,za={};za[Ra("toStringTag")]="z",za+""!="[object z]"&&Ni(Object.prototype,"toString",function(){return"[object "+Ua(this)+"]"},!0);var Va=na,Ha=Ji,Ga={},qa=Ci,Ya=fi,Ja=Ca,Ka=hi?Object.defineProperties:function(e,t){Ya(e);for(var n,r=Ja(t),o=r.length,i=0;o>i;)qa.f(e,n=r[i++],t[n]);return e},Za=li.document,Xa=Za&&Za.documentElement,es=fi,ts=Ka,ns=_a,rs=ya("IE_PROTO"),os=function(){},is=function(){var e,t=gi("iframe"),n=ns.length;for(t.style.display="none",Xa.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),is=e.F;n--;)delete is.prototype[ns[n]];return is()},as=Object.create||function(e,t){var n;return null!==e?(os.prototype=es(e),n=new os,os.prototype=null,n[rs]=e):n=is(),void 0===t?n:ts(n,t)},ss=Ci.f,ls=Ti,cs=Ra("toStringTag"),us=function(e,t,n){e&&!ls(e=n?e:e.prototype,cs)&&ss(e,cs,{configurable:!0,value:t})},ds=as,fs=ki,ps=us,hs={};Ii(hs,Ra("iterator"),function(){return this});var vs=Ti,ms=Sa,ys=ya("IE_PROTO"),gs=Object.prototype,bs=Object.getPrototypeOf||function(e){return e=ms(e),vs(e,ys)?e[ys]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?gs:null},As=Vi,ws=Ni,_s=Ii,xs=Ti,Es=Ga,Cs=function(e,t,n){e.prototype=ds(hs,{next:fs(1,n)}),ps(e,t+" Iterator")},ks=us,Ss=bs,Os=Ra("iterator"),Is=!([].keys&&"next"in[].keys()),js=function(){return this},Ts=function(e,t,n,r,o,i,a){Cs(n,t,r);var s,l,c,u=function(e){if(!Is&&e in h)return h[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},d=t+" Iterator",f="values"==o,p=!1,h=e.prototype,v=h[Os]||h["@@iterator"]||o&&h[o],m=v||u(o),y=o?f?u("entries"):m:void 0,g="Array"==t?h.entries||v:v;if(g&&(c=Ss(g.call(new e)))!==Object.prototype&&c.next&&(ks(c,d,!0),xs(c,Os)||_s(c,Os,js)),f&&v&&"values"!==v.name&&(p=!0,m=function(){return v.call(this)}),(Is||p||!h[Os])&&_s(h,Os,m),Es[t]=m,Es[d]=js,o)if(s={values:f?m:u("values"),keys:i?m:u("keys"),entries:y},a)for(l in s)l in h||ws(h,l,s[l]);else As(As.P+As.F*(Is||p),t,s);return s},Ls=function(e){return function(t,n){var r,o,i=String(Ha(t)),a=Va(n),s=i.length;return a<0||a>=s?e?"":void 0:(r=i.charCodeAt(a))<55296||r>56319||a+1===s||(o=i.charCodeAt(a+1))<56320||o>57343?e?i.charAt(a):r:e?i.slice(a,a+2):o-56320+(r-55296<<10)+65536}}(!0);Ts(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=Ls(t,n),this._i+=e.length,{value:e,done:!1})});var Ps=Ra("unscopables"),Ms=Array.prototype;void 0==Ms[Ps]&&Ii(Ms,Ps,{});var Ns=function(e){Ms[Ps][e]=!0},Bs=function(e,t){return{value:t,done:!!e}},Rs=Ga,Fs=Xi,Ds=Ts(Array,"Array",function(e,t){this._t=Fs(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,Bs(1)):"keys"==t?Bs(0,n):"values"==t?Bs(0,e[n]):Bs(0,[n,e[n]])},"values");Rs.Arguments=Rs.Array,Ns("keys"),Ns("values"),Ns("entries");for(var Ws=Ds,$s=Ca,Qs=Ni,Us=li,zs=Ii,Vs=Ga,Hs=Ra,Gs=Hs("iterator"),qs=Hs("toStringTag"),Ys=Vs.Array,Js={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},Ks=$s(Js),Zs=0;Zs<Ks.length;Zs++){var Xs,el=Ks[Zs],tl=Js[el],nl=Us[el],rl=nl&&nl.prototype;if(rl&&(rl[Gs]||zs(rl,Gs,Ys),rl[qs]||zs(rl,qs,el),Vs[el]=Ys,tl))for(Xs in Ws)rl[Xs]||Qs(rl,Xs,Ws[Xs],!0)}var ol,il,al,sl=fi,ll=function(e,t,n,r){try{return r?t(sl(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&sl(o.call(e)),t}},cl=Ga,ul=Ra("iterator"),dl=Array.prototype,fl=function(e){return void 0!==e&&(cl.Array===e||dl[ul]===e)},pl=Qa,hl=Ra("iterator"),vl=Ga,ml=ci.getIteratorMethod=function(e){if(void 0!=e)return e[hl]||e["@@iterator"]||vl[pl(e)]},yl=n(function(e){var t=Fi,n=ll,r=fl,o=fi,i=ia,a=ml,s={},l={},c=e.exports=function(e,c,u,d,f){var p,h,v,m,y=f?function(){return e}:a(e),g=t(u,d,c?2:1),b=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(r(y)){for(p=i(e.length);p>b;b++)if((m=c?g(o(h=e[b])[0],h[1]):g(e[b]))===s||m===l)return m}else for(v=y.call(e);!(h=v.next()).done;)if((m=n(v,g,h.value,c))===s||m===l)return m};c.BREAK=s,c.RETURN=l}),gl=fi,bl=Bi,Al=Ra("species"),wl=Fi,_l=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])}return e.apply(n,t)},xl=Xa,El=gi,Cl=li,kl=Cl.process,Sl=Cl.setImmediate,Ol=Cl.clearImmediate,Il=Cl.MessageChannel,jl=Cl.Dispatch,Tl=0,Ll={},Pl=function(){var e=+this;if(Ll.hasOwnProperty(e)){var t=Ll[e];delete Ll[e],t()}},Ml=function(e){Pl.call(e.data)};Sl&&Ol||(Sl=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return Ll[++Tl]=function(){_l("function"==typeof e?e:Function(e),n)},ol(Tl),Tl},Ol=function(e){delete Ll[e]},"process"==Gi(kl)?ol=function(e){kl.nextTick(wl(Pl,e,1))}:jl&&jl.now?ol=function(e){jl.now(wl(Pl,e,1))}:Il?(al=(il=new Il).port2,il.port1.onmessage=Ml,ol=wl(al.postMessage,al,1)):Cl.addEventListener&&"function"==typeof postMessage&&!Cl.importScripts?(ol=function(e){Cl.postMessage(e+"","*")},Cl.addEventListener("message",Ml,!1)):ol="onreadystatechange"in El("script")?function(e){xl.appendChild(El("script")).onreadystatechange=function(){xl.removeChild(this),Pl.call(e)}}:function(e){setTimeout(wl(Pl,e,1),0)});var Nl={set:Sl,clear:Ol},Bl=li,Rl=Nl.set,Fl=Bl.MutationObserver||Bl.WebKitMutationObserver,Dl=Bl.process,Wl=Bl.Promise,$l="process"==Gi(Dl),Ql=Bi,Ul={f:function(e){return new r(e)}},zl=Ul,Vl=Ni,Hl=li,Gl=Ci,ql=hi,Yl=Ra("species"),Jl=Ra("iterator"),Kl=!1;try{var Zl=[7][Jl]();Zl.return=function(){Kl=!0},Array.from(Zl,function(){throw 2})}catch(e){}var Xl,ec,tc,nc=li,rc=Fi,oc=Qa,ic=Vi,ac=ui,sc=Bi,lc=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e},cc=yl,uc=function(e,t){var n,r=gl(e).constructor;return void 0===r||void 0==(n=gl(r)[Al])?t:bl(n)},dc=Nl.set,fc=function(){var e,t,n,r=function(){var r,o;for($l&&(r=Dl.domain)&&r.exit();e;){o=e.fn,e=e.next;try{o()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if($l)n=function(){Dl.nextTick(r)};else if(Fl){var o=!0,i=document.createTextNode("");new Fl(r).observe(i,{characterData:!0}),n=function(){i.data=o=!o}}else if(Wl&&Wl.resolve){var a=Wl.resolve();n=function(){a.then(r)}}else n=function(){Rl.call(Bl,r)};return function(r){var o={fn:r,next:void 0};t&&(t.next=o),e||(e=o,n()),t=o}}(),pc=Ul,hc=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},vc=function(e,t){var n=zl.f(e);return(0,n.resolve)(t),n.promise},mc=nc.TypeError,yc=nc.process,gc=nc.Promise,bc="process"==oc(yc),Ac=function(){},wc=ec=pc.f,_c=!!function(){try{var e=gc.resolve(1),t=(e.constructor={})[Ra("species")]=function(e){e(Ac,Ac)};return(bc||"function"==typeof PromiseRejectionEvent)&&e.then(Ac)instanceof t}catch(e){}}(),xc=function(e,t){return e===t},Ec=function(e){var t;return!(!ac(e)||"function"!=typeof(t=e.then))&&t},Cc=function(e,t){if(!e._n){e._n=!0;var n=e._c;fc(function(){for(var r=e._v,o=1==e._s,i=0;n.length>i;)!function(t){var n,i,a=o?t.ok:t.fail,s=t.resolve,l=t.reject,c=t.domain;try{a?(o||(2==e._h&&Oc(e),e._h=1),!0===a?n=r:(c&&c.enter(),n=a(r),c&&c.exit()),n===t.promise?l(mc("Promise-chain cycle")):(i=Ec(n))?i.call(n,s,l):s(n)):l(r)}catch(e){l(e)}}(n[i++]);e._c=[],e._n=!1,t&&!e._h&&kc(e)})}},kc=function(e){dc.call(nc,function(){var t,n,r,o=e._v,i=Sc(e);if(i&&(t=hc(function(){bc?yc.emit("unhandledRejection",o,e):(n=nc.onunhandledrejection)?n({promise:e,reason:o}):(r=nc.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=bc||Sc(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},Sc=function(e){if(1==e._h)return!1;for(var t,n=e._a||e._c,r=0;n.length>r;)if((t=n[r++]).fail||!Sc(t.promise))return!1;return!0},Oc=function(e){dc.call(nc,function(){var t;bc?yc.emit("rejectionHandled",e):(t=nc.onrejectionhandled)&&t({promise:e,reason:e._v})})},Ic=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()),Cc(t,!0))},jc=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw mc("Promise can't be resolved itself");(t=Ec(e))?fc(function(){var r={_w:n,_d:!1};try{t.call(e,rc(jc,r,1),rc(Ic,r,1))}catch(e){Ic.call(r,e)}}):(n._v=e,n._s=1,Cc(n,!1))}catch(e){Ic.call({_w:n,_d:!1},e)}}};_c||(gc=function(e){lc(this,gc,"Promise","_h"),sc(e),Xl.call(this);try{e(rc(jc,this,1),rc(Ic,this,1))}catch(e){Ic.call(this,e)}},(Xl=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)Vl(e,r,t[r],n);return e}(gc.prototype,{then:function(e,t){var n=wc(uc(this,gc));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=bc?yc.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&Cc(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),tc=function(){var e=new Xl;this.promise=e,this.resolve=rc(jc,e,1),this.reject=rc(Ic,e,1)},pc.f=wc=function(e){return xc(gc,e)?new tc(e):ec(e)}),ic(ic.G+ic.W+ic.F*!_c,{Promise:gc}),us(gc,"Promise"),function(e){var t=Hl[e];ql&&t&&!t[Yl]&&Gl.f(t,Yl,{configurable:!0,get:function(){return this}})}("Promise"),ci.Promise,ic(ic.S+ic.F*!_c,"Promise",{reject:function(e){var t=wc(this);return(0,t.reject)(e),t.promise}}),ic(ic.S+ic.F*!_c,"Promise",{resolve:function(e){return e instanceof gc&&xc(e.constructor,this)?e:vc(this,e)}}),ic(ic.S+ic.F*!(_c&&function(e,t){if(!t&&!Kl)return!1;var n=!1;try{var r=[7],o=r[Jl]();o.next=function(){return{done:n=!0}},r[Jl]=function(){return o},e(r)}catch(e){}return n}(function(e){gc.all(e).catch(Ac)})),"Promise",{all:function(e){var t=this,n=wc(t),r=n.resolve,o=n.reject,i=hc(function(){var n=[],i=0,a=1;cc(e,!1,function(e){var s=i++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||r(n))},o)}),--a||r(n)});return i.e&&o(i.v),n.promise},race:function(e){var t=this,n=wc(t),r=n.reject,o=hc(function(){cc(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var Tc=["off","error","warn","info","log","debug"],Lc={},Pc=global.console,Mc=global.setTimeout,Nc=global.setTimeoutNative;s();var Bc=1,Rc=function(e){this.instanceId=e,this.lastCallbackId=0,this.callbacks={}};Rc.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},Rc.prototype.remove=function(e){var t=this.callbacks[e];return delete this.callbacks[e],t},Rc.prototype.consume=function(e,t,n){var r=this.callbacks[e];return void 0!==n&&!1!==n||delete this.callbacks[e],"function"==typeof r?r(y(t)):new Error('invalid callback id "'+e+'"')},Rc.prototype.close=function(){this.callbacks={}};var Fc={},Dc=function(){this.nodeId=f(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};Dc.prototype.destroy=function(){var e=b(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var Wc,$c={},Qc=/\[\[((?:.|\n)+?)\]\]/g,Uc="div",zc=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"],Vc=function(e){function t(t,n,r){void 0===t&&(t=Uc),e.call(this);var o=L(t);if(o&&!r)return new o(n);n=n||{},this.nodeType=1,this.nodeId=f(),this.ref=this.nodeId,this.type=t,this.attr=n.attr||{},this.style=n.style||{},this.classStyle=n.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.appendChild=function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(I(e,this.children,this.children.length,!0),1===e.nodeType){var t=I(e,this.pureChildren,this.pureChildren.length),n=w(this.docId);if(n&&t>=0)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(C(e,this),O(e,this.children,this.children.length,!0),this.docId&&B(this.docId,e),1===e.nodeType){O(e,this.pureChildren,this.pureChildren.length);var r=w(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},t.prototype.insertBefore=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(I(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=k(t),r=I(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=w(this.docId);if(o&&r>=0)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(C(e,this),O(e,this.children,this.children.indexOf(t),!0),this.docId&&B(this.docId,e),1===e.nodeType){var i=k(t),a=O(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=w(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},t.prototype.insertAfter=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(I(e,this.children,this.children.indexOf(t)+1,!0),1===e.nodeType){var n=I(e,this.pureChildren,this.pureChildren.indexOf(S(t))+1),r=w(this.docId);if(r&&n>=0)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(C(e,this),O(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&B(this.docId,e),1===e.nodeType){var o=O(e,this.pureChildren,this.pureChildren.indexOf(S(t))+1),i=w(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},t.prototype.removeChild=function(e,t){if(e.parentNode&&(j(e,this.children,!0),1===e.nodeType)){j(e,this.pureChildren);var n=w(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},t.prototype.clear=function(){var e=w(this.docId);e&&this.pureChildren.forEach(function(t){e.send("dom",{action:"removeElement"},[t.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},t.prototype.setAttr=function(e,t,n){if(this.attr[e]!==t||!1===n){this.attr[e]=t;var r=w(this.docId);if(!n&&r){var o={};o[e]=N(t),r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},t.prototype.setStyle=function(e,t,n){if(this.style[e]!==t||!1===n){this.style[e]=t;var r=w(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},t.prototype.setClassStyle=function(e){var t=this;for(var n in this.classStyle)t.classStyle[n]="";Object.assign(this.classStyle,e);var r=w(this.docId);r&&r.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},t.prototype.addEvent=function(e,t){if(!this.event[e]){this.event[e]=t;var n=w(this.docId);n&&n.send("dom",{action:"addEvent"},[this.ref,e])}},t.prototype.removeEvent=function(e){if(this.event[e]){delete this.event[e];var t=w(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},t.prototype.fireEvent=function(e,t,n){var r=null,o=!1,i=this.event[e];return i&&t&&(t.stopPropagation=function(){o=!0},r=i.call(this,t)),!o&&n&&zc.includes(e)&&this.parentNode&&this.parentNode.fireEvent&&(t.currentTarget=this.parentNode,this.parentNode.fireEvent(e,t,n)),r},t.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},t.prototype.toJSON=function(){var e={ref:this.ref.toString(),type:this.type,attr:N(this.attr),style:this.toStyle()},t=Object.keys(this.event);return t.length&&(e.event=t),this.pureChildren.length&&(e.children=this.pureChildren.map(function(e){return e.toJSON()})),e},t.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+">"},t}(Dc);!function(e){Wc=e}(Vc);var Hc=function(){},Gc=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:e}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new Rc(e)}),Hc=t||function(){}};Gc.prototype.callback=function(e,t,n){return this.callbackManager.consume(e,t,n)},Gc.prototype.destroyCallback=function(){return this.callbackManager.close()},Gc.prototype.normalize=function(e){var t=p(e);return e&&e instanceof Vc?e.ref:e&&e._isVue&&e.$el instanceof Vc?e.$el.ref:"Function"===t?this.callbackManager.add(e).toString():m(e)},Gc.prototype.send=function(e,t,n,r){var o=this,i=t.action,a=t.component,s=t.ref,l=t.module,c=t.method;switch(n=n.map(function(e){return o.normalize(e)}),e){case"dom":return this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,s,c,n,Object.assign({component:a},r));default:return this.moduleHandler(this.instanceId,l,c,n,r)}},Gc.prototype.callDOM=function(e,t){return this[e](this.instanceId,t)},Gc.prototype.callComponent=function(e,t,n,r){return this.componentHandler(this.instanceId,e,t,n,r)},Gc.prototype.callModule=function(e,t,n,r){return this.moduleHandler(this.instanceId,e,t,n,r)};var qc,Yc,Jc=[],Kc=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/,Zc={},Xc={createInstance:function(e,t,n,r){if(Zc[e])return new Error('invalid instance id "'+e+'"');var o=Q(t);(n=JSON.parse(JSON.stringify(n||{}))).env=JSON.parse(JSON.stringify(global.WXEnvironment||{}));var i={config:n,created:Date.now(),framework:o};i.services=U(e,i,Yc),Zc[e]=i;var a=qc[o];return a?a.createInstance(e,t,n,r,i):new Error('invalid bundle type "'+o+'".')},registerService:F,unregisterService:D},eu=function(e){function t(t){e.call(this),this.nodeType=8,this.nodeId=f(),this.ref=this.nodeId,this.type="comment",this.value=t,this.children=[],this.pureChildren=[]}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},t}(Dc),tu=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")};tu.prototype.createFinish=function(e){return(0,this.handler)([Y("createFinish")],e)},tu.prototype.updateFinish=function(e){return(0,this.handler)([Y("updateFinish")],e)},tu.prototype.refreshFinish=function(e){return(0,this.handler)([Y("refreshFinish")],e)},tu.prototype.createBody=function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[Y("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return Y("addElement",[t.ref,e,-1])})),this.addActions(r)},tu.prototype.addElement=function(e,t,n){return n>=0||(n=-1),this.addActions(Y("addElement",[t,e.toJSON(),n]))},tu.prototype.removeElement=function(e){if(Array.isArray(e)){var t=e.map(function(e){return Y("removeElement",[e])});return this.addActions(t)}return this.addActions(Y("removeElement",[e]))},tu.prototype.moveElement=function(e,t,n){return this.addActions(Y("moveElement",[e,t,n]))},tu.prototype.setAttr=function(e,t,n){var r={};return r[t]=n,this.addActions(Y("updateAttrs",[e,r]))},tu.prototype.setStyle=function(e,t,n){var r={};return r[t]=n,this.addActions(Y("updateStyle",[e,r]))},tu.prototype.setStyles=function(e,t){return this.addActions(Y("updateStyle",[e,t]))},tu.prototype.addEvent=function(e,t){return this.addActions(Y("addEvent",[e,t]))},tu.prototype.removeEvent=function(e,t){return this.addActions(Y("removeEvent",[e,t]))},tu.prototype.handler=function(e,t){return t&&t()},tu.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 nu={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"},ru=function e(t,n,r){t=t?t.toString():"",this.id=t,this.URL=n,g(t,this),this.nodeMap={};var o=e.Listener||tu;this.listener=new o(t,r||J(t,e.handler)),this.taskCenter=new Gc(t,r?function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return r.apply(void 0,t)}:e.handler),this.createDocumentElement()};ru.prototype.getRef=function(e){return this.nodeMap[e]},ru.prototype.open=function(){this.listener.batched=!1},ru.prototype.close=function(){this.listener.batched=!0},ru.prototype.createDocumentElement=function(){var e=this;if(!this.documentElement){var t=new Vc("document");t.docId=this.id,t.ownerDocument=this,t.role="documentElement",t.depth=0,t.ref="_documentElement",this.nodeMap._documentElement=t,this.documentElement=t,Object.defineProperty(t,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(t){_(e,t)}}),Object.defineProperty(t,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(t,n){_(e,t,n)}})}return this.documentElement},ru.prototype.createBody=function(e,t){return this.body||E(this,new Vc(e,t)),this.body},ru.prototype.createElement=function(e,t){return new Vc(e,t)},ru.prototype.createComment=function(e){return new eu(e)},ru.prototype.fireEvent=function(e,t,n,r){if(e){(n=n||{}).type=t,n.target=e,n.currentTarget=e,n.timestamp=Date.now(),r&&X(e,r);var o="true"===this.getRef("_root").attr.bubble;return e.fireEvent(t,n,o)}},ru.prototype.destroy=function(){this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,A(this.id)},ru.handler=null;var ou={Document:ru,Element:Vc,Comment:eu,Listener:tu,TaskCenter:Gc,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)}};ru.handler=ou.sendTasks;var iu,au={setNativeConsole:function(){if(o(),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("debug")&&global.nativeLog.apply(global,a(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("log")&&global.nativeLog.apply(global,a(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("info")&&global.nativeLog.apply(global,a(e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("warn")&&global.nativeLog.apply(global,a(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("error")&&global.nativeLog.apply(global,a(e).concat(["__ERROR"]))}};else{var e=console.debug,t=console.log,n=console.info,r=console.warn,s=console.error;console.__ori__={debug:e,log:t,info:n,warn:r,error:s},console.debug=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i("error")&&console.__ori__.error.apply(console,e)}}},resetNativeConsole:function(){Lc={},global.console=Pc},setNativeTimer:s,resetNativeTimer:function(){global.setTimeout=Mc,global.setTimeoutCallback=null},service:{register:F,unregister:D,has:W},freezePrototype:function(){l(),Object.freeze(ou.Element),Object.freeze(ou.Comment),Object.freeze(ou.Listener),Object.freeze(ou.Document.prototype),Object.freeze(ou.Element.prototype),Object.freeze(ou.Comment.prototype),Object.freeze(ou.Listener.prototype)},init:function(e){qc=(Yc=e||{}).frameworks||{},R();for(var t in qc)qc[t].init(e);return["registerComponents","registerModules","registerMethods"].forEach(V),["destroyInstance","refreshInstance","receiveTasks","getRoot"].forEach(G),q("receiveTasks","callJS"),Xc},config:ou},su={},lu={},cu=Object.freeze({init:function(e){su.Document=e.Document,su.Element=e.Element,su.Comment=e.Comment,su.sendTasks=e.sendTasks},createInstance:function(e,t,n,r,o){void 0===n&&(n={}),void 0===r&&(r={}),void 0===o&&(o={});var i=new su.Document(e,n.bundleUrl),a={},s={id:e,data:r,document:i,callbacks:a},l=0;i.addCallback=function(e){return l++,a[l]=e,l},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},lu[e]=s;var c=Object.assign({Document:su.Document,Element:su.Element,Comment:su.Comment,sendTasks:function(t){return su.sendTasks(e,t,-1)},options:n,document:i},o),u=[],d=[];for(var f in c)u.push(f),d.push(c[f]);return u.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(u)))).apply(void 0,d),su.sendTasks(e,[{module:"dom",method:"createFinish",args:[]}],-1),s},destroyInstance:function(e){delete lu[e]},getRoot:function(e){return lu[e].document.body.toJSON()},receiveTasks:function(e,t){var n={fireEvent:function(e,t,n,r,o){var i=lu[e].document,a=i.getRef(t);return i.fireEvent(a,n,r,o)},callback:function(e,t,n,r){return lu[e].document.handleCallback(t,n,r)}};if((lu[e]||{}).document&&Array.isArray(t)){var r=[];return t.forEach(function(t){var o=n[t.method],i=[].concat(t.args);"function"==typeof o&&(i.unshift(e),r.push(o.apply(void 0,i)))}),r}}}),uu=n(function(e){e.exports=function(e,t){function n(e){return void 0===e||null===e}function r(e){return void 0!==e&&null!==e}function o(e){return!0===e}function i(e){return!1===e}function a(e){return"string"==typeof e||"number"==typeof e||"boolean"==typeof e}function s(e){return null!==e&&"object"==typeof e}function l(e){return"[object Object]"===fn.call(e)}function c(e){return"[object RegExp]"===fn.call(e)}function u(e){var t=parseFloat(e);return t>=0&&Math.floor(t)===t&&isFinite(e)}function d(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(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]}}function h(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}function v(e,t){return hn.call(e,t)}function m(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}function y(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}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 b(e,t){for(var n in t)e[n]=t[n];return e}function A(e){for(var t={},n=0;n<e.length;n++)e[n]&&b(t,e[n]);return t}function w(e,t,n){}function _(e,t){if(e===t)return!0;var n=s(e),r=s(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var o=Array.isArray(e),i=Array.isArray(t);if(o&&i)return e.length===t.length&&e.every(function(e,n){return _(e,t[n])});if(o||i)return!1;var a=Object.keys(e),l=Object.keys(t);return a.length===l.length&&a.every(function(n){return _(e[n],t[n])})}catch(e){return!1}}function x(e,t){for(var n=0;n<e.length;n++)if(_(e[n],t))return n;return-1}function E(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}function C(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function k(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function S(e){if(!Sn.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}function O(e,t,n){if(Cn.errorHandler)Cn.errorHandler.call(null,e,t,n);else{if(!jn||"undefined"==typeof console)throw e;console.error(e)}}function I(e){return"function"==typeof e&&/native code/.test(e.toString())}function j(e){zn.target&&Vn.push(zn.target),zn.target=e}function T(){zn.target=Vn.pop()}function L(e,t,n){e.__proto__=t}function P(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];k(e,i,t[i])}}function M(e,t){if(s(e)){var n;return v(e,"__ob__")&&e.__ob__ instanceof Jn?n=e.__ob__:Yn.shouldConvert&&!Dn()&&(Array.isArray(e)||l(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new Jn(e)),t&&n&&n.vmCount++,n}}function N(e,t,n,r,o){var i=new zn,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,l=a&&a.set,c=!o&&M(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return zn.target&&(i.depend(),c&&c.dep.depend(),Array.isArray(t)&&F(t)),t},set:function(t){var r=s?s.call(e):n;t===r||t!==t&&r!==r||(l?l.call(e,t):n=t,c=!o&&M(t),i.notify())}})}}function B(e,t,n){if(Array.isArray(e)&&u(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(v(e,t))return e[t]=n,n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(N(r.value,t,n),r.dep.notify(),n):(e[t]=n,n)}function R(e,t){if(Array.isArray(e)&&u(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||v(e,t)&&(delete e[t],n&&n.dep.notify())}}function F(e){for(var t=void 0,n=0,r=e.length;n<r;n++)(t=e[n])&&t.__ob__&&t.__ob__.dep.depend(),Array.isArray(t)&&F(t)}function D(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],v(e,n)?l(r)&&l(o)&&D(r,o):B(e,n,o);return e}function W(e,t,n){return n?e||t?function(){var r="function"==typeof t?t.call(n):t,o="function"==typeof e?e.call(n):void 0;return r?D(r,o):o}:void 0:t?e?function(){return D("function"==typeof t?t.call(this):t,"function"==typeof e?e.call(this):e)}:t:e}function $(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}function Q(e,t){var n=Object.create(e||null);return t?b(n,t):n}function U(e){var t=e.props;if(t){var n,r,o={};if(Array.isArray(t))for(n=t.length;n--;)"string"==typeof(r=t[n])&&(o[mn(r)]={type:null});else if(l(t))for(var i in t)r=t[i],o[mn(i)]=l(r)?r:{type:r};e.props=o}}function z(e){var t=e.inject;if(Array.isArray(t))for(var n=e.inject={},r=0;r<t.length;r++)n[t[r]]=t[r]}function V(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})}}function H(e,t,n){function r(r){var o=Kn[r]||Zn;l[r]=o(e[r],t[r],n,r)}"function"==typeof t&&(t=t.options),U(t),z(t),V(t);var o=t.extends;if(o&&(e=H(e,o,n)),t.mixins)for(var i=0,a=t.mixins.length;i<a;i++)e=H(e,t.mixins[i],n);var s,l={};for(s in e)r(s);for(s in t)v(e,s)||r(s);return l}function G(e,t,n,r){if("string"==typeof n){var o=e[t];if(v(o,n))return o[n];var i=mn(n);if(v(o,i))return o[i];var a=yn(i);if(v(o,a))return o[a];var s=o[n]||o[i]||o[a];return s}}function q(e,t,n,r){var o=t[e],i=!v(n,e),a=n[e];if(K(Boolean,o.type)&&(i&&!v(o,"default")?a=!1:K(String,o.type)||""!==a&&a!==bn(e)||(a=!0)),void 0===a){a=Y(r,o,e);var s=Yn.shouldConvert;Yn.shouldConvert=!0,M(a),Yn.shouldConvert=s}return a}function Y(e,t,n){if(v(t,"default")){var r=t.default;return e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n]?e._props[n]:"function"==typeof r&&"Function"!==J(t.type)?r.call(e):r}}function J(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function K(e,t){if(!Array.isArray(t))return J(t)===J(e);for(var n=0,r=t.length;n<r;n++)if(J(t[n])===J(e))return!0;return!1}function Z(e){return new Xn(void 0,void 0,void 0,String(e))}function X(e){var t=new Xn(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.isCloned=!0,t}function ee(e){for(var t=e.length,n=new Array(t),r=0;r<t;r++)n[r]=X(e[r]);return n}function te(e){function t(){var e=arguments,n=t.fns;if(!Array.isArray(n))return n.apply(null,arguments);for(var r=n.slice(),o=0;o<r.length;o++)r[o].apply(null,e)}return t.fns=e,t}function ne(e,t,r,o,i){var a,s,l,c;for(a in e)s=e[a],l=t[a],c=rr(a),n(s)||(n(l)?(n(s.fns)&&(s=e[a]=te(s)),r(c.name,s,c.once,c.capture,c.passive)):s!==l&&(l.fns=s,e[a]=l));for(a in t)n(e[a])&&o((c=rr(a)).name,t[a],c.capture)}function re(e,t,i){function a(){i.apply(this,arguments),h(s.fns,a)}var s,l=e[t];n(l)?s=te([a]):r(l.fns)&&o(l.merged)?(s=l).fns.push(a):s=te([l,a]),s.merged=!0,e[t]=s}function oe(e,t,o){var i=t.options.props;if(!n(i)){var a={},s=e.attrs,l=e.props;if(r(s)||r(l))for(var c in i){var u=bn(c);ie(a,l,c,u,!0)||ie(a,s,c,u,!1)}return a}}function ie(e,t,n,o,i){if(r(t)){if(v(t,n))return e[n]=t[n],i||delete t[n],!0;if(v(t,o))return e[n]=t[o],i||delete t[o],!0}return!1}function ae(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}function se(e){return a(e)?[Z(e)]:Array.isArray(e)?ce(e):void 0}function le(e){return r(e)&&r(e.text)&&i(e.isComment)}function ce(e,t){var i,s,l,c=[];for(i=0;i<e.length;i++)n(s=e[i])||"boolean"==typeof s||(l=c[c.length-1],Array.isArray(s)?c.push.apply(c,ce(s,(t||"")+"_"+i)):a(s)?le(l)?l.text+=String(s):""!==s&&c.push(Z(s)):le(s)&&le(l)?c[c.length-1]=Z(l.text+s.text):(o(e._isVList)&&r(s.tag)&&n(s.key)&&r(t)&&(s.key="__vlist"+t+"_"+i+"__"),c.push(s)));return c}function ue(e,t){return e.__esModule&&e.default&&(e=e.default),s(e)?t.extend(e):e}function de(e,t,n,r,o){var i=nr();return i.asyncFactory=e,i.asyncMeta={data:t,context:n,children:r,tag:o},i}function fe(e,t,i){if(o(e.error)&&r(e.errorComp))return e.errorComp;if(r(e.resolved))return e.resolved;if(o(e.loading)&&r(e.loadingComp))return e.loadingComp;if(!r(e.contexts)){var a=e.contexts=[i],l=!0,c=function(){for(var e=0,t=a.length;e<t;e++)a[e].$forceUpdate()},u=E(function(n){e.resolved=ue(n,t),l||c()}),d=E(function(t){r(e.errorComp)&&(e.error=!0,c())}),f=e(u,d);return s(f)&&("function"==typeof f.then?n(e.resolved)&&f.then(u,d):r(f.component)&&"function"==typeof f.component.then&&(f.component.then(u,d),r(f.error)&&(e.errorComp=ue(f.error,t)),r(f.loading)&&(e.loadingComp=ue(f.loading,t),0===f.delay?e.loading=!0:setTimeout(function(){n(e.resolved)&&n(e.error)&&(e.loading=!0,c())},f.delay||200)),r(f.timeout)&&setTimeout(function(){n(e.resolved)&&d(null)},f.timeout))),l=!1,e.loading?e.loadingComp:e.resolved}e.contexts.push(i)}function pe(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(r(n)&&r(n.componentOptions))return n}}function he(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&ye(e,t)}function ve(e,t,n){n?tr.$once(e,t):tr.$on(e,t)}function me(e,t){tr.$off(e,t)}function ye(e,t,n){tr=e,ne(t,n||{},ve,me,e)}function ge(e,t){var n={};if(!e)return n;for(var r=[],o=0,i=e.length;o<i;o++){var a=e[o];if(a.context!==t&&a.functionalContext!==t||!a.data||null==a.data.slot)r.push(a);else{var s=a.data.slot,l=n[s]||(n[s]=[]);"template"===a.tag?l.push.apply(l,a.children):l.push(a)}}return r.every(be)||(n.default=r),n}function be(e){return e.isComment||" "===e.text}function Ae(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?Ae(e[n],t):t[e[n].key]=e[n].fn;return t}function we(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 _e(e,t,n){e.$el=t,e.$options.render||(e.$options.render=nr),Se(e,"beforeMount");var r;return r=function(){e._update(e._render(),n)},e._watcher=new fr(e,r,w),n=!1,null==e.$vnode&&(e._isMounted=!0,Se(e,"mounted")),e}function xe(e,t,n,r,o){var i=!!(o||e.$options._renderChildren||r.data.scopedSlots||e.$scopedSlots!==kn);if(e.$options._parentVnode=r,e.$vnode=r,e._vnode&&(e._vnode.parent=r),e.$options._renderChildren=o,e.$attrs=r.data&&r.data.attrs,e.$listeners=n,t&&e.$options.props){Yn.shouldConvert=!1;for(var a=e._props,s=e.$options._propKeys||[],l=0;l<s.length;l++){var c=s[l];a[c]=q(c,e.$options.props,t,e)}Yn.shouldConvert=!0,e.$options.propsData=t}if(n){var u=e.$options._parentListeners;e.$options._parentListeners=n,ye(e,n,u)}i&&(e.$slots=ge(o,r.context),e.$forceUpdate())}function Ee(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function Ce(e,t){if(t){if(e._directInactive=!1,Ee(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++)Ce(e.$children[n]);Se(e,"activated")}}function ke(e,t){if(!(t&&(e._directInactive=!0,Ee(e))||e._inactive)){e._inactive=!0;for(var n=0;n<e.$children.length;n++)ke(e.$children[n]);Se(e,"deactivated")}}function Se(e,t){var n=e.$options[t];if(n)for(var r=0,o=n.length;r<o;r++)try{n[r].call(e)}catch(n){O(n,e,t+" hook")}e._hasHookEvent&&e.$emit("hook:"+t)}function Oe(){ur=ir.length=ar.length=0,sr={},lr=cr=!1}function Ie(){cr=!0;var e,t;for(ir.sort(function(e,t){return e.id-t.id}),ur=0;ur<ir.length;ur++)t=(e=ir[ur]).id,sr[t]=null,e.run();var n=ar.slice(),r=ir.slice();Oe(),Le(n),je(r),Wn&&Cn.devtools&&Wn.emit("flush")}function je(e){for(var t=e.length;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&Se(r,"updated")}}function Te(e){e._inactive=!1,ar.push(e)}function Le(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,Ce(e[t],!0)}function Pe(e){var t=e.id;if(null==sr[t]){if(sr[t]=!0,cr){for(var n=ir.length-1;n>ur&&ir[n].id>e.id;)n--;ir.splice(n+1,0,e)}else ir.push(e);lr||(lr=!0,Qn(Ie))}}function Me(e){pr.clear(),Ne(e,pr)}function Ne(e,t){var n,r,o=Array.isArray(e);if((o||s(e))&&Object.isExtensible(e)){if(e.__ob__){var i=e.__ob__.dep.id;if(t.has(i))return;t.add(i)}if(o)for(n=e.length;n--;)Ne(e[n],t);else for(n=(r=Object.keys(e)).length;n--;)Ne(e[r[n]],t)}}function Be(e,t,n){hr.get=function(){return this[t][n]},hr.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hr)}function Re(e){e._watchers=[];var t=e.$options;t.props&&Fe(e,t.props),t.methods&&ze(e,t.methods),t.data?De(e):M(e._data={},!0),t.computed&&$e(e,t.computed),t.watch&&t.watch!==Mn&&Ve(e,t.watch)}function Fe(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;Yn.shouldConvert=i;for(var a in t)!function(i){o.push(i);var a=q(i,t,n,e);N(r,i,a),i in e||Be(e,"_props",i)}(a);Yn.shouldConvert=!0}function De(e){var t=e.$options.data;l(t=e._data="function"==typeof t?We(t,e):t||{})||(t={});for(var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);o--;){var i=n[o];r&&v(r,i)||C(i)||Be(e,"_data",i)}M(t,!0)}function We(e,t){try{return e.call(t)}catch(e){return O(e,t,"data()"),{}}}function $e(e,t){var n=e._computedWatchers=Object.create(null);for(var r in t){var o=t[r],i="function"==typeof o?o:o.get;n[r]=new fr(e,i||w,w,vr),r in e||Qe(e,r,o)}}function Qe(e,t,n){"function"==typeof n?(hr.get=Ue(t),hr.set=w):(hr.get=n.get?!1!==n.cache?Ue(t):n.get:w,hr.set=n.set?n.set:w),Object.defineProperty(e,t,hr)}function Ue(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),zn.target&&t.depend(),t.value}}function ze(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?w:y(t[n],e)}function Ve(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)He(e,n,r[o]);else He(e,n,r)}}function He(e,t,n,r){return l(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Ge(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}function qe(e){var t=Ye(e.$options.inject,e);t&&(Yn.shouldConvert=!1,Object.keys(t).forEach(function(n){N(e,n,t[n])}),Yn.shouldConvert=!0)}function Ye(e,t){if(e){for(var n=Object.create(null),r=$n?Reflect.ownKeys(e):Object.keys(e),o=0;o<r.length;o++)for(var i=r[o],a=e[i],s=t;s;){if(s._provided&&a in s._provided){n[i]=s._provided[a];break}s=s.$parent}return n}}function Je(e,t,n,o,i){var a={},s=e.options.props;if(r(s))for(var l in s)a[l]=q(l,s,t||{});else r(n.attrs)&&Ke(a,n.attrs),r(n.props)&&Ke(a,n.props);var c=Object.create(o),u=e.options.render.call(null,function(e,t,n,r){return rt(c,e,t,n,r,!0)},{data:n,props:a,children:i,parent:o,listeners:n.on||{},injections:Ye(e.options.inject,o),slots:function(){return ge(i,o)}});return u instanceof Xn&&(u.functionalContext=o,u.functionalOptions=e.options,n.slot&&((u.data||(u.data={})).slot=n.slot)),u}function Ke(e,t){for(var n in t)e[mn(n)]=t[n]}function Ze(e,t,i,a,l){if(!n(e)){var c=i.$options._base;if(s(e)&&(e=c.extend(e)),"function"==typeof e){var u;if(n(e.cid)&&(u=e,void 0===(e=fe(u,c,i))))return de(u,t,i,a,l);t=t||{},gt(e),r(t.model)&&nt(e.options,t);var d=oe(t,e,l);if(o(e.options.functional))return Je(e,d,t,i,a);var f=t.on;if(t.on=t.nativeOn,o(e.options.abstract)){var p=t.slot;t={},p&&(t.slot=p)}et(t);var h=e.options.name||l;return new Xn("vue-component-"+e.cid+(h?"-"+h:""),t,void 0,void 0,void 0,i,{Ctor:e,propsData:d,listeners:f,tag:l,children:a},u)}}}function Xe(e,t,n,o){var i=e.componentOptions,a={_isComponent:!0,parent:t,propsData:i.propsData,_componentTag:i.tag,_parentVnode:e,_parentListeners:i.listeners,_renderChildren:i.children,_parentElm:n||null,_refElm:o||null},s=e.data.inlineTemplate;return r(s)&&(a.render=s.render,a.staticRenderFns=s.staticRenderFns),new i.Ctor(a)}function et(e){e.hook||(e.hook={});for(var t=0;t<yr.length;t++){var n=yr[t],r=e.hook[n],o=mr[n];e.hook[n]=r?tt(o,r):o}}function tt(e,t){return function(n,r,o,i){e(n,r,o,i),t(n,r,o,i)}}function nt(e,t){var n=e.model&&e.model.prop||"value",o=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var i=t.on||(t.on={});r(i[o])?i[o]=[t.model.callback].concat(i[o]):i[o]=t.model.callback}function rt(e,t,n,r,i,s){return(Array.isArray(n)||a(n))&&(i=r,r=n,n=void 0),o(s)&&(i=br),ot(e,t,n,r,i)}function ot(e,t,n,o,i){if(r(n)&&r(n.__ob__))return nr();if(r(n)&&r(n.is)&&(t=n.is),!t)return nr();Array.isArray(o)&&"function"==typeof o[0]&&((n=n||{}).scopedSlots={default:o[0]},o.length=0),i===br?o=se(o):i===gr&&(o=ae(o));var a,s;if("string"==typeof t){var l;s=Cn.getTagNamespace(t),a=Cn.isReservedTag(t)?new Xn(Cn.parsePlatformTagName(t),n,o,void 0,void 0,e):r(l=G(e.$options,"components",t))?Ze(l,n,e,o,t):new Xn(t,n,o,void 0,void 0,e)}else a=Ze(t,n,e,o);return r(a)?(s&&it(a,s),a):nr()}function it(e,t){if(e.ns=t,"foreignObject"!==e.tag&&r(e.children))for(var o=0,i=e.children.length;o<i;o++){var a=e.children[o];r(a.tag)&&n(a.ns)&&it(a,t)}}function at(e,t){var n,o,i,a,l;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),o=0,i=e.length;o<i;o++)n[o]=t(e[o],o);else if("number"==typeof e)for(n=new Array(e),o=0;o<e;o++)n[o]=t(o+1,o);else if(s(e))for(a=Object.keys(e),n=new Array(a.length),o=0,i=a.length;o<i;o++)l=a[o],n[o]=t(e[l],l,o);return r(n)&&(n._isVList=!0),n}function st(e,t,n,r){var o=this.$scopedSlots[e];if(o)return n=n||{},r&&(n=b(b({},r),n)),o(n)||t;var i=this.$slots[e];return i||t}function lt(e){return G(this.$options,"filters",e,!0)||wn}function ct(e,t,n){var r=Cn.keyCodes[t]||n;return Array.isArray(r)?-1===r.indexOf(e):r!==e}function ut(e,t,n,r,o){if(n)if(s(n)){Array.isArray(n)&&(n=A(n));var i;for(var a in n)!function(a){if("class"===a||"style"===a||pn(a))i=e;else{var s=e.attrs&&e.attrs.type;i=r||Cn.mustUseProp(t,s,a)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}a in i||(i[a]=n[a],o&&((e.on||(e.on={}))["update:"+a]=function(e){n[a]=e}))}(a)}else;return e}function dt(e,t){var n=this._staticTrees[e];return n&&!t?Array.isArray(n)?ee(n):X(n):(n=this._staticTrees[e]=this.$options.staticRenderFns[e].call(this._renderProxy),pt(n,"__static__"+e,!1),n)}function ft(e,t,n){return pt(e,"__once__"+t+(n?"_"+n:""),!0),e}function pt(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 vt(e,t){if(t)if(l(t)){var n=e.on=e.on?b({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(i,o):i}}else;return e}function mt(e){e._vnode=null,e._staticTrees=null;var t=e.$vnode=e.$options._parentVnode,n=t&&t.context;e.$slots=ge(e.$options._renderChildren,n),e.$scopedSlots=kn,e._c=function(t,n,r,o){return rt(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return rt(e,t,n,r,o,!0)};var r=t&&t.data;N(e,"$attrs",r&&r.attrs,null,!0),N(e,"$listeners",e.$options._parentListeners,null,!0)}function yt(e,t){var n=e.$options=Object.create(e.constructor.options);n.parent=t.parent,n.propsData=t.propsData,n._parentVnode=t._parentVnode,n._parentListeners=t._parentListeners,n._renderChildren=t._renderChildren,n._componentTag=t._componentTag,n._parentElm=t._parentElm,n._refElm=t._refElm,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function gt(e){var t=e.options;if(e.super){var n=gt(e.super);if(n!==e.superOptions){e.superOptions=n;var r=bt(e);r&&b(e.extendOptions,r),(t=e.options=H(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function bt(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]=At(n[i],r[i],o[i]));return t}function At(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++)(t.indexOf(e[o])>=0||n.indexOf(e[o])<0)&&r.push(e[o]);return r}return e}function wt(e){this._init(e)}function _t(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)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}}function xt(e){e.mixin=function(e){return this.options=H(this.options,e),this}}function Et(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name,a=function(e){this._init(e)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=t++,a.options=H(n.options,e),a.super=n,a.options.props&&Ct(a),a.options.computed&&kt(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,xn.forEach(function(e){a[e]=n[e]}),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=b({},a.options),o[r]=a,a}}function Ct(e){var t=e.options.props;for(var n in t)Be(e.prototype,"_props",n)}function kt(e){var t=e.options.computed;for(var n in t)Qe(e.prototype,n,t[n])}function St(e){xn.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&l(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}function Ot(e){return e&&(e.Ctor.options.name||e.tag)}function It(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!c(e)&&e.test(t)}function jt(e,t,n){for(var r in e){var o=e[r];if(o){var i=Ot(o.componentOptions);i&&!n(i)&&(o!==t&&Tt(o),e[r]=null)}}}function Tt(e){e&&e.componentInstance.$destroy()}function Lt(e){return new t.Element(e)}function Pt(e,t){var n=e.data.ref;if(n){var r=e.context,o=e.componentInstance||e.elm,i=r.$refs;t?Array.isArray(i[n])?h(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}}function Mt(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&r(e.data)===r(t.data)&&Nt(e,t)||o(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&n(t.asyncFactory.error))}function Nt(e,t){if("input"!==e.tag)return!0;var n;return(r(n=e.data)&&r(n=n.attrs)&&n.type)===(r(n=t.data)&&r(n=n.attrs)&&n.type)}function Bt(e,t,n){var o,i,a={};for(o=t;o<=n;++o)r(i=e[o].key)&&(a[i]=o);return a}function Rt(e,t){(e.data.directives||t.data.directives)&&Ft(e,t)}function Ft(e,t){var n,r,o,i=e===Sr,a=t===Sr,s=Dt(e.data.directives,e.context),l=Dt(t.data.directives,t.context),c=[],u=[];for(n in l)r=s[n],o=l[n],r?(o.oldValue=r.value,$t(o,"update",t,e),o.def&&o.def.componentUpdated&&u.push(o)):($t(o,"bind",t,e),o.def&&o.def.inserted&&c.push(o));if(c.length){var d=function(){for(var n=0;n<c.length;n++)$t(c[n],"inserted",t,e)};i?re(t.data.hook||(t.data.hook={}),"insert",d):d()}if(u.length&&re(t.data.hook||(t.data.hook={}),"postpatch",function(){for(var n=0;n<u.length;n++)$t(u[n],"componentUpdated",t,e)}),!i)for(n in s)l[n]||$t(s[n],"unbind",e,e,a)}function Dt(e,t){var n=Object.create(null);if(!e)return n;var r,o;for(r=0;r<e.length;r++)(o=e[r]).modifiers||(o.modifiers=jr),n[Wt(o)]=o,o.def=G(t.$options,"directives",o.name,!0);return n}function Wt(e){return e.rawName||e.name+"."+Object.keys(e.modifiers||{}).join(".")}function $t(e,t,n,r,o){var i=e.def&&e.def[t];if(i)try{i(n.elm,e,n,r,o)}catch(r){O(r,n.context,"directive "+e.name+" "+t+" hook")}}function Qt(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=b({},a));for(n in a)r=a[n],i[n]!==r&&o.setAttr(n,r);for(n in i)null==a[n]&&o.setAttr(n)}}function Ut(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 l=[],c=o.staticClass;c&&l.push.apply(l,c),o.class&&l.push.apply(l,o.class);var u=zt(a,l,r);for(var d in u)n.setStyle(d,u[d])}}function zt(e,t,n){var r=n.$options.style||{},o={};return t.forEach(function(e){b(o,r[e])}),e.forEach(function(e){var t=r[e];for(var n in t)o.hasOwnProperty(n)||(o[n]="")}),o}function Vt(e,t,n,r){if(r)console.log("Weex do not support event in bubble phase.");else{if(n){var o=t,i=xr;t=function(t){null!==(1===arguments.length?o(t):o.apply(null,arguments))&&Ht(e,null,null,i)}}xr.addEvent(e,t)}}function Ht(e,t,n,r){(r||xr).removeEvent(e)}function Gt(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};xr=t.elm,ne(n,r,Vt,Ht,t.context)}}function qt(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=Yt(a)),s&&(a=t.data.style=b({},a));for(r in i)a[r]||o.setStyle(Nr(r),"");for(r in a)n=a[r],o.setStyle(Nr(r),n)}}function Yt(e){for(var t={},n=0;n<e.length;n++)e[n]&&b(t,e[n]);return t}function Jt(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&b(t,Rr(e.name||"v")),b(t,e),t}return"string"==typeof e?Rr(e):void 0}}function Kt(e,t){var n=t.elm;n._leaveCb&&(n._leaveCb.cancelled=!0,n._leaveCb());var r=Jt(t.data.transition);if(r&&!n._enterCb){for(var o=r.enterClass,i=r.enterToClass,a=r.enterActiveClass,s=r.appearClass,l=r.appearToClass,c=r.appearActiveClass,u=r.beforeEnter,d=r.enter,f=r.afterEnter,p=r.enterCancelled,h=r.beforeAppear,v=r.appear,m=r.afterAppear,y=r.appearCancelled,g=or,b=or.$vnode;b&&b.parent;)g=(b=b.parent).context;var A=!g._isMounted||!t.isRootInsert;if(!A||v||""===v){var _=A?s:o,x=A?l:i,C=A?c:a,k=A?h||u:u,S=A&&"function"==typeof v?v:d,O=A?m||f:f,I=A?y||p:p,j=S&&(S._length||S.length)>1,T=t.context.$options.style||{},L=T[_],P=T["@TRANSITION"]&&T["@TRANSITION"][C]||{},M=Zt(n,T,_,x,C,t.context),N=Object.keys(M).length>0,B=n._enterCb=E(function(){B.cancelled?I&&I(n):O&&O(n),n._enterCb=null});if(setTimeout(function(){var e=n.parentNode,r=e&&e._pending&&e._pending[t.key];r&&r.context===t.context&&r.tag===t.tag&&r.elm._leaveCb&&r.elm._leaveCb(),S&&S(n,B),N?t.context.$requireWeexModule("animation").transition(n.ref,{styles:M,duration:P.duration||0,delay:P.delay||0,timingFunction:P.timingFunction||"linear"},j?w:B):j||B()},16),k&&k(n),L)for(var R in L)n.setStyle(R,L[R]);N||j||B()}}}function Zt(e,t,n,r,o,i){var a={},s=t[n],l=t[r],c=t[o];if(s)for(var u in s)a[u]=e.style[u];if(c)for(var d in c)0!==d.indexOf("transition")&&(a[d]=c[d]);return l&&b(a,l),a}function Xt(e){return e.tag?e.tag.replace(/vue\-component\-(\d+\-)?/,""):""}function en(e){return e.children&&1===e.children.length&&!e.children[0].tag}function tn(e){var t=String(e).match(Wr);return t?Number(t[1]):e}function nn(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||{};[].concat(r,e.data.class).forEach(function(e){e&&i[e]&&Object.assign(o,i[e])});for(var a in o)o[a]=tn(o[a]);return o}}}function rn(e){if(e.length)return e.map(function(e){var t=Xt(e),n={type:t};if(t){if(n.style=nn(e),e.data&&(n.attr=e.data.attrs,e.data.on&&(n.events=e.data.on)),"span"===t&&en(e))return n.attr=n.attr||{},n.attr.value=e.children[0].text.trim(),n}else n.type="span",n.attr={value:(e.text||"").trim()};return e.children&&e.children.length&&(n.children=rn(e.children)),n})}function on(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?on(pe(t.children)):e}function an(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[mn(i)]=o[i];return t}function sn(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}function ln(e){for(;e=e.parent;)if(e.data.transition)return!0}function cn(e,t){return t.key===e.key&&t.tag===e.tag}function un(e){return e.isComment&&e.asyncFactory}function dn(e,n){var r=new t.Comment("root");return r.hasAttribute=r.removeAttribute=function(){},n.documentElement.appendChild(r),r}var fn=Object.prototype.toString,pn=(p("slot,component",!0),p("key,ref,slot,is")),hn=Object.prototype.hasOwnProperty,vn=/-(\w)/g,mn=m(function(e){return e.replace(vn,function(e,t){return t?t.toUpperCase():""})}),yn=m(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),gn=/([^-])([A-Z])/g,bn=m(function(e){return e.replace(gn,"$1-$2").replace(gn,"$1-$2").toLowerCase()}),An=function(e,t,n){return!1},wn=function(e){return e},_n="data-server-rendered",xn=["component","directive","filter"],En=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated"],Cn={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:An,isReservedAttr:An,isUnknownElement:An,getTagNamespace:w,parsePlatformTagName:wn,mustUseProp:An,_lifecycleHooks:En},kn=Object.freeze({}),Sn=/[^\w.$]/,On=w,In="__proto__"in{},jn="undefined"!=typeof window,Tn=jn&&window.navigator.userAgent.toLowerCase(),Ln=(Tn&&/msie|trident/.test(Tn),Tn&&Tn.indexOf("msie 9.0"),Tn&&Tn.indexOf("edge/")>0),Pn=(Tn&&Tn.indexOf("android"),Tn&&/iphone|ipad|ipod|ios/.test(Tn)),Mn=(Tn&&/chrome\/\d+/.test(Tn),{}.watch),Nn=!1;if(jn)try{var Bn={};Object.defineProperty(Bn,"passive",{get:function(){Nn=!0}}),window.addEventListener("test-passive",null,Bn)}catch(e){}var Rn,Fn,Dn=function(){return void 0===Rn&&(Rn=!jn&&void 0!==si&&"server"===si.process.env.VUE_ENV),Rn},Wn=jn&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,$n="undefined"!=typeof Symbol&&I(Symbol)&&"undefined"!=typeof Reflect&&I(Reflect.ownKeys),Qn=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t<e.length;t++)e[t]()}var t,n=[],r=!1;if("undefined"!=typeof Promise&&I(Promise)){var o=Promise.resolve(),i=function(e){console.error(e)};t=function(){o.then(e).catch(i),Pn&&setTimeout(w)}}else if("undefined"==typeof MutationObserver||!I(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())t=function(){setTimeout(e,0)};else{var a=1,s=new MutationObserver(e),l=document.createTextNode(String(a));s.observe(l,{characterData:!0}),t=function(){a=(a+1)%2,l.data=String(a)}}return function(e,o){var i;if(n.push(function(){if(e)try{e.call(o)}catch(e){O(e,o,"nextTick")}else i&&i(o)}),r||(r=!0,t()),!e&&"undefined"!=typeof Promise)return new Promise(function(e,t){i=e})}}();Fn="undefined"!=typeof Set&&I(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 Un=0,zn=function(){this.id=Un++,this.subs=[]};zn.prototype.addSub=function(e){this.subs.push(e)},zn.prototype.removeSub=function(e){h(this.subs,e)},zn.prototype.depend=function(){zn.target&&zn.target.addDep(this)},zn.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},zn.target=null;var Vn=[],Hn=Array.prototype,Gn=Object.create(Hn);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=Hn[e];k(Gn,e,function(){for(var n=arguments,r=[],o=arguments.length;o--;)r[o]=n[o];var i,a=t.apply(this,r),s=this.__ob__;switch(e){case"push":case"unshift":i=r;break;case"splice":i=r.slice(2)}return i&&s.observeArray(i),s.dep.notify(),a})});var qn=Object.getOwnPropertyNames(Gn),Yn={shouldConvert:!0},Jn=function(e){this.value=e,this.dep=new zn,this.vmCount=0,k(e,"__ob__",this),Array.isArray(e)?((In?L:P)(e,Gn,qn),this.observeArray(e)):this.walk(e)};Jn.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)N(e,t[n],e[t[n]])},Jn.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)M(e[t])};var Kn=Cn.optionMergeStrategies;Kn.data=function(e,t,n){return n?W(e,t,n):t&&"function"!=typeof t?e:W.call(this,e,t)},En.forEach(function(e){Kn[e]=$}),xn.forEach(function(e){Kn[e+"s"]=Q}),Kn.watch=function(e,t){if(e===Mn&&(e=void 0),t===Mn&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var n={};b(n,e);for(var r in t){var o=n[r],i=t[r];o&&!Array.isArray(o)&&(o=[o]),n[r]=o?o.concat(i):Array.isArray(i)?i:[i]}return n},Kn.props=Kn.methods=Kn.inject=Kn.computed=function(e,t){if(!e)return t;var n=Object.create(null);return b(n,e),t&&b(n,t),n},Kn.provide=W;var Zn=function(e,t){return void 0===t?e:t},Xn=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.functionalContext=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},er={child:{}};er.child.get=function(){return this.componentInstance},Object.defineProperties(Xn.prototype,er);var tr,nr=function(e){void 0===e&&(e="");var t=new Xn;return t.text=e,t.isComment=!0,t},rr=m(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 e=r?e.slice(1):e,{name:e,once:n,capture:r,passive:t}}),or=null,ir=[],ar=[],sr={},lr=!1,cr=!1,ur=0,dr=0,fr=function(e,t,n,r){this.vm=e,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=++dr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new Fn,this.newDepIds=new Fn,this.expression="","function"==typeof t?this.getter=t:(this.getter=S(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};fr.prototype.get=function(){j(this);var e,t=this.vm;try{e=this.getter.call(t,t)}catch(e){if(!this.user)throw e;O(e,t,'getter for watcher "'+this.expression+'"')}finally{this.deep&&Me(e),T(),this.cleanupDeps()}return e},fr.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))},fr.prototype.cleanupDeps=function(){for(var e=this,t=this.deps.length;t--;){var n=e.deps[t];e.newDepIds.has(n.id)||n.removeSub(e)}var r=this.depIds;this.depIds=this.newDepIds,this.newDepIds=r,this.newDepIds.clear(),r=this.deps,this.deps=this.newDeps,this.newDeps=r,this.newDeps.length=0},fr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():Pe(this)},fr.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||s(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){O(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},fr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fr.prototype.depend=function(){for(var e=this,t=this.deps.length;t--;)e.deps[t].depend()},fr.prototype.teardown=function(){var e=this;if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var t=this.deps.length;t--;)e.deps[t].removeSub(e);this.active=!1}};var pr=new Fn,hr={enumerable:!0,configurable:!0,get:w,set:w},vr={lazy:!0},mr={init:function(e,t,n,r){if(!e.componentInstance||e.componentInstance._isDestroyed)(e.componentInstance=Xe(e,or,n,r)).$mount(t?e.elm:void 0,t);else if(e.data.keepAlive){var o=e;mr.prepatch(o,o)}},prepatch:function(e,t){var n=t.componentOptions;xe(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t=e.context,n=e.componentInstance;n._isMounted||(n._isMounted=!0,Se(n,"mounted")),e.data.keepAlive&&(t._isMounted?Te(n):Ce(n,!0))},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?ke(t,!0):t.$destroy())}},yr=Object.keys(mr),gr=1,br=2,Ar=0;!function(e){e.prototype._init=function(e){var t=this;t._uid=Ar++,t._isVue=!0,e&&e._isComponent?yt(t,e):t.$options=H(gt(t.constructor),e||{},t),t._renderProxy=t,t._self=t,we(t),he(t),mt(t),Se(t,"beforeCreate"),qe(t),Re(t),Ge(t),Se(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(wt),function(e){var t={};t.get=function(){return this._data};var n={};n.get=function(){return this._props},Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=B,e.prototype.$delete=R,e.prototype.$watch=function(e,t,n){var r=this;if(l(t))return He(r,e,t,n);(n=n||{}).user=!0;var o=new fr(r,e,t,n);return n.immediate&&t.call(r,o.value),function(){o.teardown()}}}(wt),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this,o=this;if(Array.isArray(e))for(var i=0,a=e.length;i<a;i++)r.$on(e[i],n);else(o._events[e]||(o._events[e]=[])).push(n),t.test(e)&&(o._hasHookEvent=!0);return o},e.prototype.$once=function(e,t){function n(){r.$off(e,n),t.apply(r,arguments)}var r=this;return n.fn=t,r.$on(e,n),r},e.prototype.$off=function(e,t){var n=this,r=this;if(!arguments.length)return r._events=Object.create(null),r;if(Array.isArray(e)){for(var o=0,i=e.length;o<i;o++)n.$off(e[o],t);return r}var a=r._events[e];if(!a)return r;if(1===arguments.length)return r._events[e]=null,r;for(var s,l=a.length;l--;)if((s=a[l])===t||s.fn===t){a.splice(l,1);break}return r},e.prototype.$emit=function(e){var t=this,n=t._events[e];if(n){n=n.length>1?g(n):n;for(var r=g(arguments,1),o=0,i=n.length;o<i;o++)try{n[o].apply(t,r)}catch(n){O(n,t,'event handler for "'+e+'"')}}return t}}(wt),function(e){e.prototype._update=function(e,t){var n=this;n._isMounted&&Se(n,"beforeUpdate");var r=n.$el,o=n._vnode,i=or;or=n,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),or=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)},e.prototype.$forceUpdate=function(){var e=this;e._watcher&&e._watcher.update()},e.prototype.$destroy=function(){var e=this;if(!e._isBeingDestroyed){Se(e,"beforeDestroy"),e._isBeingDestroyed=!0;var t=e.$parent;!t||t._isBeingDestroyed||e.$options.abstract||h(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),Se(e,"destroyed"),e.$off(),e.$el&&(e.$el.__vue__=null)}}}(wt),function(e){e.prototype.$nextTick=function(e){return Qn(e,this)},e.prototype._render=function(){var e=this,t=e.$options,n=t.render,r=t.staticRenderFns,o=t._parentVnode;if(e._isMounted)for(var i in e.$slots)e.$slots[i]=ee(e.$slots[i]);e.$scopedSlots=o&&o.data.scopedSlots||kn,r&&!e._staticTrees&&(e._staticTrees=[]),e.$vnode=o;var a;try{a=n.call(e._renderProxy,e.$createElement)}catch(t){O(t,e,"render function"),a=e._vnode}return a instanceof Xn||(a=nr()),a.parent=o,a},e.prototype._o=ft,e.prototype._n=f,e.prototype._s=d,e.prototype._l=at,e.prototype._t=st,e.prototype._q=_,e.prototype._i=x,e.prototype._m=dt,e.prototype._f=lt,e.prototype._k=ct,e.prototype._b=ut,e.prototype._v=Z,e.prototype._e=nr,e.prototype._u=Ae,e.prototype._g=vt}(wt);var wr=[String,RegExp,Array],_r={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:wr,exclude:wr},created:function(){this.cache=Object.create(null)},destroyed:function(){var e=this;for(var t in e.cache)Tt(e.cache[t])},watch:{include:function(e){jt(this.cache,this._vnode,function(t){return It(e,t)})},exclude:function(e){jt(this.cache,this._vnode,function(t){return!It(e,t)})}},render:function(){var e=pe(this.$slots.default),t=e&&e.componentOptions;if(t){var n=Ot(t);if(n&&(this.include&&!It(this.include,n)||this.exclude&&It(this.exclude,n)))return e;var r=null==e.key?t.Ctor.cid+(t.tag?"::"+t.tag:""):e.key;this.cache[r]?e.componentInstance=this.cache[r].componentInstance:this.cache[r]=e,e.data.keepAlive=!0}return e}}};!function(e){var t={};t.get=function(){return Cn},Object.defineProperty(e,"config",t),e.util={warn:On,extend:b,mergeOptions:H,defineReactive:N},e.set=B,e.delete=R,e.nextTick=Qn,e.options=Object.create(null),xn.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,b(e.options.components,_r),_t(e),xt(e),Et(e),St(e)}(wt),Object.defineProperty(wt.prototype,"$isServer",{get:Dn}),Object.defineProperty(wt.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),wt.version="2.4.2";var xr,Er={},Cr=Object.freeze({namespaceMap:Er,createElement:Lt,createElementNS:function(e,n){return new t.Element(e+":"+n)},createTextNode:function(e){return new t.TextNode(e)},createComment:function(e){return new t.Comment(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=Lt("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=Lt("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.setAttr("value",t)},setAttribute:function(e,t,n){e.setAttr(t,n)}}),kr={create:function(e,t){Pt(t)},update:function(e,t){e.data.ref!==t.data.ref&&(Pt(e,!0),Pt(t))},destroy:function(e){Pt(e,!0)}},Sr=new Xn("",{},[]),Or=["create","activate","update","remove","destroy"],Ir={create:Rt,update:Rt,destroy:function(e){Rt(e,Sr)}},jr=Object.create(null),Tr=[kr,Ir],Lr={create:Qt,update:Qt},Pr={create:Ut,update:Ut},Mr={create:Gt,update:Gt},Nr=m(mn),Br={create:function(e,t){if(t.data.staticStyle){var n=t.elm,r=t.data.staticStyle;for(var o in r)r[o]&&n.setStyle(Nr(o),r[o]);qt(e,t)}else qt(e,t)},update:qt},Rr=m(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"}}),Fr=(jn&&window.requestAnimationFrame&&window.requestAnimationFrame.bind(window),function(e){function t(e){return new Xn(j.tagName(e).toLowerCase(),{},[],void 0,e)}function i(e,t){function n(){0==--n.listeners&&s(e)}return n.listeners=t,n}function s(e){var t=j.parentNode(e);r(t)&&j.removeChild(t,e)}function l(e,t,n,i,a){if(e.isRootInsert=!a,!c(e,t,n,i)){var s=e.data,l=e.children,u=e.tag;if(r(u)){e.elm=e.ns?j.createElementNS(e.ns,u):j.createElement(u,e),y(e);var d=r(s)&&o(s.appendAsTree);d||(r(s)&&m(e,t),f(n,e.elm,i)),h(e,l,t),d&&(r(s)&&m(e,t),f(n,e.elm,i))}else o(e.isComment)?(e.elm=j.createComment(e.text),f(n,e.elm,i)):(e.elm=j.createTextNode(e.text),f(n,e.elm,i))}}function c(e,t,n,i){var a=e.data;if(r(a)){var s=r(e.componentInstance)&&a.keepAlive;if(r(a=a.hook)&&r(a=a.init)&&a(e,!1,n,i),r(e.componentInstance))return u(e,t),o(s)&&d(e,t,n,i),!0}}function u(e,t){r(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,v(e)?(m(e,t),y(e)):(Pt(e),t.push(e))}function d(e,t,n,o){for(var i,a=e;a.componentInstance;)if(a=a.componentInstance._vnode,r(i=a.data)&&r(i=i.transition)){for(i=0;i<O.activate.length;++i)O.activate[i](Sr,a);t.push(a);break}f(n,e.elm,o)}function f(e,t,n){r(e)&&(r(n)?n.parentNode===e&&j.insertBefore(e,t,n):j.appendChild(e,t))}function h(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)l(t[r],n,e.elm,null,!0);else a(e.text)&&j.appendChild(e.elm,j.createTextNode(e.text))}function v(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return r(e.tag)}function m(e,t){for(var n=0;n<O.create.length;++n)O.create[n](Sr,e);r(k=e.data.hook)&&(r(k.create)&&k.create(Sr,e),r(k.insert)&&t.push(e))}function y(e){for(var t,n=e;n;)r(t=n.context)&&r(t=t.$options._scopeId)&&j.setAttribute(e.elm,t,""),n=n.parent;r(t=or)&&t!==e.context&&r(t=t.$options._scopeId)&&j.setAttribute(e.elm,t,"")}function g(e,t,n,r,o,i){for(;r<=o;++r)l(n[r],i,e,t)}function b(e){var t,n,o=e.data;if(r(o))for(r(t=o.hook)&&r(t=t.destroy)&&t(e),t=0;t<O.destroy.length;++t)O.destroy[t](e);if(r(t=e.children))for(n=0;n<e.children.length;++n)b(e.children[n])}function A(e,t,n,o){for(;n<=o;++n){var i=t[n];r(i)&&(r(i.tag)?(w(i),b(i)):s(i.elm))}}function w(e,t){if(r(t)||r(e.data)){var n,o=O.remove.length+1;for(r(t)?t.listeners+=o:t=i(e.elm,o),r(n=e.componentInstance)&&r(n=n._vnode)&&r(n.data)&&w(n,t),n=0;n<O.remove.length;++n)O.remove[n](e,t);r(n=e.data.hook)&&r(n=n.remove)?n(e,t):t()}else s(e.elm)}function _(e,t,o,i,a){for(var s,c,u,d=0,f=0,p=t.length-1,h=t[0],v=t[p],m=o.length-1,y=o[0],b=o[m],w=!a;d<=p&&f<=m;)n(h)?h=t[++d]:n(v)?v=t[--p]:Mt(h,y)?(x(h,y,i),h=t[++d],y=o[++f]):Mt(v,b)?(x(v,b,i),v=t[--p],b=o[--m]):Mt(h,b)?(x(h,b,i),w&&j.insertBefore(e,h.elm,j.nextSibling(v.elm)),h=t[++d],b=o[--m]):Mt(v,y)?(x(v,y,i),w&&j.insertBefore(e,v.elm,h.elm),v=t[--p],y=o[++f]):(n(s)&&(s=Bt(t,d,p)),n(c=r(y.key)?s[y.key]:null)?(l(y,i,e,h.elm),y=o[++f]):Mt(u=t[c],y)?(x(u,y,i),t[c]=void 0,w&&j.insertBefore(e,u.elm,h.elm),y=o[++f]):(l(y,i,e,h.elm),y=o[++f]));d>p?g(e,n(o[m+1])?null:o[m+1].elm,o,f,m,i):f>m&&A(e,t,d,p)}function x(e,t,i,a){if(e!==t){var s=t.elm=e.elm;if(o(e.isAsyncPlaceholder))r(t.asyncFactory.resolved)?C(e.elm,t,i):t.isAsyncPlaceholder=!0;else if(o(t.isStatic)&&o(e.isStatic)&&t.key===e.key&&(o(t.isCloned)||o(t.isOnce)))t.componentInstance=e.componentInstance;else{var l,c=t.data;r(c)&&r(l=c.hook)&&r(l=l.prepatch)&&l(e,t);var u=e.children,d=t.children;if(r(c)&&v(t)){for(l=0;l<O.update.length;++l)O.update[l](e,t);r(l=c.hook)&&r(l=l.update)&&l(e,t)}n(t.text)?r(u)&&r(d)?u!==d&&_(s,u,d,i,a):r(d)?(r(e.text)&&j.setTextContent(s,""),g(s,null,d,0,d.length-1,i)):r(u)?A(s,u,0,u.length-1):r(e.text)&&j.setTextContent(s,""):e.text!==t.text&&j.setTextContent(s,t.text),r(c)&&r(l=c.hook)&&r(l=l.postpatch)&&l(e,t)}}}function E(e,t,n){if(o(n)&&r(e.parent))e.parent.data.pendingInsert=t;else for(var i=0;i<t.length;++i)t[i].data.hook.insert(t[i])}function C(e,t,n){if(o(t.isComment)&&r(t.asyncFactory))return t.elm=e,t.isAsyncPlaceholder=!0,!0;t.elm=e;var i=t.tag,a=t.data,s=t.children;if(r(a)&&(r(k=a.hook)&&r(k=k.init)&&k(t,!0),r(k=t.componentInstance)))return u(t,n),!0;if(r(i)){if(r(s))if(e.hasChildNodes()){for(var l=!0,c=e.firstChild,d=0;d<s.length;d++){if(!c||!C(c,s[d],n)){l=!1;break}c=c.nextSibling}if(!l||c)return!1}else h(t,s,n);if(r(a))for(var f in a)if(!T(f)){m(t,n);break}}else e.data!==t.text&&(e.data=t.text);return!0}var k,S,O={},I=e.modules,j=e.nodeOps;for(k=0;k<Or.length;++k)for(O[Or[k]]=[],S=0;S<I.length;++S)r(I[S][Or[k]])&&O[Or[k]].push(I[S][Or[k]]);var T=p("attrs,style,class,staticClass,staticStyle,key");return function(e,i,a,s,c,u){if(!n(i)){var d=!1,f=[];if(n(e))d=!0,l(i,f,c,u);else{var p=r(e.nodeType);if(!p&&Mt(e,i))x(e,i,f,s);else{if(p){if(1===e.nodeType&&e.hasAttribute(_n)&&(e.removeAttribute(_n),a=!0),o(a)&&C(e,i,f))return E(i,f,!0),e;e=t(e)}var h=e.elm,m=j.parentNode(h);if(l(i,f,h._leaveCb?null:m,j.nextSibling(h)),r(i.parent)){for(var y=i.parent;y;)y.elm=i.elm,y=y.parent;if(v(i))for(var g=0;g<O.create.length;++g)O.create[g](Sr,i.parent)}r(m)?A(m,[e],0,0):r(e.tag)&&b(e)}}return E(i,f,d),i.elm}r(e)&&b(e)}}({nodeOps:Cr,modules:[Lr,Pr,Mr,Br,{create:Kt,activate:Kt,remove:function(e,t){function n(){function t(){n.transition(r.ref,{styles:m,duration:y.duration||0,delay:y.delay||0,timingFunction:y.timingFunction||"linear"},p?w:g)}var n=e.context.$requireWeexModule("animation");g.cancelled||(e.data.show||((r.parentNode._pending||(r.parentNode._pending={}))[e.key]=e),l&&l(r),v?n.transition(r.ref,{styles:v},t):t(),c&&c(r,g),m||p||g())}var r=e.elm;r._enterCb&&(r._enterCb.cancelled=!0,r._enterCb());var o=Jt(e.data.transition);if(!o)return t();if(!r._leaveCb){var i=o.leaveClass,a=o.leaveToClass,s=o.leaveActiveClass,l=o.beforeLeave,c=o.leave,u=o.afterLeave,d=o.leaveCancelled,f=o.delayLeave,p=c&&(c._length||c.length)>1,h=e.context.$options.style||{},v=h[i],m=h[a]||h[s],y=h["@TRANSITION"]&&h["@TRANSITION"][s]||{},g=r._leaveCb=E(function(){r.parentNode&&r.parentNode._pending&&(r.parentNode._pending[e.key]=null),g.cancelled?d&&d(r):(t(),u&&u(r)),r._leaveCb=null});f?f(n):n()}}}].concat(Tr),LONG_LIST_THRESHOLD:10})),Dr={},Wr=/^([+-]?[0-9]+(\.[0-9]+)?)(px|em|ex|%|in|cm|mm|pt|pc)$/i,$r={name:"richtext",render:function(e){return e("weex:richtext",{on:this._events,attrs:{value:rn(this.$options._renderChildren||[])}})}},Qr={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]},Ur={name:"transition",props:Qr,abstract:!0,render:function(e){var t=this,n=this.$options._renderChildren;if(n&&(n=n.filter(function(e){return e.tag||un(e)})).length){var r=this.mode,o=n[0];if(ln(this.$vnode))return o;var i=on(o);if(!i)return o;if(this._leaving)return sn(e,o);var s="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?s+"comment":s+i.tag:a(i.key)?0===String(i.key).indexOf(s)?i.key:s+i.key:i.key;var l=(i.data||(i.data={})).transition=an(this),c=this._vnode,u=on(c);if(i.data.directives&&i.data.directives.some(function(e){return"show"===e.name})&&(i.data.show=!0),u&&u.data&&!cn(i,u)&&!un(u)){var d=u&&(u.data.transition=b({},l));if("out-in"===r)return this._leaving=!0,re(d,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),sn(e,o);if("in-out"===r){if(un(i))return c;var f,p=function(){f()};re(l,"afterEnter",p),re(l,"enterCancelled",p),re(d,"delayLeave",function(e){f=e})}}return o}}},zr=b({tag:String,moveClass:String},Qr);delete zr.mode;var Vr={Richtext:$r,Transition:Ur,TransitionGroup:{props:zr,created:function(){var e=this.$requireWeexModule("dom");this.getPosition=function(t){return new Promise(function(n,r){e.getComponentRect(t.ref,function(e){e.result?n(e.size):r(new Error("failed to get rect for element: "+t.tag))})})};var t=this.$requireWeexModule("animation");this.animate=function(e,n){return new Promise(function(r){t.transition(e.ref,n,r)})}},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=an(this),s=0;s<o.length;s++){var l=o[s];l.tag&&null!=l.key&&0!==String(l.key).indexOf("__vlist")&&(i.push(l),n[l.key]=l,(l.data||(l.data={})).transition=a)}if(r){var c=[],u=[];r.forEach(function(e){e.data.transition=a,n[e.key]?c.push(e):u.push(e)}),this.kept=e(t,null,c),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]}}}},Hr=p("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),Gr=(p("web,spinner,switch,video,textarea,canvas,indicator,marquee,countdown",!0),p("richtext,trisition,trisition-group",!0));p("embed,img,image,input,link,meta",!0);wt.config.mustUseProp=function(){},wt.config.isReservedTag=Hr,wt.config.isRuntimeComponent=Gr,wt.config.isUnknownElement=function(){},wt.options.directives=Dr,wt.options.components=Vr,wt.prototype.__patch__=Fr,wt.prototype.$mount=function(e,t){return _e(this,e&&dn(0,this.$document),t)},e.Vue=wt}}),du=n(function(e,t){function n(e){for(var t in e)delete e[t]}function r(e,t,n,r,o){var i=e.document.getRef(t);return i?e.document.fireEvent(i,n,r,o):new Error('invalid element reference "'+t+'"')}function o(e,t,n,r){var o=e.document.taskCenter.callback(t,n,r);return e.document.taskCenter.send("dom",{action:"updateFinish"},[]),o}function i(e,t){return"string"==typeof t?!(!m[e]||!m[e][t]):!!m[e]}function a(e){return!!y[e]}function s(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 i(r,o);case"component":return a(r)}}return null}function l(e,t){var n={};h(n,g);var r=n.Vue,o=v[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)&&y[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,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}}}),r.prototype.$getConfig=function(){if(o.app instanceof r)return o.config},r}function c(e){var t=v[e];return function(e){var n=m[e]||[],r={};for(var o in n)!function(n){Object.defineProperty(r,n,{enumerable:!0,configurable:!0,get:function(){return function(){for(var r=arguments,o=[],i=arguments.length;i--;)o[i]=r[i];return t.document.taskCenter.send("module",{module:e,method:n},o)}},set:function(r){if("function"==typeof r)return t.document.taskCenter.send("module",{module:e,method:n},[r])}})}(o);return r}}function u(e,t){var n=v[e],r=t("timer");return{setTimeout:function(){for(var e=arguments,t=[],o=arguments.length;o--;)t[o]=e[o];return r.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),n.document.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=arguments,t=[],o=arguments.length;o--;)t[o]=e[o];return r.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),n.document.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){r.clearTimeout(e)},clearInterval:function(e){r.clearInterval(e)}}}function d(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);return n.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}function f(e,t){if("function"!=typeof g.compileBundle)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 l=0;l<i.length-1;++l)o+=i[l],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var c=(e.weex||{}).config||{};(n=g.compileBundle(o,c.bundleUrl,c.bundleDigest,c.codeCachePath))&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}Object.defineProperty(t,"__esModule",{value:!0});var p=1,h=uu,v={},m={},y={},g={TextNode:function(e){this.instanceId="",this.nodeId=p++,this.parentNode=null,this.nodeType=3,this.text=e},instances:v,modules:m,components:y},b={fireEvent:function(e){for(var t=arguments,n=[],o=arguments.length-1;o-- >0;)n[o]=t[o+1];return r.apply(void 0,[v[e]].concat(n))},callback:function(e){for(var t=arguments,n=[],r=arguments.length-1;r-- >0;)n[r]=t[r+1];return o.apply(void 0,[v[e]].concat(n))}};t.init=function(e){g.Document=e.Document,g.Element=e.Element,g.Comment=e.Comment,g.compileBundle=e.compileBundle},t.reset=function(){n(v),n(m),n(y),delete g.Document,delete g.Element,delete g.Comment,delete g.compileBundle},t.createInstance=function(e,t,n,r,o){void 0===t&&(t=""),void 0===n&&(n={}),void 0===o&&(o={});var i=new g.Document(e,n.bundleUrl),a=v[e]={instanceId:e,config:n,data:r,document:i},p=c(e),h=u(e,p),m={config:n,document:i,supports:s,requireModule:p};Object.freeze(m);var y=a.Vue=l(e,p),b=Object.assign({Vue:y,weex:m},h,o.services);return t="(function(global){ \n"+t+"\n })(Object.create(this))",f(b,t)||d(b,t),h.setTimeout(function(){a.document.taskCenter.send("dom",{action:"createFinish"},[])},0),a},t.destroyInstance=function(e){var t=v[e];t&&t.app instanceof t.Vue&&(t.document.destroy(),t.app.$destroy()),delete v[e]},t.refreshInstance=function(e,t){var n=v[e];if(!(n&&n.app instanceof n.Vue))return new Error("refreshInstance: instance "+e+" not found!");for(var r in t)n.Vue.set(n.app,r,t[r]);n.document.taskCenter.send("dom",{action:"refreshFinish"},[])},t.getRoot=function(e){var t=v[e];return t&&t.app instanceof t.Vue?t.app.$el.toJSON():new Error("getRoot: instance "+e+" not found!")},t.receiveTasks=function(e,t){if(v[e]&&Array.isArray(t)){var n=[];return t.forEach(function(t){var r=b[t.method],o=[].concat(t.args);"function"==typeof r&&(o.unshift(e),n.push(r.apply(void 0,o)))}),n}return new Error('invalid instance id "'+e+'" or tasks')},t.registerModules=function(e){for(var t in e)!function(t){m[t]||(m[t]={}),e[t].forEach(function(e){"string"==typeof e?m[t][e]=!0:m[t][e.name]=e.args})}(t)},t.isRegisteredModule=i,t.registerComponents=function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?y[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(y[e.type]=e))})},t.isRegisteredComponent=a,t.supports=s}),fu=t(du),pu=du.supports,hu=du.isRegisteredComponent,vu=du.registerComponents,mu=du.isRegisteredModule,yu=du.registerModules,gu=du.receiveTasks,bu=du.getRoot,Au=du.refreshInstance,wu=du.destroyInstance,_u=du.createInstance,xu=du.reset,Eu=du.init,Cu=Object.freeze({default:fu,__moduleExports:du,supports:pu,isRegisteredComponent:hu,registerComponents:vu,isRegisteredModule:mu,registerModules:yu,receiveTasks:gu,getRoot:bu,refreshInstance:Au,destroyInstance:wu,createInstance:_u,reset:xu,init:Eu}),ku=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,t,n){var r=this,o=this.$el(e);o&&t&&t.styles&&this._app.requireModule("animation").transition(o.ref,t,function(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];r._setStyle(o,t.styles),n&&n.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;r-- >0;)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)}}),Su=Object.prototype.hasOwnProperty,Ou=Object.prototype.toString,Iu="[object Object]",ju="__proto__"in{};"undefined"!=typeof Set&&Set.toString().match(/native code/)?iu=Set:((iu=function(){this.set=Object.create(null)}).prototype.has=function(e){return void 0!==this.set[e]},iu.prototype.add=function(e){null==e||this.set[e]||(this.set[e]=1)},iu.prototype.clear=function(){this.set=Object.create(null)});var Tu=/^@weex-component\//,Lu=/^@weex-module\//,Pu=/^\.{1,2}\//,Mu=/\.js$/,Nu=function(e){return!!e.match(Tu)},Bu=function(e){return!!e.match(Lu)},Ru=function(e){return!!e.match(Pu)},Fu=function(e){return!Nu(e)&&!Bu(e)&&!Ru(e)},Du=0;fe.target=null;var Wu=[];fe.prototype.addSub=function(e){this.subs.push(e)},fe.prototype.removeSub=function(e){ne(this.subs,e)},fe.prototype.depend=function(){fe.target&&fe.target.addDep(this)},fe.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()};var $u=0;me.prototype.get=function(){pe(this);var e=this.getter.call(this.vm,this.vm);return this.deep&&ye(e),he(),this.cleanupDeps(),e},me.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))},me.prototype.cleanupDeps=function(){for(var e=this,t=this.deps.length;t--;){var n=e.deps[t];e.newDepIds.has(n.id)||n.removeSub(e)}var r=this.depIds;this.depIds=this.newDepIds,this.newDepIds=r,this.newDepIds.clear(),r=this.deps,this.deps=this.newDeps,this.newDeps=r,this.newDeps.length=0},me.prototype.update=function(e){this.lazy?this.dirty=!0:this.run()},me.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||(ie(e)||this.deep)&&!this.shallow){var t=this.value;this.value=e,this.cb.call(this.vm,e,t)}this.queued=this.shallow=!1}},me.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},me.prototype.depend=function(){for(var e=this,t=this.deps.length;t--;)e.deps[t].depend()},me.prototype.teardown=function(){var e=this;if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||ne(this.vm._watchers,this);for(var t=this.deps.length;t--;)e.deps[t].removeSub(e);this.active=!1,this.vm=this.cb=this.value=null}};var Qu=le(),Uu=Array.prototype,zu=Object.create(Uu);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=Uu[e];te(zu,e,function(){for(var n=arguments,r=arguments.length,o=new Array(r);r--;)o[r]=n[r];var i,a=t.apply(this,o),s=this.__ob__;switch(e){case"push":case"unshift":i=o;break;case"splice":i=o.slice(2)}return i&&s.observeArray(i),s.dep.notify(),a})}),te(Uu,"$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]}),te(Uu,"$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)),e>-1&&this.splice(e,1))});var Vu=Object.getOwnPropertyNames(zu);ge.prototype.walk=function(e){var t=this;for(var n in e)t.convert(n,e[n])},ge.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)we(e[t])},ge.prototype.convert=function(e,t){_e(this.value,e,t)},ge.prototype.addVm=function(e){(this.vms||(this.vms=[])).push(e)},ge.prototype.removeVm=function(e){ne(this.vms,e)};var Hu=["$index","$value","$event"],Gu={nativeComponentMap:{text:!0,image:!0,container:!0,slider:{type:"slider",append:"tree"},cell:{type:"cell",append:"tree"}}},qu=Gu.nativeComponentMap,Yu={attr:"setAttr",style:"setStyle",event:"addEvent"},Ju=1,Ku=["init","created","ready","destroyed"];!function(e){e.$emit=St,e.$dispatch=Ot,e.$broadcast=It,e.$on=jt,e.$off=Tt}(Pt.prototype),Pt.prototype.$watch=function(e,t){qe(this,e,t)},Pt.set=xe,Pt.delete=function(e,t){if(re(e,t)){delete e[t];var n=e.__ob__;if(n){if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;)Ce(n.vms[r],t)}else e._isVue&&delete e._data[t]}};var Zu={},Xu=n(function(e,t){function n(e,t){if(e instanceof r)return e;if("string"!=typeof e)return null;if(e.length>I)return null;if(!(t?T[q]:T[V]).test(e))return null;try{return new r(e,t)}catch(e){return null}}function r(e,t){if(e instanceof r){if(e.loose===t)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>I)throw new TypeError("version is longer than "+I+" characters");if(!(this instanceof r))return new r(e,t);O("SemVer",e,t),this.loose=t;var n=e.trim().match(t?T[q]:T[V]);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>j||this.major<0)throw new TypeError("Invalid major version");if(this.minor>j||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>j||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(t>=0&&t<j)return t}return e}):this.prerelease=[],this.build=n[5]?n[5].split("."):[],this.format()}function o(e,t){var n=ye.test(e),r=ye.test(t);return n&&r&&(e=+e,t=+t),n&&!r?-1:r&&!n?1:e<t?-1:e>t?1:0}function i(e,t,n){return new r(e,n).compare(new r(t,n))}function a(e,t,n){return i(e,t,n)>0}function s(e,t,n){return i(e,t,n)<0}function l(e,t,n){return 0===i(e,t,n)}function c(e,t,n){return 0!==i(e,t,n)}function u(e,t,n){return i(e,t,n)>=0}function d(e,t,n){return i(e,t,n)<=0}function f(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=l(e,n,r);break;case"!=":o=c(e,n,r);break;case">":o=a(e,n,r);break;case">=":o=u(e,n,r);break;case"<":o=s(e,n,r);break;case"<=":o=d(e,n,r);break;default:throw new TypeError("Invalid operator: "+t)}return o}function p(e,t){if(e instanceof p){if(e.loose===t)return e;e=e.value}if(!(this instanceof p))return new p(e,t);O("comparator",e,t),this.loose=t,this.parse(e),this.semver===ge?this.value="":this.value=this.operator+this.semver.version,O("comp",this)}function h(e,t){if(e instanceof h)return e.loose===t?e:new h(e.raw,t);if(e instanceof p)return new h(e.value,t);if(!(this instanceof h))return new h(e,t);if(this.loose=t,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 v(e,t){return O("comp",e),e=b(e,t),O("caret",e),e=y(e,t),O("tildes",e),e=w(e,t),O("xrange",e),e=x(e,t),O("stars",e),e}function m(e){return!e||"x"===e.toLowerCase()||"*"===e}function y(e,t){return e.trim().split(/\s+/).map(function(e){return g(e,t)}).join(" ")}function g(e,t){var n=t?T[ie]:T[oe];return e.replace(n,function(t,n,r,o,i){O("tilde",e,t,n,r,o,i);var a;return m(n)?a="":m(r)?a=">="+n+".0.0 <"+(+n+1)+".0.0":m(o)?a=">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0":i?(O("replaceTilde pr",i),"-"!==i.charAt(0)&&(i="-"+i),a=">="+n+"."+r+"."+o+i+" <"+n+"."+(+r+1)+".0"):a=">="+n+"."+r+"."+o+" <"+n+"."+(+r+1)+".0",O("tilde return",a),a})}function b(e,t){return e.trim().split(/\s+/).map(function(e){return A(e,t)}).join(" ")}function A(e,t){O("caret",e,t);var n=t?T[ce]:T[le];return e.replace(n,function(t,n,r,o,i){O("caret",e,t,n,r,o,i);var a;return m(n)?a="":m(r)?a=">="+n+".0.0 <"+(+n+1)+".0.0":m(o)?a="0"===n?">="+n+"."+r+".0 <"+n+"."+(+r+1)+".0":">="+n+"."+r+".0 <"+(+n+1)+".0.0":i?(O("replaceCaret pr",i),"-"!==i.charAt(0)&&(i="-"+i),a="0"===n?"0"===r?">="+n+"."+r+"."+o+i+" <"+n+"."+r+"."+(+o+1):">="+n+"."+r+"."+o+i+" <"+n+"."+(+r+1)+".0":">="+n+"."+r+"."+o+i+" <"+(+n+1)+".0.0"):(O("no pr"),a="0"===n?"0"===r?">="+n+"."+r+"."+o+" <"+n+"."+r+"."+(+o+1):">="+n+"."+r+"."+o+" <"+n+"."+(+r+1)+".0":">="+n+"."+r+"."+o+" <"+(+n+1)+".0.0"),O("caret return",a),a})}function w(e,t){return O("replaceXRanges",e,t),e.split(/\s+/).map(function(e){return _(e,t)}).join(" ")}function _(e,t){e=e.trim();var n=t?T[te]:T[ee];return e.replace(n,function(t,n,r,o,i,a){O("xRange",e,t,n,r,o,i,a);var s=m(r),l=s||m(o),c=l||m(i),u=c;return"="===n&&u&&(n=""),s?t=">"===n||"<"===n?"<0.0.0":"*":n&&u?(l&&(o=0),c&&(i=0),">"===n?(n=">=",l?(r=+r+1,o=0,i=0):c&&(o=+o+1,i=0)):"<="===n&&(n="<",l?r=+r+1:o=+o+1),t=n+r+"."+o+"."+i):l?t=">="+r+".0.0 <"+(+r+1)+".0.0":c&&(t=">="+r+"."+o+".0 <"+r+"."+(+o+1)+".0"),O("xRange return",t),t})}function x(e,t){return O("replaceStars",e,t),e.trim().replace(T[ve],"")}function E(e,t,n,r,o,i,a,s,l,c,u,d,f){return t=m(n)?"":m(r)?">="+n+".0.0":m(o)?">="+n+"."+r+".0":">="+t,s=m(l)?"":m(c)?"<"+(+l+1)+".0.0":m(u)?"<"+l+"."+(+c+1)+".0":d?"<="+l+"."+c+"."+u+"-"+d:"<="+s,(t+" "+s).trim()}function C(e,t){for(n=0;n<e.length;n++)if(!e[n].test(t))return!1;if(t.prerelease.length){for(var n=0;n<e.length;n++)if(O(e[n].semver),e[n].semver!==ge&&e[n].semver.prerelease.length>0){var r=e[n].semver;if(r.major===t.major&&r.minor===t.minor&&r.patch===t.patch)return!0}return!1}return!0}function k(e,t,n){try{t=new h(t,n)}catch(e){return!1}return t.test(e)}function S(e,t,n,o){e=new r(e,o),t=new h(t,o);var i,l,c,f,v;switch(n){case">":i=a,l=d,c=s,f=">",v=">=";break;case"<":i=s,l=u,c=a,f="<",v="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(k(e,t,o))return!1;for(var m=0;m<t.set.length;++m){var y=null,g=null;if(t.set[m].forEach(function(e){e.semver===ge&&(e=new p(">=0.0.0")),y=y||e,g=g||e,i(e.semver,y.semver,o)?y=e:c(e.semver,g.semver,o)&&(g=e)}),y.operator===f||y.operator===v)return!1;if((!g.operator||g.operator===f)&&l(e,g.semver))return!1;if(g.operator===v&&c(e,g.semver))return!1}return!0}t=e.exports=r;var O;"object"==typeof process&&process.env,O=function(){},t.SEMVER_SPEC_VERSION="2.0.0";var I=256,j=Number.MAX_SAFE_INTEGER||9007199254740991,T=t.re=[],L=t.src=[],P=0,M=P++;L[M]="0|[1-9]\\d*";var N=P++;L[N]="[0-9]+";var B=P++;L[B]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var R=P++;L[R]="("+L[M]+")\\.("+L[M]+")\\.("+L[M]+")";var F=P++;L[F]="("+L[N]+")\\.("+L[N]+")\\.("+L[N]+")";var D=P++;L[D]="(?:"+L[M]+"|"+L[B]+")";var W=P++;L[W]="(?:"+L[N]+"|"+L[B]+")";var $=P++;L[$]="(?:-("+L[D]+"(?:\\."+L[D]+")*))";var Q=P++;L[Q]="(?:-?("+L[W]+"(?:\\."+L[W]+")*))";var U=P++;L[U]="[0-9A-Za-z-]+";var z=P++;L[z]="(?:\\+("+L[U]+"(?:\\."+L[U]+")*))";var V=P++,H="v?"+L[R]+L[$]+"?"+L[z]+"?";L[V]="^"+H+"$";var G="[v=\\s]*"+L[F]+L[Q]+"?"+L[z]+"?",q=P++;L[q]="^"+G+"$";var Y=P++;L[Y]="((?:<|>)?=?)";var J=P++;L[J]=L[N]+"|x|X|\\*";var K=P++;L[K]=L[M]+"|x|X|\\*";var Z=P++;L[Z]="[v=\\s]*("+L[K]+")(?:\\.("+L[K]+")(?:\\.("+L[K]+")(?:"+L[$]+")?"+L[z]+"?)?)?";var X=P++;L[X]="[v=\\s]*("+L[J]+")(?:\\.("+L[J]+")(?:\\.("+L[J]+")(?:"+L[Q]+")?"+L[z]+"?)?)?";var ee=P++;L[ee]="^"+L[Y]+"\\s*"+L[Z]+"$";var te=P++;L[te]="^"+L[Y]+"\\s*"+L[X]+"$";var ne=P++;L[ne]="(?:~>?)";var re=P++;L[re]="(\\s*)"+L[ne]+"\\s+",T[re]=new RegExp(L[re],"g");var oe=P++;L[oe]="^"+L[ne]+L[Z]+"$";var ie=P++;L[ie]="^"+L[ne]+L[X]+"$";var ae=P++;L[ae]="(?:\\^)";var se=P++;L[se]="(\\s*)"+L[ae]+"\\s+",T[se]=new RegExp(L[se],"g");var le=P++;L[le]="^"+L[ae]+L[Z]+"$";var ce=P++;L[ce]="^"+L[ae]+L[X]+"$";var ue=P++;L[ue]="^"+L[Y]+"\\s*("+G+")$|^$";var de=P++;L[de]="^"+L[Y]+"\\s*("+H+")$|^$";var fe=P++;L[fe]="(\\s*)"+L[Y]+"\\s*("+G+"|"+L[Z]+")",T[fe]=new RegExp(L[fe],"g");var pe=P++;L[pe]="^\\s*("+L[Z]+")\\s+-\\s+("+L[Z]+")\\s*$";var he=P++;L[he]="^\\s*("+L[X]+")\\s+-\\s+("+L[X]+")\\s*$";var ve=P++;L[ve]="(<|>)?=?\\s*\\*";for(var me=0;me<P;me++)O(me,L[me]),T[me]||(T[me]=new RegExp(L[me]));t.parse=n,t.valid=function(e,t){var r=n(e,t);return r?r.version:null},t.clean=function(e,t){var r=n(e.trim().replace(/^[=v]+/,""),t);return r?r.version:null},t.SemVer=r,r.prototype.format=function(){return this.version=this.major+"."+this.minor+"."+this.patch,this.prerelease.length&&(this.version+="-"+this.prerelease.join(".")),this.version},r.prototype.toString=function(){return this.version},r.prototype.compare=function(e){return O("SemVer.compare",this.version,this.loose,e),e instanceof r||(e=new r(e,this.loose)),this.compareMain(e)||this.comparePre(e)},r.prototype.compareMain=function(e){return e instanceof r||(e=new r(e,this.loose)),o(this.major,e.major)||o(this.minor,e.minor)||o(this.patch,e.patch)},r.prototype.comparePre=function(e){var t=this;if(e instanceof r||(e=new r(e,this.loose)),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 n=0;do{var i=t.prerelease[n],a=e.prerelease[n];if(O("prerelease compare",n,i,a),void 0===i&&void 0===a)return 0;if(void 0===a)return 1;if(void 0===i)return-1;if(i!==a)return o(i,a)}while(++n)},r.prototype.inc=function(e,t){var n=this;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 r=this.prerelease.length;--r>=0;)"number"==typeof n.prerelease[r]&&(n.prerelease[r]++,r=-2);-1===r&&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},t.inc=function(e,t,n,o){"string"==typeof n&&(o=n,n=void 0);try{return new r(e,n).inc(t,o).version}catch(e){return null}},t.diff=function(e,t){if(l(e,t))return null;var r=n(e),o=n(t);if(r.prerelease.length||o.prerelease.length){for(var i in r)if(("major"===i||"minor"===i||"patch"===i)&&r[i]!==o[i])return"pre"+i;return"prerelease"}for(var i in r)if(("major"===i||"minor"===i||"patch"===i)&&r[i]!==o[i])return i},t.compareIdentifiers=o;var ye=/^[0-9]+$/;t.rcompareIdentifiers=function(e,t){return o(t,e)},t.major=function(e,t){return new r(e,t).major},t.minor=function(e,t){return new r(e,t).minor},t.patch=function(e,t){return new r(e,t).patch},t.compare=i,t.compareLoose=function(e,t){return i(e,t,!0)},t.rcompare=function(e,t,n){return i(t,e,n)},t.sort=function(e,n){return e.sort(function(e,r){return t.compare(e,r,n)})},t.rsort=function(e,n){return e.sort(function(e,r){return t.rcompare(e,r,n)})},t.gt=a,t.lt=s,t.eq=l,t.neq=c,t.gte=u,t.lte=d,t.cmp=f,t.Comparator=p;var ge={};p.prototype.parse=function(e){var t=this.loose?T[ue]:T[de],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 r(n[2],this.loose):this.semver=ge},p.prototype.toString=function(){return this.value},p.prototype.test=function(e){return O("Comparator.test",e,this.loose),this.semver===ge||("string"==typeof e&&(e=new r(e,this.loose)),f(e,this.operator,this.semver,this.loose))},p.prototype.intersects=function(e,t){if(!(e instanceof p))throw new TypeError("a Comparator is required");var n;if(""===this.operator)return n=new h(e.value,t),k(this.value,n,t);if(""===e.operator)return n=new h(this.value,t),k(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=f(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),l=f(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||o||i&&a||s||l},t.Range=h,h.prototype.format=function(){return this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim(),this.range},h.prototype.toString=function(){return this.range},h.prototype.parseRange=function(e){var t=this.loose;e=e.trim(),O("range",e,t);var n=t?T[he]:T[pe];e=e.replace(n,E),O("hyphen replace",e),e=e.replace(T[fe],"$1$2$3"),O("comparator trim",e,T[fe]),e=(e=(e=e.replace(T[re],"$1~")).replace(T[se],"$1^")).split(/\s+/).join(" ");var r=t?T[ue]:T[de],o=e.split(" ").map(function(e){return v(e,t)}).join(" ").split(/\s+/);return this.loose&&(o=o.filter(function(e){return!!e.match(r)})),o=o.map(function(e){return new p(e,t)})},h.prototype.intersects=function(e,t){if(!(e instanceof h))throw new TypeError("a Range is required");return this.set.some(function(n){return n.every(function(n){return e.set.some(function(e){return e.every(function(e){return n.intersects(e,t)})})})})},t.toComparators=function(e,t){return new h(e,t).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})},h.prototype.test=function(e){var t=this;if(!e)return!1;"string"==typeof e&&(e=new r(e,this.loose));for(var n=0;n<this.set.length;n++)if(C(t.set[n],e))return!0;return!1},t.satisfies=k,t.maxSatisfying=function(e,t,n){var o=null,i=null;try{var a=new h(t,n)}catch(e){return null}return e.forEach(function(e){a.test(e)&&(o&&-1!==i.compare(e)||(i=new r(o=e,n)))}),o},t.minSatisfying=function(e,t,n){var o=null,i=null;try{var a=new h(t,n)}catch(e){return null}return e.forEach(function(e){a.test(e)&&(o&&1!==i.compare(e)||(i=new r(o=e,n)))}),o},t.validRange=function(e,t){try{return new h(e,t).range||"*"}catch(e){return null}},t.ltr=function(e,t,n){return S(e,t,"<",n)},t.gtr=function(e,t,n){return S(e,t,">",n)},t.outside=S,t.prerelease=function(e,t){var r=n(e,t);return r&&r.prerelease.length?r.prerelease:null},t.intersects=function(e,t,n){return e=new h(e,n),t=new h(t,n),e.intersects(t)}}),ed=function(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];console.debug("[JS Framework] define a component "+t);var o,i;if("function"==typeof(i=n.length>1?n[1]:n[0])&&(o=i,i=null),o){var a={exports:{}};o(function(t){if(Nu(t)){var n=ue(t);return Rt(e,n)}if(Bu(t)){var r=ue(t);return e.requireModule(r)}if(Ru(t)||Fu(t)){var o=de(t);return e.commonModules[o]}},a.exports,a),i=a.exports}if(Nu(t)){var s=ue(t);Ft(e,s,i)}else if(Bu(t)){var l;Mt((l={},l[ue(t)]=i,l))}else if(Ru(t)){var c=de(t);e.commonModules[c]=i}else if(Fu(t)){var u=de(t);i.template||i.style||i.methods?Ft(e,u,i):e.commonModules[u]=i}},td=function(e){this.id=e,this.map=[],this.hooks=[]};td.prototype.isEmpty=function(){return 0===this.map.length},td.prototype.append=function(e,t,n,r){var o=this;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},td.prototype.flush=function(e){var t=this.map.slice();this.map.length=0,t.forEach(function(e){nn(e,"repeat"),nn(e,"shown"),rn(e,"element")});var n=this.hooks.slice();this.hooks.length=0,n.forEach(function(e){e()}),this.isEmpty()||this.flush()},td.prototype.then=function(e){this.hooks.push(e)},on.prototype.requireModule=function(e){return Bt(this,e)},on.prototype.updateActions=function(){return Kt(this)},on.prototype.callTasks=function(e){return Zt(this,e)},Object.freeze(on),Object.freeze(on.prototype);var nd={},rd=Gu.nativeComponentMap;global.registerMethods=an;var od={fireEvent:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Yt.apply(void 0,[nd[e]].concat(t))},callback:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Jt.apply(void 0,[nd[e]].concat(t))}};an(ku),Object.freeze(Pt);var id=Object.freeze({registerComponents:function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?rd[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(rd[e.type]=e))})},registerModules:function(e){"object"==typeof e&&Mt(e)},registerMethods:an,createInstance:function(e,t,n,r,o){var i=(o||{}).services;ve();var a=nd[e];n=n||{};var s;return a?s=new Error('invalid instance id "'+e+'"'):(a=new on(e,n),nd[e]=a,s=Xt(a,t,r,i)),s instanceof Error?s:a},init:function(e){Gu.Document=e.Document,Gu.Element=e.Element,Gu.Comment=e.Comment,Gu.sendTasks=e.sendTasks,Gu.Listener=e.Listener},refreshInstance:function(e,t){var n=nd[e];return n?Vt(n,t):new Error('invalid instance id "'+e+'"')},destroyInstance:function(e){"function"==typeof markupState&&markupState(),ve();var t=nd[e];if(!t)return new Error('invalid instance id "'+e+'"');Ht(t),delete nd[e];var n=Math.round(e);return n>0&&(n%18||"function"!=typeof notifyTrimMemory||notifyTrimMemory()),nd},receiveTasks:function(e,t){if(nd[e]&&Array.isArray(t)){var n=[];return t.forEach(function(t){var r=od[t.method],o=[].concat(t.args);"function"==typeof r&&(o.unshift(e),n.push(r.apply(void 0,o)))}),n}return new Error('invalid instance id "'+e+'" or tasks')},getRoot:function(e){var t=nd[e];return t?qt(t):new Error('invalid instance id "'+e+'"')}}),ad={Vanilla:cu,Vue:Cu,Rax:t(n(function(e){e.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t,n){var r=e.exports.createUniqueKey="undefined"!=typeof Symbol?Symbol:function(e){return"[["+e+"_"+Math.random().toFixed(8).slice(2)+"]]"},o=e.exports.isObject=function(e){return"object"==typeof e&&null!==e};e.exports.LISTENERS=r("listeners"),e.exports.CAPTURE=1,e.exports.BUBBLE=2,e.exports.ATTRIBUTE=3,e.exports.newNode=function(e,t,n){var r=o(n);return{listener:e,kind:t,once:r&&Boolean(n.once),passive:r&&Boolean(n.passive),next:null}}},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(){function e(){r(this,e),this._listeners={}}return o(e,[{key:"_addListener",value:function(e,t,n){return this._listeners[e]=this._listeners[e]||[],this._listeners[e].push({listener:t,once:n}),this}},{key:"on",value:function(e,t){return this._addListener(e,t,!1)}},{key:"once",value:function(e,t){return this._addListener(e,t,!0)}},{key:"off",value:function(e,t){return this._listeners[e]&&this._listeners[e].length?t?(this._listeners[e]=this._listeners[e].filter(function(e){return!(e.listener===t)}),this):(delete this._listeners[e],this):this}},{key:"emit",value:function(e,t){var n=this;return this._listeners[e]?(this._listeners[e].forEach(function(r){r.listener.apply(n,[t]),r.once&&n.removeListener(e,r.listener)}),this):this}}]),e}();t.default=i,e.exports=t.default},function(e,t,n){var r=n(0),o=n(15),i=n(16),a=r.isObject,s=r.LISTENERS,l=r.CAPTURE,c=r.BUBBLE,u=r.ATTRIBUTE,d=r.newNode,f=o.defineCustomEventTarget,p=i.createEventWrapper,h=i.STOP_IMMEDIATE_PROPAGATION_FLAG,v=i.PASSIVE_LISTENER_FLAG,m="undefined"!=typeof window&&void 0!==window.EventTarget,y=e.exports=function e(){var t=arguments;if(!(this instanceof e)){if(1===arguments.length&&Array.isArray(arguments[0]))return f(e,arguments[0]);if(arguments.length>0){for(var n=Array(arguments.length),r=0;r<arguments.length;++r)n[r]=t[r];return f(e,n)}throw new TypeError("Cannot call a class as a function")}Object.defineProperty(this,s,{value:Object.create(null)})};y.prototype=Object.create((m?window.EventTarget:Object).prototype,{constructor:{value:y,writable:!0,configurable:!0},addEventListener:{value:function(e,t,n){if(null==t)return!1;if("function"!=typeof t&&"object"!=typeof t)throw new TypeError('"listener" is not an object.');var r=(a(n)?Boolean(n.capture):Boolean(n))?l:c,o=this[s][e];if(null==o)return this[s][e]=d(t,r,n),!0;for(var i=null;null!=o;){if(o.listener===t&&o.kind===r)return!1;i=o,o=o.next}return i.next=d(t,r,n),!0},configurable:!0,writable:!0},removeEventListener:{value:function(e,t,n){var r=this;if(null==t)return!1;for(var o=(a(n)?Boolean(n.capture):Boolean(n))?l:c,i=null,u=this[s][e];null!=u;){if(u.listener===t&&u.kind===o)return null==i?r[s][e]=u.next:i.next=u.next,!0;i=u,u=u.next}return!1},configurable:!0,writable:!0},dispatchEvent:{value:function(e){var t=this,n=e.type,r=this[s][n];if(null==r)return!0;for(var o=p(e,this),i=null;null!=r&&(r.once?null==i?t[s][n]=r.next:i.next=r.next:i=r,o[v]=r.passive,"function"==typeof r.listener?r.listener.call(t,o):r.kind!==u&&"function"==typeof r.listener.handleEvent&&r.listener.handleEvent(o),!o[h]);)r=r.next;return!o.defaultPrevented},configurable:!0,writable:!0}})},function(e,t,n){function r(e,t){var n;for(var r in _)_.hasOwnProperty(r)&&(n=_[r],"*"!==t&&t!==n.origin||(e.target=n.window,n.window.dispatchEvent(e)))}function o(e){e.taskCenter.send("dom",{action:"updateFinish"},[])}function i(e){var t=_[e];if(!t)throw new Error('Invalid instance id "'+e+'"');return t}function a(e,t,n){for(var r in t)e[r]={factory:t[r].bind(n),module:{exports:{}},isInitialized:!1};return e}function s(e,t){if("object"===(void 0===v?"undefined":d(v))){for(var n in v)!function(n){var r=b+n;e[r]={module:{exports:{}},isInitialized:!0},v[n].forEach(function(o){"string"==typeof o&&(o={name:o});var i=o.name;e[r].module.exports[i]=function(){for(var e=arguments,r=arguments.length,o=Array(r),a=0;a<r;a++)o[a]=e[a];var s={},l=o[o.length-1];return l&&"object"===(void 0===l?"undefined":d(l))&&l.__weex_options__&&(s=l.__weex_options__,o.pop()),t.taskCenter.send("module",{module:n,method:i},o,s)}})}(n)}return e}function l(e,t,n,r,i){if(!Array.isArray(t)){var a=e.getRef(t);if(a){var s=e.fireEvent(a,n,r,i);return o(e),s}return new Error('Invalid element reference "'+t+'"')}t.some(function(t){return!1!==l(e,t,n,r)})}Object.defineProperty(t,"__esModule",{value:!0});var c=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),u=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getInstance=i,t.init=function(e){m=e.Document,y=e.Element,g=e.Comment},t.registerComponents=function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?h[e]=!0:"object"===(void 0===e?"undefined":d(e))&&"string"==typeof e.type&&(h[e.type]=e))})},t.registerMethods=function(e){},t.registerModules=function(e){if("object"===(void 0===e?"undefined":d(e)))for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(v[t]=e[t])},t.createInstance=function(e,t,o,i,l){var c=_[e];if(void 0!=c)throw new Error('Instance id "'+e+'" existed when create instance');var h=Date.now(),v="object"===("undefined"==typeof WXEnvironment?"undefined":d(WXEnvironment))&&WXEnvironment||{},y=n(6)(),g="function"==typeof g?g:y.Promise,b="function"==typeof b?b:y.Symbol,C="function"==typeof C?C:y.Set,k="function"==typeof k?k:y.Map,S="function"==typeof S?S:y.WeakMap,O="function"==typeof O?O:y.WeakSet,I=y.URL,j=y.URLSearchParams,T=y.FontFace,L=y.matchMedia,P=o.bundleUrl||"about:blank";o.bundleUrl||console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".');var M=new m(e,P),N=new I(P),B={};c=_[e]={document:M,instanceId:e,bundleUrl:P,bundleCode:t,modules:B,origin:N.origin,uid:0},s(B,M);var R=n(7)(B),F=n(8)(B),D=n(9)(F);n(11)(F,M);var W=n(12)(F,N),$=n(13)(F,g),Q=$.fetch,U=$.Headers,z=$.Request,V=$.Response,H=n(14)(F),G=n(17)(F),q=n(18)(F,M),Y=q.setTimeout,J=q.clearTimeout,K=q.setInterval,Z=q.clearInterval,X=q.requestAnimationFrame,ee=q.cancelAnimationFrame,te=n(19)(),ne=te.atob,re=te.btoa,oe=n(20)(h),ie=n(21)(),ae=ie.Event,se=ie.CustomEvent,le=new p.default,ce={Promise:g,Symbol:b,Map:k,Set:C,WeakMap:S,WeakSet:O,name:"",closed:!1,atob:ne,btoa:re,performance:oe,document:M,location:W,navigator:{product:"Weex",platform:v.platform,appName:v.appName,appVersion:v.appVersion,userAgent:"Weex/"+v.weexVersion+" "+v.platform+"/"+v.osVersion+" ("+v.deviceModel+") "+v.appName+"/"+v.appVersion},screen:{width:v.deviceWidth,height:v.deviceHeight,availWidth:v.deviceWidth,availHeight:v.deviceHeight,colorDepth:24,pixelDepth:24},devicePixelRatio:v.scale,fetch:Q,Headers:U,Response:V,Request:z,XMLHttpRequest:H,URL:I,URLSearchParams:j,FontFace:T,WebSocket:G,Event:ae,CustomEvent:se,matchMedia:L,setTimeout:Y,clearTimeout:J,setInterval:K,clearInterval:Z,requestAnimationFrame:X,cancelAnimationFrame:ee,alert:function(e){F(A).alert({message:e},function(){})},open:function(e){F(w).push({url:e,animated:!0},E)},close:function(){F(w).close({animated:!0},E,E)},postMessage:function(e,t){r({origin:W.origin,data:JSON.parse(JSON.stringify(e)),type:"message",source:ce},t)},addEventListener:function(e,t){le.on(e,t)},removeEventListener:function(e,t){le.off(e,t)},dispatchEvent:function(e){le.emit(e.type,e)},define:R,require:F,__weex_document__:M,__weex_define__:R,__weex_require__:F,__weex_downgrade__:D,__weex_env__:v,__weex_code__:t,__weex_options__:o,__weex_data__:i};c.window=ce.self=ce.window=ce;var ue={},de={};try{ue=l.services.builtinGlobals,de=l.services.builtinModules}catch(e){}if(Object.assign(ce,ue),a(B,u({},f.ModuleFactories,de),ce),"Web"!==v.platform){var fe=oe.timing;fe.domLoading=Date.now();var pe=x[t]?x[t]:new Function('with(this){(function(){"use strict";\n'+t+"\n}).call(this)}");pe.call(ce),fe.domInteractive=fe.domComplete=fe.domInteractive=Date.now(),x[t]=pe}else new Function('"use strict";\n'+t).call(ce)},t.refreshInstance=function(e,t){var n=i(e).document;n.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:t}),n.taskCenter.send("dom",{action:"refreshFinish"},[])},t.destroyInstance=function(e){var t=i(e),n=t.bundleCode;t.window.closed=!0;var r=t.document;r.documentElement.fireEvent("destory",{timestamp:Date.now()}),r.destroy&&r.destroy(),r.taskCenter&&r.taskCenter.destroyCallback&&r.taskCenter.destroyCallback(),delete _[e],delete x[n]},t.getRoot=function(e){var t=i(e).document;return t.toJSON?t.toJSON():{}},t.receiveTasks=function(e,t){var n=i(e);if(Array.isArray(t)){var r=n.document,a=[];return t.forEach(function(e){var t=void 0;if("fireEvent"===e.method){var n=c(e.args,4),i=n[0],s=n[1],u=n[2],d=n[3];t=l(r,i,s,u,d)}else if("callback"===e.method){var f=c(e.args,3),p=f[0],h=f[1],v=f[2];t=r.taskCenter.callback(p,h,v),o(r)}a.push(t)}),a}};var f=n(4),p=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),h={},v={},m=void 0,y=void 0,g=void 0,b="@weex-module/",A=b+"modal",w=b+"navigator",_={},x={},E=function(){};t.default=t},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});t.ModuleFactories={rax:n(5)}},function(e,t){e.exports=function(e,t,n){var r=this.__weex_document__,o=this.document;n.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=15)}([function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={component:null,mountID:1,sandbox:!0,rootComponents:{},rootInstances:{},hook:null,driver:null,monitor:null},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}Object.defineProperty(t,"__esModule",{value:!0});var i=r(n(0)),a=n(7),s=r(n(8)),l=r(n(2)),c=r(n(4)),u=r(n(18)),d=n(3),f="$$instance";t.default={set:function(e,t){e[f]||(e[f]=t,t.rootID&&(i.default.rootInstances[t.rootID]=t,i.default.rootComponents[t.rootID]=t._internal))},get:function(e){return e[f]},remove:function(e){var t=this.get(e);t&&(e[f]=null,t.rootID&&(delete i.default.rootComponents[t.rootID],delete i.default.rootInstances[t.rootID]))},render:function(e,t){i.default.driver.beforeRender&&i.default.driver.beforeRender(),null==t&&(t=i.default.driver.createBody());var n=this.get(t);if(n&&n.isRootComponent){var r=n.getRenderedComponent(),f=r._currentElement;if((0,c.default)(f,e)){var p=r._context;return r.updateComponent(f,e,p,p),n}i.default.hook.Reconciler.unmountComponent(n),(0,s.default)(t)}if(d.isWeb&&t.childNodes)for(var h=[].concat(o(t.childNodes)),v=0;v<h.length;v++){var m=h[v];m.hasAttribute&&m.hasAttribute("data-rendered")&&i.default.driver.removeChild(m,t)}var y=(0,a.createElement)(u.default,null,e),g={},b=(0,l.default)(y).mountComponent(t,g);return this.set(t,b),i.default.driver.afterRender&&i.default.driver.afterRender(b),i.default.hook.Mount._renderNewRootComponent(b._internal),b}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=function(e){return e&&e.__esModule?e:{default:e}}(n(0));t.default=function(e){var t=void 0;if(void 0===e||null===e||!1===e||!0===e)t=new o.default.EmptyComponent;else if(Array.isArray(e))t=new o.default.FragmentComponent(e);else if("object"===(void 0===e?"undefined":r(e))&&e.type)t="string"==typeof e.type?new o.default.NativeComponent(e):new o.default.CompositeComponent(e);else{if("string"!=typeof e&&"number"!=typeof e)throw Error("Invalid element type "+JSON.stringify(e));t=new o.default.TextComponent(e)}return t._mountIndex=0,t},e.exports=t.default},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?function(e){return void 0===e?"undefined":r(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":r(e)};t.isWeb="object"===("undefined"==typeof navigator?"undefined":o(navigator))&&("Mozilla"===navigator.appCodeName||"Gecko"===navigator.product),t.isNode=void 0!==process&&!(!process.versions||!process.versions.node),t.isWeex="function"==typeof callNative,t.isReactNative="undefined"!=typeof __fbBatchedBridgeConfig},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default=function(e,t){var n=null===e,o=null===t;if(n||o)return n===o;var i=void 0===e?"undefined":r(e),a=void 0===t?"undefined":r(t);return"string"===i||"number"===i?"string"===a||"number"===a:"object"===i&&"object"===a&&e.type===t.type&&e.key===t.key},e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(){function e(t,n,o){r(this,e),this.props=t,this.context=n,this.refs={},this.updater=o}return o(e,[{key:"isComponentClass",value:function(){}},{key:"setState",value:function(e,t){this.updater.setState(this,e,t)}},{key:"forceUpdate",value:function(e){this.updater.forceUpdate(this,e)}}]),e}();t.default=i,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(1)),i=r(n(0));t.default={ComponentTree:{getClosestInstanceFromNode:function(e){return o.default.get(e)},getNodeFromInstance:function(e){for(;e._renderedComponent;)e=e._renderedComponent;return e?e._nativeNode:null}},Mount:{_instancesByReactRootID:i.default.rootComponents,_renderNewRootComponent:function(){}},Reconciler:{mountComponent:function(){},receiveComponent:function(){},unmountComponent:function(){}},monitor:null},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(){if(u.default.component){var e=u.default.component.getName();if(e)return" Check the render method of `"+e+"`."}return""}function i(e){if(e){if(Array.isArray(e)){for(var t={},n=0;n<e.length;++n){var r=i(e[n]);if(r)for(var o in r)t[o]=r[o]}return t}return e}}function a(e,t){if(f.isWeex&&"text"===e){var n=t.children;null==t.value&&null!=n&&(Array.isArray(n)?n=n.map(function(e){return"number"==typeof e||"string"==typeof e?e:""}).join(""):"number"!=typeof n&&"string"!=typeof n&&(n=""),t.value=String(n)),t.children=null}return t}function s(e,t){var n=arguments;if(null==e)throw Error("createElement: type should not be null or undefined."+o());var r={},a=void 0,s=null,l=null;if(null!=t){l=void 0===t.ref?null:t.ref,s=void 0===t.key?null:String(t.key);for(a in t)t.hasOwnProperty(a)&&!p.hasOwnProperty(a)&&(r[a]=t[a])}for(var f=arguments.length,v=Array(f>2?f-2:0),m=2;m<f;m++)v[m-2]=n[m];if(v.length&&(r.children=(0,d.default)(v)),e&&e.defaultProps){var y=e.defaultProps;for(a in y)void 0===r[a]&&(r[a]=y[a])}return r.style&&(Array.isArray(r.style)||"object"===c(r.style))&&(r.style=i(r.style)),new h(e,s,l,r,u.default.component)}function l(e){return"object"===(void 0===e?"undefined":c(e))&&null!==e&&e.type&&e.props}Object.defineProperty(t,"__esModule",{value:!0});var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.createElement=s,t.createFactory=function(e){var t=s.bind(null,e);return t.type=e,t},t.cloneElement=function(e,t){var n=arguments;if(!l(e))throw Error("cloneElement: not a valid element."+o());var r=Object.assign({},e.props),i=e.key,a=e.ref,s=e._owner;if(t){void 0!==t.ref&&(a=t.ref,s=u.default.component),void 0!==t.key&&(i=String(t.key));var c=void 0;e.type&&e.type.defaultProps&&(c=e.type.defaultProps);var f=void 0;for(f in t)t.hasOwnProperty(f)&&!p.hasOwnProperty(f)&&(void 0===t[f]&&void 0!==c?r[f]=c[f]:r[f]=t[f])}for(var v=arguments.length,m=Array(v>2?v-2:0),y=2;y<v;y++)m[y-2]=n[y];return m.length&&(r.children=(0,d.default)(m)),new h(e.type,i,a,r,s)},t.isValidElement=l;var u=r(n(0)),d=r(n(17)),f=n(3),p={key:!0,ref:!0},h=function(e,t,n,r,o){return r=a(e,r),{type:e,key:t,ref:n,props:r,_owner:o}};t.default=h},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=r.default.get(e);return!!t&&(r.default.remove(e),t._internal.unmountComponent(),!0)};var r=function(e){return e&&e.__esModule?e:{default:e}}(n(1));e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=r(n(0)),s=r(n(10)),l=r(n(2)),c=r(n(4)),u=r(n(11)),d=r(n(1)),f=/on[A-Z]/,p=function(){function e(t){o(this,e),this._currentElement=t}return i(e,[{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t,this._mountID=a.default.mountID++;var r=this._currentElement.props,o={_internal:this,type:this._currentElement.type,props:r},i=r.append;this._instance=o,this._prevStyleCopy=Object.assign({},r.style);var l=this.getNativeNode();"tree"!==i&&(n?n(l,e):a.default.driver.appendChild(l,e)),this._currentElement&&this._currentElement.ref&&s.default.attach(this._currentElement._owner,this._currentElement.ref,this);var c=r.children;return null!=c&&this.mountChildren(c,t),"tree"===i&&(n?n(l,e):a.default.driver.appendChild(l,e)),a.default.hook.Reconciler.mountComponent(this),o}},{key:"mountChildren",value:function(e,t){var n=this;Array.isArray(e)||(e=[e]);var r=this._renderedChildren={};return e.map(function(e,o){var i=(0,l.default)(e),a=(0,u.default)(r,e,o);return r[a]=i,i._mountIndex=o,i.mountComponent(n.getNativeNode(),t)})}},{key:"unmountChildren",value:function(e){var t=this._renderedChildren;if(t){for(var n in t)t[n].unmountComponent(e);this._renderedChildren=null}}},{key:"unmountComponent",value:function(e){if(this._nativeNode){var t=this._currentElement.ref;t&&s.default.detach(this._currentElement._owner,t,this),d.default.remove(this._nativeNode),e||a.default.driver.removeChild(this._nativeNode,this._parent),a.default.driver.removeAllEventListeners(this._nativeNode)}this.unmountChildren(e),a.default.hook.Reconciler.unmountComponent(this),this._currentElement=null,this._nativeNode=null,this._parent=null,this._context=null,this._instance=null,this._prevStyleCopy=null}},{key:"updateComponent",value:function(e,t,n,r){this._currentElement=t,s.default.update(e,t,this);var o=e.props,i=t.props;this.updateProperties(o,i),this.updateChildren(i.children,r),a.default.hook.Reconciler.receiveComponent(this)}},{key:"updateProperties",value:function(e,t){var n=this,r=void 0,o=void 0,i=void 0;for(r in e)if("children"!==r&&!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if("style"===r){var s=n._prevStyleCopy;for(o in s)s.hasOwnProperty(o)&&((i=i||{})[o]="");n._prevStyleCopy=null}else f.test(r)?"function"==typeof e[r]&&a.default.driver.removeEventListener(n.getNativeNode(),r.slice(2).toLowerCase(),e[r]):a.default.driver.removeAttribute(n.getNativeNode(),r,e[r]);for(r in t){var l=t[r],c="style"===r?n._prevStyleCopy:null!=e?e[r]:void 0;if("children"!==r&&t.hasOwnProperty(r)&&l!==c&&(null!=l||null!=c))if("style"===r)if(l?l=n._prevStyleCopy=Object.assign({},l):n._prevStyleCopy=null,null!=c){for(o in c)!c.hasOwnProperty(o)||l&&l.hasOwnProperty(o)||((i=i||{})[o]="");for(o in l)l.hasOwnProperty(o)&&c[o]!==l[o]&&((i=i||{})[o]=l[o])}else i=l;else f.test(r)?("function"==typeof c&&a.default.driver.removeEventListener(n.getNativeNode(),r.slice(2).toLowerCase(),c),"function"==typeof l&&a.default.driver.addEventListener(n.getNativeNode(),r.slice(2).toLowerCase(),l)):({}[r]=l,null!=l?a.default.driver.setAttribute(n.getNativeNode(),r,l):a.default.driver.removeAttribute(n.getNativeNode(),r,e[r]))}i&&a.default.driver.setStyles(this.getNativeNode(),i)}},{key:"updateChildren",value:function(e,t){var n=this,r=this._renderedChildren;if(null!=e||null!=r){var o={},i={};if(null!=e){Array.isArray(e)||(e=[e]);for(var s=0,d=e.length;s<d;s++){var f=e[s],p=(0,u.default)(o,f,s),h=r&&r[p],v=h&&h._currentElement;if(null!=h&&(0,c.default)(v,f))h.updateComponent(v,f,t,t),o[p]=h;else{if(h){var m=h.getNativeNode();h.unmountComponent(!0),i[p]=m}o[p]=(0,l.default)(f)}}}var y=void 0,g=void 0;if(null!=r)for(var b in r)if(r.hasOwnProperty(b)){var A=r[b],w=!o[b];y?w&&A.unmountComponent():(y=A,g=w)}null!=o&&function(){var e=0,s=0,l=null,c=[];for(var u in o){(function(u){if(!o.hasOwnProperty(u))return"continue";var d=o[u],f=r&&r[u];if(f===d){var p=f.getNativeNode();if(Array.isArray(p)||(p=[p]),f._mountIndex<e){Array.isArray(l)&&(l=l[l.length-1]);for(var h=p.length-1;h>=0;h--)a.default.driver.insertAfter(p[h],l)}c=c.concat(p),e=Math.max(f._mountIndex,e),f._mountIndex=s}else{null!=f&&(e=Math.max(f._mountIndex,e));var v=n.getNativeNode();Array.isArray(v)&&(v=n._parent),d.mountComponent(v,t,function(e,t){var n=i[u];if(Array.isArray(e)||(e=[e]),n){Array.isArray(n)||(n=[n]);for(var r=void 0,o=0;o<e.length;o++){var s=e[o];n[o]?a.default.driver.replaceChild(s,n[o]):a.default.driver.insertAfter(s,r),r=s}if(e.length<n.length)for(var d=e.length;d<n.length;d++)a.default.driver.removeChild(n[d])}else{Array.isArray(l)&&(l=l[l.length-1]);var f=void 0;y&&!l&&(f=y.getNativeNode(),Array.isArray(f)&&(f=f[0]));for(var p=e.length-1;p>=0;p--){var h=e[p];l?a.default.driver.insertAfter(h,l):f?a.default.driver.insertBefore(h,f):a.default.driver.appendChild(h,t)}}c=c.concat(e)}),d._mountIndex=s}s++,l=d.getNativeNode()})(u)}if(Array.isArray(n._nativeNode)){n._nativeNode.splice(0,n._nativeNode.length);for(var d=0;d<c.length;d++)n._nativeNode.push(c[d])}}(),g&&y.unmountComponent(),this._renderedChildren=o}}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=a.default.driver.createElement(this._instance),d.default.set(this._nativeNode,this._instance)),this._nativeNode}},{key:"getPublicInstance",value:function(){return this.getNativeNode()}},{key:"getName",value:function(){return this._currentElement.type}}]),e}();t.default=p,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={update:function(e,t,n){var r=null!=e&&e.ref,o=null!=t&&t.ref;r!==o&&(null!=r&&this.detach(e._owner,r,n),null!=o&&this.attach(t._owner,o,n))},attach:function(e,t,n){if(!e)throw new Error("You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of Rax loaded.");var r=n.getPublicInstance();"function"==typeof t?t(r):e._instance.refs[t]=r},detach:function(e,t,n){if("function"==typeof t)t(null);else{var r=n.getPublicInstance();e._instance.refs[t]===r&&delete e._instance.refs[t]}}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var r=t&&t.key,o="string"==typeof r,i="."+n.toString(36);if(o){var a="$"+r,s=void 0===e[a];return s||console.warn('Encountered two children with the same key "'+r+'".'),s?a:i}return i},e.exports=t.default},function(e,t,n){function r(e){return"string"==typeof e&&-1!==e.indexOf(s)}function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c;return e.replace(l,function(e){return parseFloat(e)*t+"px"})}function i(e,t){return"number"==typeof e&&!a[t]}Object.defineProperty(t,"__esModule",{value:!0}),t.isRem=r,t.calcRem=o,t.getRem=function(){return c},t.setRem=function(e){c=e},t.isUnitNumber=i,t.convertUnit=function(e,t){return t&&i(e,t)?e*c+"px":r(e)?o(e):e};var a={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,lines:!0},s="rem",l=/[-+]?\d*\.?\d+rem/g,c=void 0},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.transformPropsAttrsToStyle=function(e,t){return e.style=e.style||{},t.forEach(function(t){e[t]&&!e.style[t]&&(e.style[t]=e[t],delete e[t])}),e},t.renamePropsAttr=function(e,t,n){return e[t]&&!e[n]&&(e[n]=e[t],delete e[t]),e}},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(0));t.default=function(e){if(null==e)return null;if(e.ownerDocument||e.nodeType)return e;if(e._nativeNode)return e._nativeNode;if("string"==typeof e)return r.default.driver.getElementById(e);if("function"!=typeof e.render)throw new Error("Appears to be neither Component nor DOMNode.");var t=e._internal;if(t){for(;!t._nativeNode;)if(null==(t=t._renderedComponent))return null;return t._nativeNode}throw new Error("findDOMNode was called on an unmounted component.")},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.version=t.setNativeProps=t.findComponentInstance=t.unmountComponentAtNode=t.findDOMNode=t.render=t.PropTypes=t.PureComponent=t.Component=t.createFactory=t.isValidElement=t.cloneElement=t.createElement=void 0,n(16);var o=n(7),i=r(n(5)),a=r(n(19)),s=r(n(20)),l=r(n(21)),c=r(n(14)),u=r(n(8)),d=r(n(42)),f=r(n(43)),p=r(n(44));t.createElement=o.createElement,t.cloneElement=o.cloneElement,t.isValidElement=o.isValidElement,t.createFactory=o.createFactory,t.Component=i.default,t.PureComponent=a.default,t.PropTypes=s.default,t.render=l.default,t.findDOMNode=c.default,t.unmountComponentAtNode=u.default,t.findComponentInstance=d.default,t.setNativeProps=f.default,t.version=p.default},function(e,t,n){var r=function(e){return e&&e.__esModule?e:{default:e}}(n(6));"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject(r.default)},function(e,t,n){function r(e,t){if(Array.isArray(e))for(var n=0,o=e.length;n<o;n++)r(e[n],t);else t.push(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(null==e)return e;var t=[];return r(e,t),1===t.length&&(t=t[0]),t},e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e){return e&&e.__esModule?e:{default:e}}(n(5)),l=1,c=function(e){function t(){var e,n,i,a,s=arguments;r(this,t);for(var c=arguments.length,u=Array(c),d=0;d<c;d++)u[d]=s[d];return n=i=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),i.rootID=l++,a=n,o(i,a)}return i(t,s.default),a(t,[{key:"isRootComponent",value:function(){}},{key:"render",value:function(){return this.props.children}},{key:"getPublicInstance",value:function(){return this.getRenderedComponent().getPublicInstance()}},{key:"getRenderedComponent",value:function(){return this._internal._renderedComponent}}]),t}();t.default=c,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e){return e&&e.__esModule?e:{default:e}}(n(5)),l=function(e){function t(e,n){return r(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n))}return i(t,s.default),a(t,[{key:"isPureComponentClass",value:function(){}}]),t}();t.default=l,e.exports=t.default},function(e,t,n){function r(e){function t(e,t,n,r,i,a){return o}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){return r(function(e,t,n,r,o){})}();t.default={array:o,bool:o,func:o,number:o,object:o,string:o,symbol:o,element:o,node:o,any:o,arrayOf:o,instanceOf:o,objectOf:o,oneOf:o,oneOfType:o,shape:o},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(22)),i=r(n(1));r(n(0));t.default=function(e,t,n,r){"function"==typeof n&&(r=n,n=null),(0,o.default)(n||{});var a=i.default.render(e,t).getPublicInstance();return r&&r.call(a),a},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.driver,n=e.hook,r=e.measurer;if(i.default.EmptyComponent=a.default,i.default.NativeComponent=s.default,i.default.TextComponent=l.default,i.default.FragmentComponent=u.default,i.default.CompositeComponent=c.default,i.default.hook=n||p.default,i.default.measurer=r,!i.default.driver){if(!t)if(o.isWeex)t=d.default;else{if(!o.isWeb)throw Error("No builtin driver matched");t=f.default}i.default.driver=t}};var o=n(3),i=r(n(0)),a=r(n(23)),s=r(n(9)),l=r(n(24)),c=r(n(25)),u=r(n(29)),d=r(n(30)),f=r(n(40)),p=r(n(6));e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(e){return e&&e.__esModule?e:{default:e}}(n(0)),a=function(){function e(){r(this,e),this._currentElement=null}return o(e,[{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t;var r={_internal:this},o=this.getNativeNode();return n?n(o,e):i.default.driver.appendChild(o,e),r}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&i.default.driver.removeChild(this._nativeNode,this._parent),this._nativeNode=null,this._parent=null,this._context=null}},{key:"updateComponent",value:function(){}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=i.default.driver.createEmpty()),this._nativeNode}}]),e}();t.default=a,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(e){return e&&e.__esModule?e:{default:e}}(n(0)),a=function(){function e(t){r(this,e),this._currentElement=t,this._stringText=String(t)}return o(e,[{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t,this._mountID=i.default.mountID++;var r=this.getNativeNode();n?n(r,e):i.default.driver.appendChild(r,e);var o={_internal:this};return i.default.hook.Reconciler.mountComponent(this),o}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&i.default.driver.removeChild(this._nativeNode,this._parent),i.default.hook.Reconciler.unmountComponent(this),this._currentElement=null,this._nativeNode=null,this._parent=null,this._context=null,this._stringText=null}},{key:"updateComponent",value:function(e,t,n){e!==t&&(this._currentElement=t,this._stringText=String(t),i.default.driver.updateText(this.getNativeNode(),this._stringText),i.default.hook.Reconciler.receiveComponent(this))}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=i.default.driver.createText(this._stringText)),this._nativeNode}}]),e}();t.default=a,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){try{return e()}catch(e){if(t)t(e);else{if(!c.default.sandbox)throw e;setTimeout(function(){throw e},0)}}}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=r(n(26)),l=r(n(27)),c=r(n(0)),u=r(n(10)),d=r(n(2)),f=r(n(4)),p=r(n(28)),h=function(){function e(t){o(this,e),this._currentElement=t}return a(e,[{key:"getName",value:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null}},{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t,this._mountID=c.default.mountID++,this._updateCount=0;var r=this._currentElement.type,o=this._currentElement.props,a=r.prototype,f=a&&r.prototype.isComponentClass,p=a&&r.prototype.render,h=this._processContext(t),v=void 0,m=void 0;if(f||p)v=new r(o,h,l.default);else{if("function"!=typeof r)throw Error("Invalid component type "+JSON.stringify(r));v=new s.default(r)}v.props=o,v.context=h,v.refs={},v.updater=l.default,v._internal=this,this._instance=v;var y=v.state;if(void 0===y&&(v.state=y=null),i(function(){v.componentWillMount&&v.componentWillMount()}),null==m){c.default.component=this,v.state=this._processPendingState(o,h);var g=void 0;"function"==typeof v.handleError&&(g=function(e){v.handleError(e)}),i(function(){m=v.render()},g),c.default.component=null}return this._renderedComponent=(0,d.default)(m),this._renderedComponent.mountComponent(this._parent,this._processChildContext(t),n),this._currentElement&&this._currentElement.ref&&u.default.attach(this._currentElement._owner,this._currentElement.ref,this),i(function(){v.componentDidMount&&v.componentDidMount()}),c.default.hook.Reconciler.mountComponent(this),v}},{key:"unmountComponent",value:function(e){var t=this._instance;if(i(function(){t.componentWillUnmount&&t.componentWillUnmount()}),c.default.hook.Reconciler.unmountComponent(this),t._internal=null,null!=this._renderedComponent){var n=this._currentElement.ref;n&&u.default.detach(this._currentElement._owner,n,this),this._renderedComponent.unmountComponent(e),this._renderedComponent=null,this._instance=null}this._currentElement=null,this._pendingStateQueue=null,this._pendingForceUpdate=!1,this._context=null}},{key:"_processContext",value:function(e){var t=this._currentElement.type.contextTypes;if(!t)return{};var n={};for(var r in t)n[r]=e[r];return n}},{key:"_processChildContext",value:function(e){var t=this._instance,n=t.getChildContext&&t.getChildContext();return n?Object.assign({},e,n):e}},{key:"_processPendingState",value:function(e,t){var n=this._instance,r=this._pendingStateQueue;if(!r)return n.state;this._pendingStateQueue=null;for(var o=Object.assign({},n.state),i=0;i<r.length;i++){var a=r[i];Object.assign(o,"function"==typeof a?a.call(n,o,e,t):a)}return o}},{key:"updateComponent",value:function(e,t,n,r){var o=this._instance;o||console.error("Update component '"+this.getName()+"' that has already been unmounted (or failed to mount).");var a=!1,s=void 0,d=void 0;this._context===r?s=o.context:(s=this._processContext(r),a=!0),e===t?d=t.props:(d=t.props,a=!0);var f=a&&o.componentWillReceiveProps;f&&(this._pendingState=!0,i(function(){o.componentWillReceiveProps(d,s)}),this._pendingState=!1),u.default.update(e,t,this);var h=!0,v=o.props,m=o.state,y=this._processPendingState(d,s);if(this._pendingForceUpdate||(o.shouldComponentUpdate?h=i(function(){return o.shouldComponentUpdate(d,y,s)}):o.isPureComponentClass&&(h=!(0,p.default)(v,d)||!(0,p.default)(m,y))),h){this._pendingForceUpdate=!1;var g=o.context;i(function(){o.componentWillUpdate&&o.componentWillUpdate(d,y,s)}),this._currentElement=t,this._context=r,o.props=d,o.state=y,o.context=s,this._updateRenderedComponent(r),i(function(){o.componentDidUpdate&&o.componentDidUpdate(v,m,g)}),this._updateCount++}else this._currentElement=t,this._context=r,o.props=d,o.state=y,o.context=s;if(f){var b=this._pendingCallbacks;this._pendingCallbacks=null,l.default.runCallbacks(b,o)}c.default.hook.Reconciler.receiveComponent(this)}},{key:"_updateRenderedComponent",value:function(e){var t=this._renderedComponent,n=t._currentElement,r=this._instance,o=void 0;if(c.default.component=this,i(function(){o=r.render()}),c.default.component=null,(0,f.default)(n,o))t.updateComponent(n,o,t._context,this._processChildContext(e));else{var a=t.getNativeNode();t.unmountComponent(!0),this._renderedComponent=(0,d.default)(o),this._renderedComponent.mountComponent(this._parent,this._processChildContext(e),function(e,t){Array.isArray(e)||(e=[e]),Array.isArray(a)||(a=[a]);for(var n=void 0,r=0;r<e.length;r++){var o=e[r];a[r]?c.default.driver.replaceChild(o,a[r]):c.default.driver.insertAfter(o,n),n=o}if(e.length<a.length)for(var i=e.length;i<a.length;i++)c.default.driver.removeChild(a[i])})}}},{key:"getNativeNode",value:function(){var e=this._renderedComponent;if(e)return e.getNativeNode()}},{key:"getPublicInstance",value:function(){var e=this._instance;return e instanceof s.default?null:e}}]),e}();t.default=h,e.exports=t.default},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=(function(e){e&&e.__esModule}(n(0)),function(){function e(t){r(this,e),this.pureRender=t}return o(e,[{key:"render",value:function(){return this.pureRender(this.props,this.context)}}]),e}());t.default=i,e.exports=t.default},function(e,t,n){function r(e,t){t&&(e._pendingCallbacks||(e._pendingCallbacks=[])).push(t)}function o(e,t){t&&(e._pendingStateQueue||(e._pendingStateQueue=[])).push(t)}Object.defineProperty(t,"__esModule",{value:!0});var i={setState:function(e,t,n){var i=e._internal;i&&(o(i,t),r(i,n),i._pendingState||this.runUpdate(e))},forceUpdate:function(e,t){var n=e._internal;n&&(n._pendingForceUpdate=!0,r(n,t),this.runUpdate(e))},runUpdate:function(e){var t=e._internal;if(t&&t._renderedComponent){var n=t._pendingCallbacks;t._pendingCallbacks=null;var r=t._currentElement,o=t._context;(t._pendingStateQueue||t._pendingForceUpdate)&&t.updateComponent(r,r,o,o),this.runCallbacks(n,e)}},runCallbacks:function(e,t){if(e)for(var n=0;n<e.length;n++)e[n].call(t)}};t.default=i,e.exports=t.default},function(e,t,n){function r(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=Object.prototype.hasOwnProperty;t.default=function(e,t){if(r(e,t))return!0;if("object"!==(void 0===e?"undefined":o(e))||null===e||"object"!==(void 0===t?"undefined":o(t))||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var s=0;s<n.length;s++)if(!i.call(t,n[s])||!r(e[n[s]],t[n[s]]))return!1;return!0},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=r(n(0)),c=r(n(9)),u=r(n(1)),d=r(n(2)),f=r(n(11)),p=function(e){function t(e){return o(this,t),i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))}return a(t,c.default),s(t,[{key:"mountComponent",value:function(e,t,n){this._parent=e,this._context=t,this._mountID=l.default.mountID++;var r={_internal:this};this._instance=r;var o=this.getNativeNode(),i=this._currentElement;if(this.mountChildren(i,t),n)n(o,e);else for(var a=Array.isArray(e),s=0;s<o.length;s++){var c=o[s];a?e.push(c):l.default.driver.appendChild(c,e)}return r}},{key:"mountChildren",value:function(e,t){var n=this,r=this._renderedChildren={},o=this.getNativeNode();return e.map(function(e,i){var a=(0,d.default)(e),s=(0,f.default)(r,e,i);return r[s]=a,a._mountIndex=i,a.mountComponent(n._parent,t,function(e){if(Array.isArray(e))for(var t=0;t<e.length;t++)o.push(e[t]);else o.push(e)})})}},{key:"unmountComponent",value:function(e){var t=this;if(this._nativeNode&&(u.default.remove(this._nativeNode),!e))for(var n=0;n<this._nativeNode.length;n++)l.default.driver.removeChild(t._nativeNode[n]);this.unmountChildren(!0),this._currentElement=null,this._nativeNode=null,this._parent=null,this._context=null,this._instance=null}},{key:"updateComponent",value:function(e,t,n,r){this._currentElement=t,this.updateChildren(this._currentElement,r)}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=[]),this._nativeNode}},{key:"getPublicInstance",value:function(){return this.getNativeNode()}},{key:"getName",value:function(){return"fragment"}}]),t}();t.default=p,e.exports=t.default},function(e,t,n){var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var i="function"==typeof Symbol&&"symbol"===o(Symbol.iterator)?function(e){return void 0===e?"undefined":o(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":o(e)},a=n(12),s=function(e){return e&&e.__esModule?e:{default:e}}(n(31)),l=/^on[A-Z]/,c=/^aria-/,u={},d="object"===(void 0===r?"undefined":i(r))?r:"object"===(void 0===d?"undefined":i(d))?d:null,f={getElementById:function(e){return u[e]},createBody:function(){if(d.body)return d.body;var e=d.documentElement,t=d.createBody();return e.appendChild(t),t},createComment:function(e){return d.createComment(e)},createEmpty:function(){return this.createComment(" empty ")},createText:function(e){return f.createElement({type:"text",props:{value:e}})},updateText:function(e,t){this.setAttribute(e,"value",t)},createElement:function(e){var t=s.default[e.type];t&&(e=t.parse(e));var n=e.props,r={},o=n.style;for(var i in o)r[i]=(0,a.convertUnit)(o[i],i);var l=d.createElement(e.type,{style:r});return this.setNativeProps(l,n,!0),l},appendChild:function(e,t){return t.appendChild(e)},removeChild:function(e,t){t=t||e.parentNode;var n=e.attr&&e.attr.id;return null!=n&&(u[n]=null),t.removeChild(e)},replaceChild:function(e,t,n){n=n||t.parentNode;var r=t.previousSibling,o=t.nextSibling;this.removeChild(t,n),r?this.insertAfter(e,r,n):o?this.insertBefore(e,o,n):this.appendChild(e,n)},insertAfter:function(e,t,n){return(n=n||t.parentNode).insertAfter(e,t)},insertBefore:function(e,t,n){return(n=n||t.parentNode).insertBefore(e,t)},addEventListener:function(e,t,n){return e.addEvent(t,n)},removeEventListener:function(e,t,n){return e.removeEvent(t,n)},removeAllEventListeners:function(e){},removeAttribute:function(e,t,n){return"id"==t&&(u[n]=null),e.setAttr(t,void 0,!1)},setAttribute:function(e,t,n){return"id"==t&&(u[n]=e),c.test(t)&&(t=t.replace(/\-(\w)/,function(e,t){return t.toUpperCase()})),e.setAttr(t,n,!1)},setStyles:function(e,t){for(var n in t){var r=t[n];r=(0,a.convertUnit)(r,n),e.setStyle(n,r)}},beforeRender:function(){d.open(),(0,a.setRem)(this.getWindowWidth()/750)},afterRender:function(){d.listener&&d.listener.createFinish&&d.listener.createFinish(),d.close()},getWindowWidth:function(){return 750},setNativeProps:function(e,t,n){var r=this;for(var o in t){var i=t[o];if("children"!==o&&null!=i)if("style"===o){if(n)continue;r.setStyles(e,i)}else if(l.test(o)){var a=o.slice(2).toLowerCase();r.addEventListener(e,a,i)}else r.setAttribute(e,o,i)}}};t.default=f,e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(n(32)),i=r(n(33)),a=r(n(34)),s=r(n(35)),l=r(n(36)),c=r(n(37)),u=r(n(38)),d=r(n(39));t.default={span:s.default,p:l.default,img:o.default,button:c.default,video:i.default,textarea:a.default,h1:u.default,h2:u.default,h3:u.default,h4:u.default,h5:u.default,h6:u.default,nav:d.default,article:d.default,section:d.default,footer:d.default,aside:d.default,main:d.default},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(13);t.default={parse:function(e){var t=e.props;return e.type="image",e.props=(0,r.transformPropsAttrsToStyle)(t,["width","height"]),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(13);t.default={parse:function(e){var t=e.props;return e.props=(0,r.transformPropsAttrsToStyle)(t,["width","height"]),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){var t=e.props;return"string"!=typeof t.children||t.value||(t.value=t.children,t.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){var t=e.props;return e.type="text","string"!=typeof t.children||t.value||(t.value=t.children,t.children=null),e}},e.exports=t.default},function(e,t,n){function r(e){return{type:"span",attr:{value:e}}}function o(e){var t=e.type,n=e.props,r=n.style,o=n.children;"img"===t&&(t="image"),u[t]&&(r=l({},u[t],r),t="span"),n.style=null,n.children=null;var a={type:t,style:r,attr:n||{}};return o&&("span"===t&&"string"==typeof o?a.attr.value=o:a.children=i(o)),a}function i(e){var t=[];Array.isArray(e)||(e=[e]);for(var n=0;n<e.length;n++){var i=e[n];"string"==typeof i?t.push(r(i)):"object"===(void 0===i?"undefined":s(i))&&t.push(o(i))}return t}var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var s="function"==typeof Symbol&&"symbol"===a(Symbol.iterator)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":a(e)},l=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},c={fontSize:28,marginTop:28,marginBottom:28},u={u:{textDecoration:"underline"},s:{textDecoration:"line-through"},i:{fontStyle:"italic"},b:{fontWeight:"bold"},del:{textDecoration:"line-through"},em:{fontStyle:"italic"},strong:{fontWeight:"bold"},big:{fontSize:33.6},small:{fontSize:28*.8}};t.default={parse:function(e){var t=e.props,n=t.children;return e.type="richtext",t.style=l({},c,t.style),t.value=i(n),t.children=null,e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};t.default={parse:function(e){var t=e.props;e.type="text";var n=t.style,o=t.disabled,i=t.children,a=r({textAlign:"center",fontSize:22,paddingTop:4,paddingRight:12,paddingBottom:6,paddingLeft:12,borderWidth:4,borderStyle:"solid",borderColor:"#000000",backgroudColor:"#c0c0c0"},n);return o&&(t.onClick=null,a=r({},a,{color:"#7f7f7f",borderColor:"#7f7f7f"})),"string"==typeof i&&(t.value=i,t.children=null),e}},e.exports=t.default},function(e,t,n){function r(e,t,n){return{fontSize:e*t,marginTop:e*t*n,marginBottom:e*t*n,fontWeight:"bold"}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i={h1:r(28,2,.67),h2:r(28,1.5,.83),h3:r(28,1.17,1),h4:r(28,1,1.33),h5:r(28,.83,1.67),h6:r(28,.67,2.33)};t.default={parse:function(e){var t=e.type,n=e.props;return e.type="text",n.style=o({},i[t]||i.h6,n.style),"string"!=typeof n.children||n.value||(n.value=n.children,n.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){return e.type="div",e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),i=function(e){return e&&e.__esModule?e:{default:e}}(n(41)),a=/on[A-Z]/,s={getElementById:function(e){return o.getElementById(e)},createBody:function(){return o.body},createComment:function(e){return o.createComment(e)},createEmpty:function(){return this.createComment(" empty ")},createText:function(e){return o.createTextNode(e)},updateText:function(e,t){e["textContent"in o?"textContent":"nodeValue"]=t},createElement:function(e){var t=o.createElement(e.type),n=e.props;return this.setNativeProps(t,n),t},appendChild:function(e,t){return t.appendChild(e)},removeChild:function(e,t){(t=t||e.parentNode)&&t.removeChild(e)},replaceChild:function(e,t,n){(n=n||t.parentNode).replaceChild(e,t)},insertAfter:function(e,t,n){n=n||t.parentNode;var r=t.nextSibling;r?n.insertBefore(e,r):n.appendChild(e)},insertBefore:function(e,t,n){(n=n||t.parentNode).insertBefore(e,t)},addEventListener:function(e,t,n){return e.addEventListener(t,n)},removeEventListener:function(e,t,n){return e.removeEventListener(t,n)},removeAllEventListeners:function(e){},removeAttribute:function(e,t){if("dangerouslySetInnerHTML"===t)return e.innerHTML=null;"className"===t&&(t="class"),t in e&&(e[t]=null),e.removeAttribute(t)},setAttribute:function(e,t,n){if("dangerouslySetInnerHTML"===t)return e.innerHTML=n.__html;"className"===t&&(t="class"),t in e?e[t]=n:e.setAttribute(t,n)},setStyles:function(e,t){var n={};for(var o in t){var a=t[o];i.default.isFlexProp(o)?i.default[o](a,n):n[o]=(0,r.convertUnit)(a,o)}for(var s in n){var l=n[s];if(Array.isArray(l))for(var c=0;c<l.length;c++)e.style[s]=l[c];else e.style[s]=l}},beforeRender:function(){(0,r.setRem)(this.getWindowWidth()/750)},getWindowWidth:function(){return o.documentElement.clientWidth},setNativeProps:function(e,t){var n=this;for(var r in t){var o=t[r];if("children"!==r&&null!=o)if("style"===r)n.setStyles(e,o);else if(a.test(r)){var i=r.slice(2).toLowerCase();n.addEventListener(e,i,o)}else n.setAttribute(e,r,o)}}};t.default=s,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r={stretch:"stretch","flex-start":"start","flex-end":"end",center:"center"},o={row:"horizontal",column:"vertical"},i={"flex-start":"start","flex-end":"end",center:"center","space-between":"justify","space-around":"justify"},a={display:!0,flex:!0,alignItems:!0,alignSelf:!0,flexDirection:!0,justifyContent:!0,flexWrap:!0},s={isFlexProp:function(e){return a[e]},display:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.display="flex"===e?["-webkit-box","-webkit-flex","flex"]:e,t},flex:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxFlex=e,t.webkitFlex=e,t.flex=e,t},flexWrap:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.flexWrap=e,t},alignItems:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxAlign=r[e],t.webkitAlignItems=e,t.alignItems=e,t},alignSelf:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitAlignSelf=e,t.alignSelf=e,t},flexDirection:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxOrient=o[e],t.webkitFlexDirection=e,t.flexDirection=e,t},justifyContent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxPack=i[e],t.webkitJustifyContent=e,t.justifyContent=e,t}};t.default=s,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(1));t.default=function(e){return null==e?null:r.default.get(e)},e.exports=t.default},function(e,t,n){function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){e=(0,i.default)(e),o.default.driver.setNativeProps(e,t)};var o=r(n(0)),i=r(n(14));e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default="0.4.7",e.exports=t.default}])}},function(e,t){e.exports=function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=2)}([function(e,t,n){function r(e){return!!e&&("symbol"===(void 0===e?"undefined":s(e))||!!e.constructor&&("Symbol"===e.constructor.name&&"Symbol"===e[e.constructor.toStringTag]))}function o(e){if(!r(e))throw new TypeError(e+" is not a symbol");return e}var i,a,s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l=Object.defineProperties,c=Object.defineProperty,u=Object.create(null),d=function(){var e=Object.create(null);return function(t){for(var n=0;e[t+(n||"")];)++n;return t+=n||"",e[t]=!0,"@@"+t}}();a=function(e){if(this instanceof a)throw new TypeError("Symbol is not a constructor");return i(e)},e.exports=i=function e(t){var n;if(this instanceof e)throw new TypeError("Symbol is not a constructor");return n=Object.create(a.prototype),t=void 0===t?"":String(t),l(n,{__description__:{value:t},__name__:{value:d(t)}})},l(i,{for:{value:function(e){return u[e]?u[e]:u[e]=i(String(e))}},keyFor:{value:function(e){var t;o(e);for(t in u)if(u[t]===e)return t}},hasInstance:{value:i("hasInstance")},isConcatSpreadable:{value:i("isConcatSpreadable")},iterator:{value:i("iterator")},match:{value:i("match")},replace:{value:i("replace")},search:{value:i("search")},species:{value:i("species")},split:{value:i("split")},toPrimitive:{value:i("toPrimitive")},toStringTag:{value:i("toStringTag")},unscopables:{value:i("unscopables")}}),l(a.prototype,{constructor:{value:i},toString:{value:function(){return this.__name__}}}),l(i.prototype,{toString:{value:function(){return"Symbol ("+o(this).__description__+")"}},valueOf:{value:function(){return o(this)}}}),c(i.prototype,i.toPrimitive,{value:function(){var e=o(this);return"symbol"===(void 0===e?"undefined":s(e))?e:e.toString()}}),c(i.prototype,i.toStringTag,{value:"Symbol"}),c(a.prototype,i.toStringTag,{value:i.prototype[i.toStringTag]}),c(a.prototype,i.toPrimitive,{value:i.prototype[i.toPrimitive]})},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){return encodeURIComponent(e).replace(l,d)}function i(e){return decodeURIComponent(e.replace(c," "))}var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e){return e&&e.__esModule?e:{default:e}}(n(0)),l=/[!'\(\)~]|%20|%00/g,c=/\+/g,u={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"},d=function(e){return u[e]},f="__URLSearchParams__",p=function(){function e(t){var n=this;if(r(this,e),this[f]=Object.create(null),t){"?"===t.charAt(0)&&(t=t.slice(1));for(var o,a,s=(t||"").split("&"),l=0,c=s.length;l<c;l++)-1<(o=(a=s[l]).indexOf("="))?n.append(i(a.slice(0,o)),i(a.slice(o+1))):a.length&&n.append(i(a),"")}}return a(e,[{key:"append",value:function(e,t){var n=this[f];e in n?n[e].push(""+t):n[e]=[""+t]}},{key:"delete",value:function(e){delete this[f][e]}},{key:"get",value:function(e){var t=this[f];return e in t?t[e][0]:null}},{key:"getAll",value:function(e){var t=this[f];return e in t?t[e].slice(0):[]}},{key:"has",value:function(e){return e in this[f]}},{key:"set",value:function(e,t){this[f][e]=[""+t]}},{key:"forEach",value:function(e,t){var n=this[f];Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){e.call(t,n,r,this)},this)},this)}},{key:"keys",value:function(){var e=[];this.forEach(function(t,n){e.push(n)});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[s.default.iterator]=function(){return t},t}},{key:"values",value:function(){var e=[];this.forEach(function(t){e.push(t)});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[s.default.iterator]=function(){return t},t}},{key:"entries",value:function(){var e=[];this.forEach(function(t,n){e.push([n,t])});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[s.default.iterator]=function(){return t},t}},{key:"toString",value:function(){var e,t,n,r,i=this[f],a=[];for(t in i)for(n=o(t),e=0,r=i[t];e<r.length;e++)a.push(n+"="+o(r[e]));return a.join("&")}}]),e}();p.prototype[s.default.iterator]=p.prototype.entries,e.exports=p},function(e,t,n){e.exports={get Promise(){return n(3)},get Symbol(){return n(0)},get Map(){return n(4)},get Set(){return n(5)},get WeakMap(){return n(6)},get WeakSet(){return n(7)},get FontFace(){return n(8)},get URL(){return n(9)},get URLSearchParams(){return n(1)},get matchMedia(){return n(10)}}},function(e,t,n){function r(){}function o(e,t){return function(){e.apply(t,arguments)}}function i(e){if("object"!==f(this))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("Promise resolver is not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(e,this)}function a(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,p(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var r;try{r=n(e._value)}catch(e){return void l(t.promise,e)}s(t.promise,r)}else(1===e._state?s:l)(t.promise,e._value)})):e._deferreds.push(t)}function s(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"===(void 0===t?"undefined":f(t))||"function"==typeof t)){var n=t.then;if(t instanceof i)return e._state=3,e._value=t,void c(e);if("function"==typeof n)return void d(o(n,t),e)}e._state=1,e._value=t,c(e)}catch(t){l(e,t)}}function l(e,t){e._state=2,e._value=t,c(e)}function c(e){2===e._state&&0===e._deferreds.length&&p(function(){e._handled||h(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)a(e,e._deferreds[t]);e._deferreds=null}function u(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function d(e,t){var n=!1;try{e(function(e){n||(n=!0,s(t,e))},function(e){n||(n=!0,l(t,e))})}catch(e){if(n)return;n=!0,l(t,e)}}var f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p="function"==typeof setImmediate&&setImmediate||function(e){"function"==typeof setTimeout?setTimeout(e,0):e()},h=function(e){"undefined"!=typeof console&&console&&console.log("Possible Unhandled Promise Rejection:",e)};i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var n=new this.constructor(r);return a(this,new u(e,t,n)),n},i.all=function(e){var t=Array.prototype.slice.call(e);return new i(function(e,n){function r(i,a){try{if(a&&("object"===(void 0===a?"undefined":f(a))||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(e){r(i,e)},n)}t[i]=a,0==--o&&e(t)}catch(e){n(e)}}if(0===t.length)return e([]);for(var o=t.length,i=0;i<t.length;i++)r(i,t[i])})},i.resolve=function(e){return e&&"object"===(void 0===e?"undefined":f(e))&&e.constructor===i?e:new i(function(t){t(e)})},i.reject=function(e){return new i(function(t,n){n(e)})},i.race=function(e){return new i(function(t,n){for(var r=0,o=e.length;r<o;r++)e[r].then(t,n)})},i._setImmediateFn=function(e){p=e},i._setUnhandledRejectionFn=function(e){h=e},e.exports=i},function(e,t,n){function r(e){return Number.isNaN(e)?u:e}function o(e){return e===u?NaN:e}function i(e,t){var n=0,r=!1;return{next:function(){if(n===e._keys.length&&(r=!0),r)return{value:void 0,done:!0};for(;e._keys[n]===c;)n++;return{value:t.call(e,n++),done:!1}}}}function a(e){for(var t=0,n=0,r=e._keys.length;n<r;n++)e._keys[n]!==c&&t++;return t}function s(e,t){return"function"==typeof e[t]}var l=function(e){return e&&e.__esModule?e:{default:e}}(n(0)),c=(0,l.default)("undef"),u=(0,l.default)("NaN"),d=!0,f=function e(t){this._keys=[],this._values=[],t&&s(t,"forEach")&&(t instanceof e||s(t,"clear")&&s(t,"delete")&&s(t,"entries")&&s(t,"forEach")&&s(t,"get")&&s(t,"has")&&s(t,"keys")&&s(t,"set")&&s(t,"values")?t.forEach(function(e,t){this.set.apply(this,[t,e])},this):t.forEach(function(e){this.set.apply(this,e)},this)),d||(this.size=a(this))};f.prototype={};try{Object.defineProperty(f.prototype,"size",{get:function(){return a(this)}})}catch(e){d=!1}f.prototype.get=function(e){var t=this._keys.indexOf(r(e));return-1!==t?this._values[t]:void 0},f.prototype.set=function(e,t){var n=this._keys.indexOf(r(e));return-1!==n?this._values[n]=t:(this._keys.push(r(e)),this._values.push(t),d||(this.size=a(this))),this},f.prototype.has=function(e){return-1!==this._keys.indexOf(r(e))},f.prototype.delete=function(e){var t=this._keys.indexOf(r(e));return-1!==t&&(this._keys[t]=c,this._values[t]=c,d||(this.size=a(this)),!0)},f.prototype.clear=function(){this._keys=this._values=[],d||(this.size=0)},f.prototype.values=function(){return i(this,function(e){return this._values[e]})},f.prototype.keys=function(){return i(this,function(e){return o(this._keys[e])})},f.prototype.entries=f.prototype[l.default.iterator]=function(){return i(this,function(e){return[o(this._keys[e]),this._values[e]]})},f.prototype.forEach=function(e,t){var n=this;t=t||si;for(var r=this.entries(),o=r.next();!1===o.done;)e.call(t,o.value[1],o.value[0],n),o=r.next()},f.prototype[l.default.species]=f,Object.defineProperty(f,"constructor",{value:f});try{Object.defineProperty(f,"length",{value:0})}catch(e){}e.exports=f},function(e,t,n){function r(e){return Number.isNaN(e)?c:e}function o(e){return e===c?NaN:e}function i(e,t){var n=0;return{next:function(){for(;e._values[n]===l;)n++;return n===e._values.length?{value:void 0,done:!0}:{value:t.call(e,n++),done:!1}}}}function a(e){for(var t=0,n=0,r=e._values.length;n<r;n++)e._values[n]!==l&&t++;return t}var s=function(e){return e&&e.__esModule?e:{default:e}}(n(0)),l=(0,s.default)("undef"),c=(0,s.default)("NaN"),u=!0,d=function(e){this._values=[],e&&"function"==typeof e.forEach&&e.forEach(function(e){this.add.call(this,e)},this),u||(this.size=a(this))};try{Object.defineProperty(d.prototype,"size",{get:function(){return a(this)}})}catch(e){u=!1}d.prototype.add=function(e){return e=r(e),-1===this._values.indexOf(e)&&(this._values.push(e),u||(this.size=a(this))),this},d.prototype.has=function(e){return-1!==this._values.indexOf(r(e))},d.prototype.delete=function(e){var t=this._values.indexOf(r(e));return-1!==t&&(this._values[t]=l,u||(this.size=a(this)),!0)},d.prototype.clear=function(){this._values=[],u||(this.size=0)},d.prototype.values=d.prototype.keys=function(){return i(this,function(e){return o(this._values[e])})},d.prototype.entries=d.prototype[s.default.iterator]=function(){return i(this,function(e){return[o(this._values[e]),o(this._values[e])]})},d.prototype.forEach=function(e,t){var n=this;t=t||si;for(var r=this.entries(),o=r.next();!1===o.done;)e.call(t,o.value[1],o.value[0],n),o=r.next()},d.prototype[s.default.species]=d,Object.defineProperty(d,"constructor",{value:d});try{Object.defineProperty(d,"length",{value:0})}catch(e){}e.exports=d},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=Object.defineProperty,i=Date.now()%1e9,a=function(e){this.name="__st"+(1e9*Math.random()>>>0)+i+++"__",e&&e.forEach&&e.forEach(function(e){this.set.apply(this,e)},this)};a.prototype.set=function(e,t){if("object"!==(void 0===e?"undefined":r(e))&&"function"!=typeof e)throw new TypeError("Invalid value used as weak map key");var n=e[this.name];return n&&n[0]===e?n[1]=t:o(e,this.name,{value:[e,t],writable:!0}),this},a.prototype.get=function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},a.prototype.delete=function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},a.prototype.has=function(e){var t=e[this.name];return!!t&&t[0]===e},e.exports=a},function(e,t,n){var r=Date.now()%1e9,o=function(e){this.name="__st"+(1e9*Math.random()>>>0)+r+++"__",e&&e.forEach&&e.forEach(this.add,this)};o.prototype.add=function(e){var t=this.name;return e[t]||Object.defineProperty(e,t,{value:!0,writable:!0}),this},o.prototype.delete=function(e){return!!e[this.name]&&(e[this.name]=void 0,!0)},o.prototype.has=function(e){return!!e[this.name]},e.exports=o},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e.exports=function e(t,n){r(this,e),this.family=t,this.source=n}},function(e,t,n){function r(e){return void 0!==f[e]}function o(){c.call(this),this._isInvalid=!0}function i(e){return""==e&&o.call(this),e.toLowerCase()}function a(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function s(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function l(e,t,n){function l(e){A.push(e)}var c=this,u=t||"scheme start",d=0,y="",g=!1,b=!1,A=[];e:for(;(e[d-1]!=h||0==d)&&!this._isInvalid;){var w=e[d];switch(u){case"scheme start":if(!w||!v.test(w)){if(t){l("Invalid scheme.");break e}y="",u="no scheme";continue}y+=w.toLowerCase(),u="scheme";break;case"scheme":if(w&&m.test(w))y+=w.toLowerCase();else{if(":"!=w){if(t){if(h==w)break e;l("Code point not allowed in scheme: "+w);break e}y="",d=0,u="no scheme";continue}if(c._scheme=y,y="",t)break e;r(c._scheme)&&(c._isRelative=!0),u="file"==c._scheme?"relative":c._isRelative&&n&&n._scheme==c._scheme?"relative or authority":c._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==w?u="query":"#"==w?(c._fragment="#",u="fragment"):h!=w&&"\t"!=w&&"\n"!=w&&"\r"!=w&&(c._schemeData+=a(w));break;case"no scheme":if(n&&r(n._scheme)){u="relative";continue}l("Missing scheme."),o.call(c);break;case"relative or authority":if("/"!=w||"/"!=e[d+1]){l("Expected /, got: "+w),u="relative";continue}u="authority ignore slashes";break;case"relative":if(c._isRelative=!0,"file"!=c._scheme&&(c._scheme=n._scheme),h==w){c._host=n._host,c._port=n._port,c._path=n._path.slice(),c._query=n._query,c._username=n._username,c._password=n._password;break e}if("/"==w||"\\"==w)"\\"==w&&l("\\ is an invalid code point."),u="relative slash";else if("?"==w)c._host=n._host,c._port=n._port,c._path=n._path.slice(),c._query="?",c._username=n._username,c._password=n._password,u="query";else{if("#"!=w){var _=e[d+1],x=e[d+2];("file"!=c._scheme||!v.test(w)||":"!=_&&"|"!=_||h!=x&&"/"!=x&&"\\"!=x&&"?"!=x&&"#"!=x)&&(c._host=n._host,c._port=n._port,c._username=n._username,c._password=n._password,c._path=n._path.slice(),c._path.pop()),u="relative path";continue}c._host=n._host,c._port=n._port,c._path=n._path.slice(),c._query=n._query,c._fragment="#",c._username=n._username,c._password=n._password,u="fragment"}break;case"relative slash":if("/"!=w&&"\\"!=w){"file"!=c._scheme&&(c._host=n._host,c._port=n._port,c._username=n._username,c._password=n._password),u="relative path";continue}"\\"==w&&l("\\ is an invalid code point."),u="file"==c._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=w){l("Expected '/', got: "+w),u="authority ignore slashes";continue}u="authority second slash";break;case"authority second slash":if(u="authority ignore slashes","/"!=w){l("Expected '/', got: "+w);continue}break;case"authority ignore slashes":if("/"!=w&&"\\"!=w){u="authority";continue}l("Expected authority, got: "+w);break;case"authority":if("@"==w){g&&(l("@ already seen."),y+="%40"),g=!0;for(var E=0;E<y.length;E++){var C=y[E];if("\t"!=C&&"\n"!=C&&"\r"!=C)if(":"!=C||null!==c._password){var k=a(C);null!==c._password?c._password+=k:c._username+=k}else c._password="";else l("Invalid whitespace in authority.")}y=""}else{if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w){d-=y.length,y="",u="host";continue}y+=w}break;case"file host":if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w){2!=y.length||!v.test(y[0])||":"!=y[1]&&"|"!=y[1]?0==y.length?u="relative path start":(c._host=i.call(c,y),y="",u="relative path start"):u="relative path";continue}"\t"==w||"\n"==w||"\r"==w?l("Invalid whitespace in file host."):y+=w;break;case"host":case"hostname":if(":"!=w||b){if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w){if(c._host=i.call(c,y),y="",u="relative path start",t)break e;continue}"\t"!=w&&"\n"!=w&&"\r"!=w?("["==w?b=!0:"]"==w&&(b=!1),y+=w):l("Invalid code point in host/hostname: "+w)}else if(c._host=i.call(c,y),y="",u="port","hostname"==t)break e;break;case"port":if(/[0-9]/.test(w))y+=w;else{if(h==w||"/"==w||"\\"==w||"?"==w||"#"==w||t){if(""!=y){var S=parseInt(y,10);S!=f[c._scheme]&&(c._port=S+""),y=""}if(t)break e;u="relative path start";continue}"\t"==w||"\n"==w||"\r"==w?l("Invalid code point in port: "+w):o.call(c)}break;case"relative path start":if("\\"==w&&l("'\\' not allowed in path."),u="relative path","/"!=w&&"\\"!=w)continue;break;case"relative path":if(h!=w&&"/"!=w&&"\\"!=w&&(t||"?"!=w&&"#"!=w))"\t"!=w&&"\n"!=w&&"\r"!=w&&(y+=a(w));else{"\\"==w&&l("\\ not allowed in relative path.");var O;(O=p[y.toLowerCase()])&&(y=O),".."==y?(c._path.pop(),"/"!=w&&"\\"!=w&&c._path.push("")):"."==y&&"/"!=w&&"\\"!=w?c._path.push(""):"."!=y&&("file"==c._scheme&&0==c._path.length&&2==y.length&&v.test(y[0])&&"|"==y[1]&&(y=y[0]+":"),c._path.push(y)),y="","?"==w?(c._query="?",u="query"):"#"==w&&(c._fragment="#",u="fragment")}break;case"query":t||"#"!=w?h!=w&&"\t"!=w&&"\n"!=w&&"\r"!=w&&(c._query+=s(w)):(c._fragment="#",u="fragment");break;case"fragment":h!=w&&"\t"!=w&&"\n"!=w&&"\r"!=w&&(c._fragment+=w)}d++}}function c(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function u(e,t){void 0===t||t instanceof u||(t=new u(String(t))),this._url=e,c.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");l.call(this,n,null,t)}var d=n(1),f=Object.create(null);f.ftp=21,f.file=0,f.gopher=70,f.http=80,f.https=443,f.ws=80,f.wss=443;var p=Object.create(null);p["%2e"]=".",p[".%2e"]="..",p["%2e."]="..",p["%2e%2e"]="..";var h=void 0,v=/[a-zA-Z]/,m=/[a-zA-Z0-9\+\-\.]/;u.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){c.call(this),l.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||l.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&l.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&l.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&l.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],l.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),l.call(this,e,"query"))},get searchParams(){return new d(this.search)},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),l.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return(e=this.host)?this._scheme+"://"+e:""}},e.exports=u},function(e,t,n){function r(e,t){return o(e).some(function(e){var n=e.inverse,r="all"===e.type||t.type===e.type;if(r&&n||!r&&!n)return!1;var o=e.expressions.every(function(e){var n=e.feature,r=e.modifier,o=e.value,i=t[n];if(!i)return!1;switch(n){case"width":case"height":o=parseFloat(o),i=parseFloat(i)}switch(r){case"min":return i>=o;case"max":return i<=o;default:return i===o}});return o&&!n||!o&&n})}function o(e){return e.split(",").map(function(e){var t=(e=e.trim()).match(i);if(!t)throw new SyntaxError('Invalid CSS media query: "'+e+'"');var n=t[1],r=t[2],o=((t[3]||"")+(t[4]||"")).trim(),l={};if(l.inverse=!!n&&"not"===n.toLowerCase(),l.type=r?r.toLowerCase():"all",!o)return l.expressions=[],l;if(!(o=o.match(/\([^\)]+\)/g)))throw new SyntaxError('Invalid CSS media query: "'+e+'"');return l.expressions=o.map(function(t){var n=t.match(a);if(!n)throw new SyntaxError('Invalid CSS media query: "'+e+'"');var r=n[1].toLowerCase().match(s);return{modifier:r[1],feature:r[2],value:n[2]}}),l})}var i=/^(?:(only|not)?\s*([_a-z][_a-z0-9-]*)|(\([^\)]+\)))(?:\s*and\s*(.*))?$/i,a=/^\(\s*([_a-z-][_a-z0-9-]*)\s*(?:\:\s*([^\)]+))?\s*\)$/,s=/^(?:(min|max)-)?(.+)/;e.exports=function(e){var t={matches:!1,media:e};return""===e?(t.matches=!0,t):(t.matches=r(e,{type:"screen",width:window.screen.width,height:window.screen.height}),t)}}])}},function(e,t,n){e.exports=function(e){return function(t,n,r){n instanceof Function&&(r=n,n=[]),e[t]={factory:r,deps:n,module:{exports:{}},isInitialized:!1,hasError:!1}}}},function(e,t,n){e.exports=function(e){function t(n){var r=e[n];if(r&&r.isInitialized)return r.module.exports;if(!r)throw new Error('Requiring unknown module "'+n+'"');if(r.hasError)throw new Error('Requiring module "'+n+'" which threw an exception');try{r.isInitialized=!0,r.factory(t,r.module.exports,r.module)}catch(e){throw r.hasError=!0,r.isInitialized=!1,e}return r.module.exports}return t}},function(e,t,n){function r(e){if("*"==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 o(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();return o.indexOf("osversion")>=0?r.code=1001:o.indexOf("appversion")>=0?r.code=1002:o.indexOf("weexversion")>=0?r.code=1003:o.indexOf("devicemodel")>=0&&(r.code=1004),r.errorMessage=function(e,t,n){return"Downgrade["+e+"] :: deviceInfo "+t+" matched criteria "+n}(e,t,n),r}function i(e){var t={isDowngrade:!1},n=WXEnvironment,i=e[(n.platform||"unknow").toLowerCase()]||{};for(var s in n){var l=s,c=l.toLowerCase(),u=n[s],d=c.indexOf("version")>=0,f=c.indexOf("devicemodel")>=0,p=i[s];if(p&&d){var h=r(p),v=r(n[s]);if(a.default.satisfies(v,h)){t=o(l,u,p);break}}else if(f&&(Array.isArray(p)?p:[p]).indexOf(u)>=0){t=o(l,u,p);break}}return t}var a=function(e){return e&&e.__esModule?e:{default:e}}(n(10));e.exports=function(e){return function(t){var n=e("@weex-module/instanceWrap"),r=i(t);return!!r.isDowngrade&&(n.error(r.errorType,r.code,r.errorMessage),!0)}}},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default={satisfies:function(e,t){var n=/(\W+)?([\d|.]+)/;if((void 0===e?"undefined":r(e))+(void 0===t?"undefined":r(t))!="stringstring")return!1;if("*"==t)return!0;for(var o=t.match(n),i=e.split("."),a=o[2].split("."),s=Math.max(i.length,a.length),l=0,c=0;c<s;c++){if(i[c]&&!a[c]&&parseInt(i[c])>0||parseInt(i[c])>parseInt(a[c])){l=1;break}if(a[c]&&!i[c]&&parseInt(a[c])>0||parseInt(i[c])<parseInt(a[c])){l=-1;break}}switch(o[1]){case"<":if(-1===l)return!0;break;case"<=":if(1!==l)return!0;break;case">":if(1===l)return!0;break;case">=":if(-1!==l)return!0;break;default:if(0===l)return!0}return!1}},e.exports=t.default},function(e,t,n){function r(e){e.body.addEvent("viewappear",function(t){e.visibilityState=a,t.type=l,e.dispatchEvent(t)}),e.body.addEvent("viewdisappear",function(t){e.visibilityState=s,t.type=l,e.dispatchEvent(t)})}function o(e){e.body&&(e.body.removeEvent("viewappear"),e.body.removeEvent("viewdisappear"))}var i=function(e){return e&&e.__esModule?e:{default:e}}(n(1)),a="visible",s="hidden",l="visibilitychange";e.exports=function(e,t){var n=new i.default,s=!1;try{t.addEventListener=function(e,o){e===l&&(t.body?r(t):s=!0),n.on(e,o)},t.removeEventListener=function(e,r){e===l&&o(t),n.off(e,r)},t.dispatchEvent=function(e){n.emit(e.type,e)},t.fonts={add:function(t){e("@weex-module/dom").addRule("fontFace",{fontFamily:t.family,src:t.source})}},t.visibilityState=a;var c=t.createBody;Object.defineProperty(t,"createBody",{value:function(){var e=c.apply(t,arguments);return s&&r(t),e}})}catch(e){console.log(e)}return t}},function(e,t,n){e.exports=function(e,t){return t.assign=function(t){e("@weex-module/navigator").push({url:t,animated:"true"},function(e){})},t.replace=function(t){e("@weex-module/location").replace(t)},t.reload=function(t){e("@weex-module/location").reload(t)},t}},function(e,t,n){e.exports=function(e,t){function n(e){return"string"!=typeof e&&(e=String(e)),e.toLowerCase()}function r(e){return"string"!=typeof e&&(e=String(e)),e}function o(e){this.originHeaders=e,this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function i(e){if(e.bodyUsed)return t.reject(new TypeError("Already read"));e.bodyUsed=!0}function a(){return this.bodyUsed=!1,this._initBody=function(e,t){if(this._bodyInit=e,"string"==typeof e)this._bodyText=e;else{if(e)throw new Error("unsupported BodyInit type");this._bodyText=""}},this.text=function(){var e=i(this);return e||t.resolve(this._bodyText)},this.json=function(){return this.text().then(JSON.parse)},this}function s(e){var t=e.toUpperCase();return u.indexOf(t)>-1?t:e}function l(e,t){var n=(t=t||{}).body;if(l.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=s(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n,t)}function c(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new o(t.headers),this.url=t.url||"",this._initBody(e,t)}o.prototype.append=function(e,t){e=n(e),t=r(t);var o=this.map[e];this.map[e]=o?o+","+t:t},o.prototype.delete=function(e){delete this.map[n(e)]},o.prototype.get=function(e){return e=n(e),this.has(e)?this.map[e]:null},o.prototype.has=function(e){return this.map.hasOwnProperty(n(e))},o.prototype.set=function(e,t){this.map[n(e)]=[r(t)]},o.prototype.forEach=function(e,t){var n=this;for(var r in this.map)n.map.hasOwnProperty(r)&&e.call(t,n.map[r],r,n)};var u=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];l.prototype.clone=function(){return new l(this)},a.call(l.prototype),a.call(c.prototype),c.prototype.clone=function(){return new c(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},c.error=function(){var e=new c(null,{status:0,statusText:""});return e.type="error",e};var d=[301,302,303,307,308];c.redirect=function(e,t){if(-1===d.indexOf(t))throw new RangeError("Invalid status code");return new c(null,{status:t,headers:{location:e}})};return{fetch:function(n,r){return new t(function(t,o){var i,a={url:(i=l.prototype.isPrototypeOf(n)&&!r?n:new l(n,r)).url,method:i.method,headers:i.headers&&i.headers.originHeaders};void 0!==i._bodyInit&&(a.body=i._bodyInit),a.type=r&&r.dataType?r.dataType:"text",(0,e("@weex-module/stream").fetch)(a,function(e){try{"string"==typeof e&&(e=JSON.parse(e));var n=new c("string"==typeof e.data?e.data:JSON.stringify(e.data),{status:e.status,statusText:e.statusText,headers:e.headers,url:i.url});t(n)}catch(e){o(e)}},function(e){})})},Headers:o,Request:l,Response:c}}},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(2),l=0,c=1,u=2,d=3,f=4,p=["abort","error","load","loadstart","progress","timeout","loadend","readystatechange"];e.exports=function(e){var t,n;return n=t=function(t){function n(){r(this,n);var e=o(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return e.UNSENT=l,e.OPENED=c,e.HEADERS_RECEIVED=u,e.LOADING=d,e.DONE=f,e.readyState=l,e.status=0,e.statusText="",e.timeout=0,e._aborted=!1,e._hasError=!1,e._method=null,e._response="",e._url=null,e._timedOut=!1,e._reset(),e}return i(n,s.apply(undefined,p)),a(n,[{key:"_reset",value:function(){this.readyState=this.UNSENT,this.responseHeaders=void 0,this.status=0,this._hasError=!1,this._headers={},this._response="",this._responseType="",this._sent=!1,this._lowerCaseResponseHeaders={},this._timedOut=!1}},{key:"getAllResponseHeaders",value:function(){if(!this.responseHeaders)return null;var e=this.responseHeaders||{};return Object.keys(e).map(function(t){return t+": "+e[t]}).join("\r\n")}},{key:"getResponseHeader",value:function(e){var t=this._lowerCaseResponseHeaders[e.toLowerCase()];return void 0!==t?t:null}},{key:"setRequestHeader",value:function(e,t){if(this.readyState!==this.OPENED)throw new Error("Request has not been opened");this._headers[e.toLowerCase()]=String(t)}},{key:"open",value:function(e,t,n){if(this.readyState!==this.UNSENT)throw new Error("Cannot open, already sending");if(void 0!==n&&!n)throw new Error("Synchronous http requests are not supported");if(!t)throw new Error("Cannot load an empty url");this._method=e.toUpperCase(),this._url=t,this._aborted=!1,this.setReadyState(this.OPENED)}},{key:"send",value:function(t){var n=this;if(this.readyState!==this.OPENED)throw new Error("Request has not been opened");if(this._sent)throw new Error("Request has already been sent");this._sent=!0,(0,e("@weex-module/stream").fetch)({method:this._method,url:this._url,headers:this._headers,body:t,type:"text"},function(e){try{"string"==typeof e&&(e=JSON.parse(e)),n.status=e.status,n.statusText=e.statusText,n.setResponseHeaders(e.headers),e.ok?n._response=e.data:(""!==n._responseType&&"text"!==n._responseType||(n._response=e.data),n._hasError=!0)}catch(e){}n.setReadyState(n.DONE)},function(e){n.status=e.status,n.statusText=e.statusText,n.setResponseHeaders(e.headers),n.setReadyState(e.readyState)})}},{key:"abort",value:function(){this._aborted=!0,this.readyState===this.UNSENT||this.readyState===this.OPENED&&!this._sent||this.readyState===this.DONE||(this._reset(),this.setReadyState(this.DONE)),this._reset()}},{key:"setResponseHeaders",value:function(e){this.responseHeaders=e||null;var t=e||{};this._lowerCaseResponseHeaders=Object.keys(t).reduce(function(e,n){return e[n.toLowerCase()]=t[n],e},{})}},{key:"setReadyState",value:function(e){this.readyState=e,this.dispatchEvent({type:"readystatechange"}),e===this.DONE&&(this._aborted?this.dispatchEvent({type:"abort"}):this._hasError?this._timedOut?this.dispatchEvent({type:"timeout"}):this.dispatchEvent({type:"error"}):this.dispatchEvent({type:"load"}),this.dispatchEvent({type:"loadend"}))}},{key:"responseType",get:function(){return this._responseType},set:function(e){if(this._sent)throw new Error("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set after the request has been sent.");this._responseType=e}},{key:"responseText",get:function(){if(""!==this._responseType&&"text"!==this._responseType)throw new Error("The 'responseText' property is only available if 'responseType' is set to '' or 'text', but it is '"+this._responseType+"'.");return this.readyState<d?"":this._response}},{key:"response",get:function(){var e=this.responseType;return""===e||"text"===e?this.readyState<d||this._hasError?"":this._response:this.readyState!==f?null:void 0}}]),n}(),t.UNSENT=l,t.OPENED=c,t.HEADERS_RECEIVED=u,t.LOADING=d,t.DONE=f,n}},function(e,t,n){function r(e,t){for(var n=e[a][t];null!=n;){if(n.kind===s)return n.listener;n=n.next}return null}function o(e,t,n){"function"!=typeof n&&"object"!=typeof n&&(n=null);for(var r=null,o=e[a][t];null!=o;)o.kind===s?null==r?e[a][t]=o.next:r.next=o.next:r=o,o=o.next;null!=n&&(null==r?e[a][t]=l(n,s):r.next=l(n,s))}var i=n(0),a=i.LISTENERS,s=i.ATTRIBUTE,l=i.newNode;e.exports.defineCustomEventTarget=function(e,t){function n(){e.call(this)}var i={constructor:{value:n,configurable:!0,writable:!0}};return t.forEach(function(e){i["on"+e]={get:function(){return r(this,e)},set:function(t){o(this,e,t)},configurable:!0,enumerable:!0}}),n.prototype=Object.create(e.prototype,i),n}},function(e,t,n){var r=n(0).createUniqueKey,o=r("stop_immediate_propagation_flag"),i=r("canceled_flag"),a=r("passive_listener_flag"),s=r("original_event"),l=Object.freeze({stopPropagation:Object.freeze({value:function(){var e=this[s];"function"==typeof e.stopPropagation&&e.stopPropagation()},writable:!0,configurable:!0}),stopImmediatePropagation:Object.freeze({value:function(){this[o]=!0;var e=this[s];"function"==typeof e.stopImmediatePropagation&&e.stopImmediatePropagation()},writable:!0,configurable:!0}),preventDefault:Object.freeze({value:function(){if(!this[a]){!0===this.cancelable&&(this[i]=!0);var e=this[s];"function"==typeof e.preventDefault&&e.preventDefault()}},writable:!0,configurable:!0}),defaultPrevented:Object.freeze({get:function(){return this[i]},enumerable:!0,configurable:!0})});e.exports.STOP_IMMEDIATE_PROPAGATION_FLAG=o,e.exports.PASSIVE_LISTENER_FLAG=a,e.exports.createEventWrapper=function(e,t){var n="number"==typeof e.timeStamp?e.timeStamp:Date.now(),r={type:{value:e.type,enumerable:!0},target:{value:t,enumerable:!0},currentTarget:{value:t,enumerable:!0},eventPhase:{value:2,enumerable:!0},bubbles:{value:Boolean(e.bubbles),enumerable:!0},cancelable:{value:Boolean(e.cancelable),enumerable:!0},timeStamp:{value:n,enumerable:!0},isTrusted:{value:!1,enumerable:!0}};return r[o]={value:!1,writable:!0},r[i]={value:!1,writable:!0},r[a]={value:!1,writable:!0},r[s]={value:e},void 0!==e.detail&&(r.detail={value:e.detail,enumerable:!0}),Object.create(Object.create(e,l),r)}},function(e,t,n){function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(2),l="@weex-module/webSocket",c=0,u=1,d=3,f=["close","error","message","open"],p=function e(t,n){i(this,e),this.type=t.toString(),Object.assign(this,n)};e.exports=function(e){var t,n;return n=t=function(t){function n(t,o){i(this,n);var a=r(this,(n.__proto__||Object.getPrototypeOf(n)).call(this)),s=e(l);return s.WebSocket(t,o),a.readyState=c,a.websocket=s,s.onmessage(function(e){a.dispatchEvent(new p("message",e))}),s.onopen(function(e){a.readyState=u,a.dispatchEvent(new p("open"))}),s.onclose(function(e){a.readyState=d,a.dispatchEvent(new p("close",{code:e.code,reason:e.reason}))}),s.onerror(function(e){a.dispatchEvent(new p("error",e))}),a}return o(n,s(f)),a(n,[{key:"close",value:function(e,t){2!==this.readyState&&this.readyState!==d&&(this.readyState=2,this.websocket.close(e,t))}},{key:"send",value:function(e){if("string"!=typeof e)throw new Error("Unsupported data type");this.websocket.send(e)}}]),n}(),t.CONNECTING=c,t.OPEN=u,t.CLOSING=2,t.CLOSED=d,n}},function(e,t,n){var r="@weex-module/timer";e.exports=function(e,t){return{setTimeout:function(n,o){return e(r).setTimeout(n,o),t.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(t){e(r).clearTimeout(t)},setInterval:function(n,o){return e(r).setInterval(n,o),t.taskCenter.callbackManager.lastCallbackId.toString()},clearInterval:function(t){e(r).clearInterval(t)},requestAnimationFrame:function(t){return e(r).setTimeout(t,16)},cancelAnimationFrame:function(t){e(r).clearTimeout(t)}}}},function(e,t,n){e.exports=function(){var e={},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return e.btoa=function(e){for(var n,r,o=String(e),i=0,a=t,s="";o.charAt(0|i)||(a="=",i%1);s+=a.charAt(63&n>>8-i%1*8)){if((r=o.charCodeAt(i+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");n=n<<8|r}return s},e.atob=function(e){var n=String(e).replace(/=+$/,"");if(n.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,o,i=0,a=0,s="";o=n.charAt(a++);~o&&(r=i%4?64*r+o:o,i++%4)?s+=String.fromCharCode(255&r>>(-2*i&6)):0)o=t.indexOf(o);return s},e}},function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}e.exports=function(e){var t,n={};return n.timing=(t={unloadEventStart:0,unloadEventEnd:0,navigationStart:e,redirectStart:0,redirectEnd:0,fetchStart:e,domainLookupStart:e,domainLookupEnd:e,connectStart:e,secureConnectionStart:e},r(t,"connectStart",e),r(t,"requestStart",e),r(t,"responseStart",e),r(t,"responseEnd",e),r(t,"domLoading",0),r(t,"domInteractive",0),r(t,"domComplete",0),r(t,"domContentLoadedEventStart",0),r(t,"domContentLoadedEventEnd",0),r(t,"loadEventStart",0),r(t,"loadEventEnd",0),t),n.now=function(){return Date.now()-n.timing.navigationStart},n}},function(e,t,n){function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e.exports=function(){var e=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,e),this.type=t,this.bubbles=Boolean(n.bubbles),this.cancelable=Boolean(n.cancelable)};return{Event:e,CustomEvent:function(t){function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i(this,n);var o=r(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e,t));return o.detail=t.detail,o}return o(n,e),n}()}}}])})),Weex:id},sd={_instances:{},_meta:{},apiModule:{},getApiModuleMeta:function(e){var t={};return t[e]=this._meta[e],t},setApiModuleMeta:function(e){var t;for(var n in e)e.hasOwnProperty(n)&&(t=n);var r=this._meta[t];if(r){var o={};e[t].forEach(function(e){o[e.name]=e}),r.forEach(function(e,t){o[e.name]&&(r[t]=o[e.name],delete o[e.name])});for(var i in e)e.hasOwnProperty(i)&&r.push(e[i])}else this._meta[t]=e[t];this._meta[t]=e[t]},setApiMeta:function(e,t){var n=this._meta[e];if(n){var r=-1;n.forEach(function(e,n){void 0===t.name&&(r=n)}),-1!==r?n[r]=t:n.push(t)}else this._meta[e]=[t]}},ld={weexVersion:"0.5.0",debug:!1,validRoots:["div","list","vlist","scroller"],downgrade:{}},cd=["ms","moz","webkit","o"],ud=!1;!function(){try{var e=new Image;e.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA",e.onload=function(){2===e.height&&(ud=!0)}}catch(e){}}();var dd=!1;!function(){var e=document.createElement("div").style;e.cssText=cd.concat([""]).map(function(e){return"position:"+(e?"-"+e+"-":"")+"sticky"}).join(";")+";",dd=-1!==e.position.indexOf("sticky")}();var fd=Object.freeze({isArray:sn,slice:function(e,t,n){return sn(e)?e.slice(t,n):Array.prototype.slice.call(e,t,n)},vendors:cd,getType:ln,appendStyle:function(e,t,n){var r=document.getElementById(t);r&&n&&(r.parentNode.removeChild(r),r=null),r||((r=document.createElement("style")).type="text/css",t&&(r.id=t),document.getElementsByTagName("head")[0].appendChild(r)),r.appendChild(document.createTextNode(e))},getUniqueFromArray:function(e){if(!sn(e))return[];for(var t,n=[],r={},o=0,i=e.length;o<i;o++)r[t=e[o]]||(r[t]=!0,n.push(t));return n},detectWebp:function(){return ud},detectSticky:function(){return dd},getRandom:cn,getRgb:function(e){var t;return e+="",(t=e.match(/#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/))?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:(t=e.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/))?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3])}:void 0},loopArray:function(e,t,n){if(sn(e)){var r="l"===(n+"").toLowerCase(),o=e.length;if((t%=o)<0&&(t=-t,r=!r),0===t)return e;var i,a;return r?(i=e.slice(0,t),a=e.slice(t)):(i=e.slice(0,o-t),a=e.slice(o-t)),a.concat(i)}},throttle:un,camelToKebab:dn,kebabToCamel:function(e){return e?e.replace(/-([a-z])/g,function(e,t){return console.log(t),""+t.toUpperCase()}):""},findEnterKeyType:fn,extend:ee,def:te,remove:ne,hasOwn:re,bind:oe,toArray:function(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r},isObject:ie,isPlainObject:ae,typof:ce}),pd={};pn.getSender=function(e){return pd[e]},pn.prototype={performCallback:function(e,t,n){var r=[e];t&&r.push(t),n&&r.push(n),hn(this.instanceId,{method:"callback",args:r})},fireEvent:function(e,t,n,r){n.extra&&ee(r,n.extra()),hn(this.instanceId,{method:"fireEvent",args:[e,t,r,n.updator&&n.updator()]})}};var hd={init:function(){xn()}},vd=[],md=!1,yd=0,gd={},bd={},Ad=["scroller","hscroller","vscroller","list","hlist","vlist"];jn.getInstance=function(e){return gd[e]},jn.registerComponent=function(e,t){bd[e]=t},jn.getScrollableTypes=function(){return Ad},jn.prototype={getWeexInstance:function(){return this._weexInstance||(this._weexInstance=global.weex?global.weex.getInstance(this.id):null),this._weexInstance},rendering:function(){function e(){window.dispatchEvent(new Event("renderend")),this._renderingTimer=null}this._renderingTimer?(clearTimeout(this._renderingTimer),this._renderingTimer=setTimeout(e.bind(this),800)):(window.dispatchEvent(new Event("renderbegin")),this._renderingTimer=setTimeout(e.bind(this),800))},getComponent:function(e){return this.componentMap[e]},removeComponent:function(e){var t=this;e&&this.componentMap[e]&&function e(n){var r=t.componentMap[n],o=r._listeners,i=r.data.children;if(i&&i.length)for(var a=0,s=i.length;a<s;a++)e(i[a].ref);if(o)for(var l in o)r.node.removeEventListener(l,o[l]);delete r._listeners,delete r.node._listeners,delete t.componentMap[n]}(e)},createElement:function(e,t){var n=bd[e.type];n||(n=bd.div),e.instanceId=this.id;var r=new n(e,t),o=e.ref;return this.componentMap[o]=r,r.node.setAttribute("data-ref",o),r},createBody:function(e){if(console.log("[h5-render] createBody",e),!this.componentMap._root){var t=e.type;e.type="root",e.rootId=this.getWeexInstance().rootId,e.ref="_root";var n=this.createElement(e,t);(document.querySelector("#"+this.getWeexInstance().rootId)||document.body).appendChild(n.node),n._appended=!0,this.handleAppend(n)}},appendChild:function(e,t){var n=this.componentMap[e];if(!this.componentMap[t.ref]&&n){"_root"!==e||n||((n=this.createElement({type:"root",rootId:this.getWeexInstance().rootId,ref:"_root"}))._appended=!0);var r=n.appendChild(t);r&&(r.parentRef=e),r&&n._appended&&this.handleAppend(r)}},removeElement:function(e){var t=this;if(sn(e))return e.map(function(e){return t.removeElement(e)});var n=this.componentMap[e];if(this.rendering(),n&&n.parentRef){var r=this.componentMap[n.parentRef];n.onRemove&&n.onRemove(),r.removeChild(n)}else n?console.error("[h5-render] parent component '"+n.parentRef+"' does not exist."):console.error("[h5-render] component of ref '"+e+"' does not exist.")},moveElement:function(e,t,n){var r,o,i,a,s=this.componentMap[e],l=this.componentMap[t],c=s.parentRef;if(!s)return console.error("[h5-render] component of ref '"+e+"' does not exist.");if(!l)return console.error("[h5-render] parent component '"+t+"' does not exist.");if(n<-1)return n=-1,console.error("[h5-render] index cannot be less than -1.");if(this.rendering(),(r=l.data.children)&&r.length&&-1!==n&&n<r.length&&(o=this.componentMap[l.data.children[n].ref]),c&&this.componentMap[c]&&(r=this.componentMap[c].data.children)&&r.length){for(i=0,a=r.length;i<a&&r[i].ref!==e;i++);a>i&&r.splice(i,1)}l.insertBefore(s,o),s.onMove&&s.onMove(t,n)},insertBefore:function(e,t){var n,r,o=this.componentMap[e];n=this.componentMap[t.ref],o&&(r=this.componentMap[o.parentRef]),!n&&r&&o&&(n=this.createElement(t))&&(n.parentRef=o.parentRef,r.insertBefore(n,o),this.componentMap[o.parentRef]._appended&&this.handleAppend(n))},addElement:function(e,t,n){this.rendering();var r=this.componentMap[e];if(r){var o=r.data.children;if(n<-1)return n=-1,console.error("[h5-render] index cannot be less than -1.");o&&o.length&&o.length>n&&-1!==n?this.insertBefore(o[n].ref,t):this.appendChild(e,t)}},addEvent:function(e,t){var n=this.componentMap[e];if(!n)return console.error("[h5-render] component of ref '"+e+"' does not exist.");n.bindEvents([t])},removeEvent:function(e,t){var n=this.componentMap[e];if(!n)return console.error("[h5-render] component of ref '"+e+"' does not exist.");n.unbindEvents([t])},updateAttrs:function(e,t){var n=this.componentMap[e];if(!n)return console.error("[h5-render] component of ref '"+e+"' does not exist.");n.updateAttrs(t)},updateStyle:function(e,t){var n=this.componentMap[e];if(!n)return console.error("[h5-render] component of ref '"+e+"' does not exist.");n.updateStyle(t)},handleAppend:function(e){var t=this;e._appended=!0,e.onAppend&&e.onAppend();var n=e.data.children;if(n)for(var r=0;r<n.length;r++){var o=t.componentMap[n[r].ref];o&&t.handleAppend(o)}Cn(e),e.fireLazyload()},createFinish:function(e){window.dispatchEvent(new Event("weex:createfinish"))},updateFinish:function(e){window.dispatchEvent(new Event("weex:updatefinish"))},refreshFinish:function(e){window.dispatchEvent(new Event("weex:refreshfinish"))}};var wd={xhr:function(e,t){e.source||t(new Error("xhr loader: missing config.source."));var n=new XMLHttpRequest;n.open("GET",e.source),n.onload=function(){t(null,this.responseText)},n.onerror=function(e){t(e)},n.send()},jsonp:function(e,t){e.source||t(new Error("jsonp loader: missing config.source."));var n=e.jsonpCallback||"weexJsonpCallback";window[n]=function(e){e?t(null,e):t(new Error("load by jsonp error"))};var r=document.createElement("script");r.src=decodeURIComponent(e.source),r.type="text/javascript",document.body.appendChild(r)},source:function(e,t){e.source?t(null,e.source):t(new Error("source code laoder: missing config.source."))}},_d=["flex","opacity","zIndex","fontWeight"],xd=0,Ed=Object.freeze({create:function(e){return document.createElement(e||"div")},createChildren:function(){var e=this,t=this.data.children,n=this.data.ref,r=this.getComponentManager();if(t&&t.length){for(var o=document.createDocumentFragment(),i=!1,a=0;a<t.length;a++){t[a].instanceId=e.data.instanceId;var s=r.createElement(t[a]);o.appendChild(s.node),s.parentRef=n,!i&&s.data.style&&s.data.style.hasOwnProperty("flex")&&(i=!0)}this.node.appendChild(o)}},appendChild:function(e){var t=this.data.children,n=this.getComponentManager().createElement(e);return this.node.appendChild(n.node),t&&t.length?t.push(e):this.data.children=[e],n},insertBefore:function(e,t){var n,r=this.data.children,o=0,i=!1;if(r&&r.length&&t){for(n=r.length;o<n&&r[o].ref!==t.data.ref;o++);o===n&&(i=!0)}else i=!0;i?(this.node.appendChild(e.node),r.push(e.data)):(t.fixedPlaceholder?this.node.insertBefore(e.node,t.fixedPlaceholder):t.stickyPlaceholder?this.node.insertBefore(e.node,t.stickyPlaceholder):this.node.insertBefore(e.node,t.node),r.splice(o,0,e.data))},removeChild:function(e){var t=this.data.children,n=0,r=this.getComponentManager();if(t&&t.length){var o;for(o=t.length;n<o&&t[n].ref!==e.data.ref;n++);n<o&&t.splice(n,1)}r.removeComponent(e.data.ref),e.unsetPosition(),e.node.parentNode.removeChild(e.node)},updateAttrs:function(e){var t=this;this.node.attr||(this.node.attr={});for(var n in e){var r=e[n],o=t.attr[n];"function"==typeof o?o.call(t,r):("boolean"==typeof r?t.node[n]=r:t.node.setAttribute(n,r),t.node.attr[n]=r)}},updateStyle:function(e){var t=this,n={};for(var r in e){var o=e[r],i=/^([^:]+)((?::[^:]+)+)/,a=r.match(i),s=void 0,l=void 0;a?(s=a[1],l=a[2]):s=r;var c=t.style[s];if("function"!=typeof c){var u=Pn(s)[typeof o];if("function"==typeof u&&(o=u(o)),a)if(n[l])n[l][s]=o;else{var d;n[l]=(d={},d[s]=o,d)}else t.node.style[s]=o}else c.call(t,o)}Object.keys(n).length>0&&Nn(this,0,n)},bindEvents:function(e){var t=this,n=this.getWeexInstance();e.map(function(e){var r=t.event[e]||{},o=r.setter;if(o)t.node.addEventListener(e,o);else{var i=n.sender,a=function(n){if(!n._alreadyTriggered){n._alreadyTriggered=!0;var o=ee({},n);o.target=t.data,i.fireEvent(t.data.ref,e,{extra:r.extra&&r.extra.bind(t),updator:r.updator&&r.updator.bind(t)},o)}};t.node.addEventListener(e,a,!1,!1);var s=t._listeners;s||(s=t._listeners={},t.node._listeners={}),s[e]=a,t.node._listeners[e]=a}})},unbindEvents:function(e){var t=this;e.map(function(e){var n=this._listeners;n&&(t.node.removeEventListener(e,n),t._listeners[e]=null,t.node._listeners[e]=null)})}}),Cd=navigator.userAgent,kd=!!Cd.match(/Firefox/i),Sd=!!Cd.match(/IEMobile/i),Od=kd?"-moz-":Sd?"-ms-":"-webkit-",Id=kd?"Moz":Sd?"ms":"webkit";Dn.prototype={constructor:Dn,init:function(){var e=this.element.style;e[Id+"Transform"]="translateZ(0)",e.transform="translateZ(0)",Bn(this),this._simulateSticky(),this._bindResize()},_bindResize:function(){var e=this,t=/android/gi.test(navigator.appVersion),n=e._resizeEvent="onorientationchange"in window?"orientationchange":"resize",r=e._resizeHandler=function(){setTimeout(function(){e.refresh()},t?200:0)};window.addEventListener(n,r,!1)},refresh:function(){this._detach(),this._simulateSticky()},_simulateSticky:function(){var e=this,t=this.isInScrollable();this.offset=(t?this.getParentScroller().offset:window.pageYOffset)||0;var n=this.element.getBoundingClientRect().top,r=0;t&&(r=this.parentElement.getBoundingClientRect().top);var o=this.withinParent,i=n-r+this.offset;this.curState=1;var a=this._scrollHandler=un(function(t){var n=i,r=e.isInScrollable()?t.offset:window.pageYOffset;e.offset=r,r<n?1!==e.curState&&(Fn(e),e.curState=1):(!o&&r>=n||o&&r>=n)&&2!==e.curState&&(Rn(e),e.curState=2)},100);if(window.addEventListener("scroll",a,!1),this.offset>=i){var s=document.createEvent("HTMLEvents");s.initEvent("scroll",!0,!0),window.dispatchEvent(s)}},_detach:function(e){e=e?e+"":"relative",2===this.curState&&Fn(this),window.removeEventListener("scroll",this._scrollHandler,!1)},isInScrollable:function(){if(!this._isInScrollable)try{this._isInScrollable=this.component.isInScrollable()}catch(e){console.error("isInScrollable is not yet available to call",e)}return this._isInScrollable},getParentScroller:function(){return this.component.getParentScroller()},destroy:function(e){this._detach(e);var t=this.element.style;t.removeProperty(Od+"transform"),t.removeProperty("transform"),window.removeEventListener(this._resizeEvent,this._resizeHandler,!1)}};var jd={position:function(e){return"fixed"!==e&&this.unsetFixed(),"sticky"!==e&&this.unsetSticky(),"fixed"===e?this.setFixed():"sticky"===e?this.setSticky():void(this.node.style.position=e)}},Td=Object.freeze({setFixed:function(){setTimeout(function(){if(this.node.style.position="fixed",this.isInScrollable()){var e=this.node.parentNode;e&&(this.fixedPlaceholder=document.createElement("div"),this.fixedPlaceholder.classList.add("weex-fixed-placeholder"),this.fixedPlaceholder.style.cssText=["display:none;","width:0px;","height:0px;"].join(""),e.insertBefore(this.fixedPlaceholder,this.node),this.getRootContainer().appendChild(this.node))}}.bind(this),0)},unsetFixed:function(e){if(e=e?e+"":"relative",this.fixedPlaceholder){var t=this.fixedPlaceholder.parentNode;t.insertBefore(this.node,this.fixedPlaceholder),t.removeChild(this.fixedPlaceholder),this.fixedPlaceholder=null,this.node.style.position=e}},setSticky:function(){this.node.style.zIndex=100,setTimeout(function(){this.sticky=new Dn(this)}.bind(this),0)},unsetSticky:function(){this.sticky&&(this.sticky.destroy(),this.sticky=null)},unsetPosition:function(e){this.style.position.call(this,e)},style:jd}),Ld={stretch:"stretch","flex-start":"start","flex-end":"end",center:"center"},Pd={row:"horizontal",column:"vertical"},Md={"flex-start":"start","flex-end":"end",center:"center","space-between":"justify","space-around":"justify"},Nd={style:{flex:function(e){this.node.style.webkitBoxFlex=e,this.node.style.webkitFlex=e,this.node.style.flex=e},alignItems:function(e){this.node.style.webkitBoxAlign=Ld[e],this.node.style.webkitAlignItems=e,this.node.style.alignItems=e},alignSelf:function(e){this.node.style.webkitAlignSelf=e,this.node.style.alignSelf=e},flexDirection:function(e){this.node.style.webkitBoxOrient=Pd[e],this.node.style.webkitFlexDirection=e,this.node.style.flexDirection=e},justifyContent:function(e){this.node.style.webkitBoxPack=Md[e],this.node.style.webkitJustifyContent=e,this.node.style.justifyContent=e}}};!function(e,t){function n(e,t){Date.now();var n,r,o,i=0,a=null,s=function(){i=Date.now(),a=null,e.apply(n,r)};return function(){var l=Date.now();n=this,r=arguments;var c=t-(l-i);return c<=0||c>=t?(clearTimeout(a),a=null,o=e.apply(n,r)):null==a&&(a=setTimeout(s,c)),o}}function r(e,t){var e,n,r,o,i;if(e)return t||(t={x:0,y:0}),e!=window?(n=(e=e.getBoundingClientRect()).left,i=e.top,r=e.right,o=e.bottom):(i=0,r=(n=0)+e.innerWidth,o=i+e.innerHeight),{left:n,top:i,right:r+t.x,bottom:o+t.y}}function o(e,t){var n=t.right>e.left&&t.left<e.right,r=t.bottom>e.top&&t.top<e.bottom;return n&&r}function i(e,t){var n="none",r=e.left-t.left,o=e.top-t.top;return 0==o&&(n=0!=r?r>0?"left":"right":"none"),0==r&&(n=0!=o?o>0?"up":"down":"none"),n}function a(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function s(){var e=this,t=n(function(){u.apply(e,arguments)},this.options.wait);this.__handle&&(this.container.removeEventListener("scroll",this.__handle),this.__handle=null),this.__handle=t,this.container.addEventListener("scroll",t,!1),this.container.addEventListener("resize",function(t){u.apply(e,arguments)},!1),this.container.addEventListener("animationEnd",function(){u.apply(e,arguments)},!1),this.container.addEventListener("webkitAnimationEnd",function(){u.apply(e,arguments)},!1),this.container.addEventListener("transitionend",function(){u.apply(e,arguments)},!1)}function l(e){var t=this,n=this.options.container;if(this.container="string"==typeof n?h.querySelector(n):n,this.container==window)r=h.querySelectorAll(e);else var r=this.container.querySelectorAll(e);return r=(r=[].slice.call(r,null)).filter(function(e){return"1"!=e.dataset.bind||(delete e._hasAppear,delete e._hasDisAppear,delete e._appear,e.classList.remove(t.options.cls),!1)})}function c(e){var t=this;e&&e.length>0&&[].forEach.call(e,function(e){e._eleOffset=r(e),e.classList.remove(t.options.cls),e.dataset.bind=1})}function u(){var e=this.container,t=this.appearWatchElements,n=this.options.onAppear,a=this.options.onDisappear,s=r(e,{x:this.options.x,y:this.options.y}),l=this.options.once,c=arguments[0]||{};t&&t.length>0&&[].forEach.call(t,function(e,t){var u=r(e),d=i(e._eleOffset,u);e._eleOffset=u;var h=o(s,u),v=e._appear,m=e._hasAppear,y=e._hasDisAppear;f.data={direction:d},p.data={direction:d},h&&!v?(l&&!m||!l)&&(n&&n.call(e,c),e.dispatchEvent(f),e._hasAppear=!0,e._appear=!0):!h&&v&&(l&&!y||!l)&&(a&&a.call(e,c),e.dispatchEvent(p),e._hasDisAppear=!0,e._appear=!1)})}function d(e){a(this.options,e||(e={})),this.appearWatchElements=this.appearWatchElements||l.call(this,"."+this.options.cls),c.call(this,this.appearWatchElements),s.call(this)}var f,p,h=document,v=function(){d.apply(this,arguments)},m={instances:[],init:function(e){var t={options:{container:window,wait:100,x:0,y:0,cls:"lib-appear",once:!1,onReset:function(){},onAppear:function(){},onDisappear:function(){}},container:null,appearWatchElements:null,bind:function(e){var t=this.options.cls;if("string"==typeof e){var n=l.call(this,e);[].forEach.call(n,function(e,n){e.classList.contains(t)||e.classList.add(t)})}else{if(1!=e.nodeType||!this.container.contains(e))return this;e.classList.contains(t)||e.classList.add(t)}var r=l.call(this,"."+this.options.cls);return this.appearWatchElements=this.appearWatchElements.concat(r),c.call(this,r),this},reset:function(e){return d.call(this,e),this.appearWatchElements.forEach(function(e){delete e._hasAppear,delete e._hasDisAppear,delete e._appear}),this},fire:function(){this.appearWatchElements||(this.appearWatchElements=[]);var e=l.call(this,"."+this.options.cls);return this.appearWatchElements=this.appearWatchElements.concat(e),c.call(this,e),u.call(this),this}};v.prototype=t;var n=new v(e);return this.instances.push(n),n},fireAll:function(){this.instances.forEach(function(e){e.fire()})}};f=h.createEvent("HTMLEvents"),p=h.createEvent("HTMLEvents"),f.initEvent("_appear",!1,!0),p.initEvent("_disappear",!1,!0),t.appear=m}(window,window.lib||(window.lib={}));n(function(e){!function(t,n){function r(e,t,n){var r=new Image;r.src=e,r.onload=t?t.bind(r):null,r.onerror=n?n.bind(r):null}function o(e,t,n){var r=document.createEvent("CustomEvent");r.initCustomEvent(t,!1,!1,n),e.dispatchEvent(r)}function i(e,t,n){if(t)if("IMG"==e.nodeName.toUpperCase()){if(e.onerror=function(){this.onerror=null,this.src=n},e.setAttribute("src",t),!n)return}else r(t,function(){e.style.backgroundImage='url("'+t+'")';var n=this.width,r=this.height;o(e,"load",{success:!0,size:{naturalWidth:n,naturalHeight:r}})},function(){o(e,"load",{success:!1}),r(n,function(){e.style.backgroundImage='url("'+n+'")'})})}function a(){s=n.appear.init({cls:"imgtmp",once:!0,x:c.lazyWidth,y:c.lazyHeight,onAppear:function(e){var t=this;i(t,t.getAttribute("i-lazy-src"),t.dataset.placeholder),t.removeAttribute("i-lazy-src")}})}var s,l={},c={dataSrc:"img-src",lazyHeight:0,lazyWidth:0};l.logConfig=function(){console.log("lib-img Config\n",c)},l.fire=function(){s||a();var e="i_"+Date.now()%1e5,t=document.querySelectorAll("["+c.dataSrc+"]");[].forEach.call(t,function(t){"false"==t.dataset.lazy&&"true"!=t.dataset.lazy?i(t,t.getAttribute(c.dataSrc),t.dataset.placeholder):(t.classList.add(e),t.setAttribute("i-lazy-src",t.getAttribute(c.dataSrc))),t.removeAttribute(c.dataSrc)}),s.bind("."+e),s.fire()},l.defaultSrc="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==",n.img=l,e.exports=l}(window,window.lib||(window.lib={}))});var Bd,Rd=["appear","disappear"];Hn.prototype={getComponentManager:function(){return jn.getInstance(this.data.instanceId)},getWeexInstance:function(){return this.getComponentManager().getWeexInstance()},getParent:function(){return this.getComponentManager().componentMap[this.parentRef]},getParentScroller:function(){return this.isInScrollable()?this._parentScroller:null},getRootScroller:function(){if(this.isInScrollable()){for(var e=this._parentScroller,t=e._parentScroller;t;)t=(e=t)._parentScroller;return e}return null},getRootContainer:function(){return this.getWeexInstance().getRoot()||document.body},isScrollable:function(){var e=this.data.type;return-1!==jn.getScrollableTypes().indexOf(e)},isInScrollable:function(){if("boolean"==typeof this._isInScrollable)return this._isInScrollable;var e=this.getParent();return e&&"boolean"!=typeof e._isInScrollable&&!e.isScrollable()?"_root"===e.data.ref?(this._isInScrollable=!1,!1):(this._isInScrollable=e.isInScrollable(),this._parentScroller=e._parentScroller,this._isInScrollable):e&&"boolean"==typeof e._isInScrollable?(this._isInScrollable=e._isInScrollable,this._parentScroller=e._parentScroller,this._isInScrollable):e&&e.isScrollable()?(this._isInScrollable=!0,this._parentScroller=e,!0):void 0},dispatchEvent:function(e,t,n){if(Vn(this,e)){var r=document.createEvent("HTMLEvents");n=n||{},r.initEvent(e,n.bubbles||!1,n.cancelable||!1),!t&&(t={}),r.data=ee({},t),ee(r,t),this.node.dispatchEvent(r)}},onAppend:function(){var e=this,t=this.data.event;if(t&&t.length){for(var n=!1,r=0,o=t.length;r<o;r++)if("appear"===t[r]){n=!0;break}n&&setTimeout(function(){On(e)&&e.dispatchEvent("appear",{direction:""})},0)}},addAppendHandler:function(e){var t;this.onAppend&&(t=this.onAppend.bind(this)),this.onAppend=function(){t&&t.call(this),e&&e.call(this)}.bind(this)},enableLazyload:function(e){this.node?Un(this.node,e):console.error("[h5-render] this.node does not exist.")},fireLazyload:function(e){!e&&(e=this),zn(e)},attr:{},style:{},event:{},clearAttr:function(){},clearStyle:function(){this.node.cssText=""}},ee(Hn.prototype,Ed),ee(Hn.prototype,Td),ee(Hn.prototype.style,Nd.style),(Gn.prototype=Object.create(Hn.prototype)).createChildren=function(e){},Gn.prototype.appendChild=function(e){},Gn.prototype.insertBefore=function(e,t){},Gn.prototype.removeChild=function(e){};var Fd={};window.addEventListener("moduleevent",function(e){var t=e.detail||{},n=t.module,r=t.type;try{Fd[n][r].forEach(function(e){return e(t)})}catch(e){console.warn("[h5-render] no such event "+r+" for module "+n+".")}});var Dd={registerComponent:function(e,t){jn.registerComponent(e,t)},registerApiModule:function(e,t,n){if(Jn(e,t,n),sd.apiModule[e])for(var r in t)t.hasOwnProperty(r)&&(sd.apiModule[e][r]=t[r]);else sd.apiModule[e]=t;n&&(sd.setApiModuleMeta(n),global.registerModules(sd.getApiModuleMeta(e),!0))},registerApi:function(e,t,n,r){"function"==typeof n&&(sd.apiModule[e]||(sd.apiModule[e]={},sd._meta[e]=[]),sd.apiModule[e][t]=n,r&&(sd.setApiMeta(e,{name:t,args:r}),global.registerModules(sd.getApiModuleMeta(e),!0)))},registerLoader:function(e,t){Ln(e,t)}};"undefined"==typeof window&&(window={ctrl:{},lib:{}}),!window.ctrl&&(window.ctrl={}),!window.lib&&(window.lib={}),function(e,t){function n(e){Object.defineProperty(this,"val",{value:e.toString(),enumerable:!0}),this.gt=function(e){return n.compare(this,e)>0},this.gte=function(e){return n.compare(this,e)>=0},this.lt=function(e){return n.compare(this,e)<0},this.lte=function(e){return n.compare(this,e)<=0},this.eq=function(e){return 0===n.compare(this,e)}}t.env=t.env||{},n.prototype.toString=function(){return this.val},n.prototype.valueOf=function(){for(var e=this.val.split("."),t=[],n=0;n<e.length;n++){var r=parseInt(e[n],10);isNaN(r)&&(r=0);var o=r.toString();o.length<5&&(o=Array(6-o.length).join("0")+o),t.push(o),1===t.length&&t.push(".")}return parseFloat(t.join(""))},n.compare=function(e,t){e=e.toString().split("."),t=t.toString().split(".");for(var n=0;n<e.length||n<t.length;n++){var r=parseInt(e[n],10),o=parseInt(t[n],10);if(window.isNaN(r)&&(r=0),window.isNaN(o)&&(o=0),o>r)return-1;if(r>o)return 1}return 0},t.version=function(e){return new n(e)}}(window,window.lib||(window.lib={})),function(e,t){t.env=t.env||{};var n=e.location.search.replace(/^\?/,"");if(t.env.params={},n)for(var r=n.split("&"),o=0;o<r.length;o++){r[o]=r[o].split("=");try{t.env.params[r[o][0]]=decodeURIComponent(r[o][1])}catch(e){t.env.params[r[o][0]]=r[o][1]}}}(window,window.lib||(window.lib={})),function(e,t){t.env=t.env||{};var n,r=e.navigator.userAgent;if(n=r.match(/Windows\sPhone\s(?:OS\s)?([\d\.]+)/))t.env.os={name:"Windows Phone",isWindowsPhone:!0,version:n[1]};else if(r.match(/Safari/)&&(n=r.match(/Android[\s\/]([\d\.]+)/)))t.env.os={version:n[1]},r.match(/Mobile\s+Safari/)?(t.env.os.name="Android",t.env.os.isAndroid=!0):(t.env.os.name="AndroidPad",t.env.os.isAndroidPad=!0);else if(n=r.match(/(iPhone|iPad|iPod)/)){var o=n[1];n=r.match(/OS ([\d_\.]+) like Mac OS X/),t.env.os={name:o,isIPhone:"iPhone"===o||"iPod"===o,isIPad:"iPad"===o,isIOS:!0,version:n[1].split("_").join(".")}}else t.env.os={name:"unknown",version:"0.0.0"};t.version&&(t.env.os.version=t.version(t.env.os.version))}(window,window.lib||(window.lib={})),function(e,t){t.env=t.env||{};var n,r=e.navigator.userAgent;(n=r.match(/(?:UCWEB|UCBrowser\/)([\d\.]+)/))?t.env.browser={name:"UC",isUC:!0,version:n[1]}:(n=r.match(/MQQBrowser\/([\d\.]+)/))?t.env.browser={name:"QQ",isQQ:!0,version:n[1]}:(n=r.match(/Firefox\/([\d\.]+)/))?t.env.browser={name:"Firefox",isFirefox:!0,version:n[1]}:(n=r.match(/MSIE\s([\d\.]+)/))||(n=r.match(/IEMobile\/([\d\.]+)/))?(t.env.browser={version:n[1]},r.match(/IEMobile/)?(t.env.browser.name="IEMobile",t.env.browser.isIEMobile=!0):(t.env.browser.name="IE",t.env.browser.isIE=!0),r.match(/Android|iPhone/)&&(t.env.browser.isIELikeWebkit=!0)):(n=r.match(/(?:Chrome|CriOS)\/([\d\.]+)/))?(t.env.browser={name:"Chrome",isChrome:!0,version:n[1]},r.match(/Version\/[\d+\.]+\s*Chrome/)&&(t.env.browser.name="Chrome Webview",t.env.browser.isWebview=!0)):r.match(/Safari/)&&(n=r.match(/Android[\s\/]([\d\.]+)/))?t.env.browser={name:"Android",isAndroid:!0,version:n[1]}:r.match(/iPhone|iPad|iPod/)?r.match(/Safari/)?(n=r.match(/Version\/([\d\.]+)/),t.env.browser={name:"Safari",isSafari:!0,version:n[1]}):(n=r.match(/OS ([\d_\.]+) like Mac OS X/),t.env.browser={name:"iOS Webview",isWebview:!0,version:n[1].replace(/\_/g,".")}):t.env.browser={name:"unknown",version:"0.0.0"},t.version&&(t.env.browser.version=t.version(t.env.browser.version))}(window,window.lib||(window.lib={})),function(e,t){t.env=t.env||{};var n=e.navigator.userAgent;n.match(/Weibo/i)?t.env.thirdapp={appname:"Weibo",isWeibo:!0}:n.match(/MicroMessenger/i)?t.env.thirdapp={appname:"Weixin",isWeixin:!0}:t.env.thirdapp=!1}(window,window.lib||(window.lib={})),function(e,t){t.env=t.env||{};var n,r,o=e.navigator.userAgent;(r=o.match(/WindVane[\/\s]([\d\.\_]+)/))&&(n=r[1]);var i=!1,a="",s="",l="";(r=o.match(/AliApp\(([A-Z\-]+)\/([\d\.]+)\)/i))&&(i=!0,a=r[1],l=r[2],s=a.indexOf("-PD")>0?t.env.os.isIOS?"iPad":t.env.os.isAndroid?"AndroidPad":t.env.os.name:t.env.os.name),!a&&o.indexOf("TBIOS")>0&&(a="TB"),t.env.aliapp=!!i&&{windvane:t.version(n||"0.0.0"),appname:a||"unkown",version:t.version(l||"0.0.0"),platform:s||t.env.os.name},t.env.taobaoApp=t.env.aliapp}(window,window.lib||(window.lib={})),"undefined"==typeof window&&(window={ctrl:{},lib:{}}),!window.ctrl&&(window.ctrl={}),!window.lib&&(window.lib={}),function(e,t){function n(e){var t={};Object.defineProperty(this,"params",{set:function(e){if("object"==typeof e){for(var n in t)delete t[n];for(var n in e)t[n]=e[n]}},get:function(){return t},enumerable:!0}),Object.defineProperty(this,"search",{set:function(e){if("string"==typeof e){0===e.indexOf("?")&&(e=e.substr(1));var n=e.split("&");for(var r in t)delete t[r];for(var o=0;o<n.length;o++){var i=n[o].split("=");if(void 0!==i[1]&&(i[1]=i[1].toString()),i[0])try{t[decodeURIComponent(i[0])]=decodeURIComponent(i[1])}catch(e){t[i[0]]=i[1]}}}},get:function(){var e=[];for(var n in t)if(void 0!==t[n])if(""!==t[n])try{e.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]))}catch(r){e.push(n+"="+t[n])}else try{e.push(encodeURIComponent(n))}catch(t){e.push(n)}return e.length?"?"+e.join("&"):""},enumerable:!0});var n;Object.defineProperty(this,"hash",{set:function(e){"string"==typeof e&&(e&&e.indexOf("#")<0&&(e="#"+e),n=e||"")},get:function(){return n},enumerable:!0}),this.set=function(e){var t;if(!(t=(e=e||"").match(new RegExp("^([a-z0-9-]+:)?[/]{2}(?:([^@/:?]+)(?::([^@/:]+))?@)?([^:/?#]+)(?:[:]([0-9]+))?([/][^?#;]*)?(?:[?]([^#]*))?([#][^?]*)?$","i"))))throw new Error("Wrong uri scheme.");this.protocol=t[1]||("object"==typeof location?location.protocol:""),this.username=t[2]||"",this.password=t[3]||"",this.hostname=this.host=t[4],this.port=t[5]||"",this.pathname=t[6]||"/",this.search=t[7]||"",this.hash=t[8]||"",this.origin=this.protocol+"//"+this.hostname},this.toString=function(){var e=this.protocol+"//";return this.username&&(e+=this.username,this.password&&(e+=":"+this.password),e+="@"),e+=this.host,this.port&&"80"!==this.port&&(e+=":"+this.port),this.pathname&&(e+=this.pathname),this.search&&(e+=this.search),this.hash&&(e+=this.hash),e},e&&this.set(e.toString())}(window.lib||(window.lib={})).httpurl=function(e){return new n(e)}}(window);var Wd=!1,$d=window.document,Qd=$d.documentElement,Ud=Array.prototype.slice,zd={},Vd=null;Wd||(Qd.addEventListener("touchstart",function(e){0===Object.keys(zd).length&&(Qd.addEventListener("touchmove",tr,!1),Qd.addEventListener("touchend",nr,!1),Qd.addEventListener("touchcancel",rr,!1));for(var t=0;t<e.changedTouches.length;t++){var n=e.changedTouches[t],r={};for(var o in n)r[o]=n[o];var i={startTouch:r,startTime:Date.now(),status:"tapping",element:e.srcElement||e.target,pressingHandler:setTimeout(function(t,n){return function(){"tapping"===i.status&&(i.status="pressing",Xn(t,"longpress",{touch:n,touches:e.touches,changedTouches:e.changedTouches,touchEvent:e})),clearTimeout(i.pressingHandler),i.pressingHandler=null}}(e.srcElement||e.target,e.changedTouches[t]),500)};zd[n.identifier]=i}if(2==Object.keys(zd).length){var a=[];for(var o in zd)a.push(zd[o].element);Xn(Zn(a[0],a[1]),"dualtouchstart",{touches:Ud.call(e.touches),touchEvent:e})}},!1),Wd=!0),au.config.frameworks=ad;var Hd=ai.framework,Gd=ai.transformer;global.frameworkVersion=Hd,global.transformerVersion=Gd,hd.init(),au.config.Document.Listener=jn;var qd=au.init(au.config);for(var Yd in qd)!function(e){global[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=qd[e].apply(qd,t);return r instanceof Error&&console.error(r.toString()),r}}(Yd);var Jd=750,Kd="weex",Zd="weexJsonpCallback";global.WXEnvironment={weexVersion:ld.weexVersion,appName:lib.env.aliapp?lib.env.aliapp.appname:null,appVersion:lib.env.aliapp?lib.env.aliapp.version.val:null,platform:"Web",osName:lib.env.browser?lib.env.browser.name:null,osVersion:lib.env.browser?lib.env.browser.version.val:null,deviceWidth:window.innerWidth,deviceHeight:window.innerHeight,devicePixelRatio:window.devicePixelRatio?window.devicePixelRatio:window.screen.width>=1440?3.5:window.screen.width>=1080?3:window.screen.width>=800?2.5:window.screen.width>=640?2:window.screen.width>=480?1.5:1};var Xd={};!function(){if(!location.protocol.match(/file/)){var e=lib.httpurl(location.href).params,t=e.debug;ld.debug=!0===t||"true"===t,!ld.debug&&(console.debug=or);for(var n in e)if(e.hasOwnProperty(n)){var r=n.match(/^downgrade_(\w+)$/);if(!r||!r[1])continue;var o=r[1];if("boolean"==typeof ld.downgrade[o])continue;var i=e["downgrade_"+o];ld.downgrade[o]=!0===i||"true"===i}}}(),ar.init=function(e){sn(e)?e.forEach(function(e){new ar(e)}):"object"===ln(e)&&new ar(e)},ar.getInstance=function(e){return Xd[e]},ar.prototype={createApp:function(e,t){var n=document.querySelector("#"+this.rootId);n||((n=document.createElement("div")).id=this.rootId,document.body.appendChild(n));var r=window.createInstance(this.instanceId,t,{bundleUrl:this.bundleUrl,debug:e.debug},this.data);if(r instanceof Error)return console.error("[h5-render]",r)},getComponentManager:function(){return this._componentManager||(this._componentManager=jn.getInstance(this.instanceId)),this._componentManager},getRoot:function(){return document.querySelector("#"+this.rootId)}},ar.stopTheWorld=function(e){if(!e)return Object.keys(Xd).map(function(e){ar.stopTheWorld(e)});window.destroyInstance(e)},function(){if(!location.protocol.match(/file/)&&-1!==location.search.indexOf("hot-reload_controller"))if("undefined"!=typeof WebSocket){var e=location.hostname,t=new WebSocket("ws://"+e+":8082/","echo-protocol");t.onerror=function(){console.log("refresh controller websocket connection error")},t.onmessage=function(e){console.log("Received: '"+e.data+"'"),"refresh"===e.data&&location.reload()}}else console.info("auto refresh need WebSocket support")}(),function(e){e.install=Kn.bind(e),ee(e,Dd)}(ar),ee(ar,{Component:Hn,Atomic:Gn,ComponentManager:jn,utils:fd,config:ld}),global.weex=ar;var ef,tf={init:function(e){function t(e,t){var n=e.rootId+"-root",r=document.querySelector("#"+e.rootId),o=jn.getInstance(e.instanceId);this.data=e,r.classList.add("weex-container"),e.style.height||e.style.flex||(e.style.flex=1),t?-1===ld.validRoots.indexOf(t)?(console.warn("[h5-render] the root component type '"+t+"' is not one of\nthe types in ["+ld.validRoots+"] list. It is auto downgraded\nto 'droot'."),t="droot"):ld.downgrade.root&&(console.warn("[h5-render] the root is downgrade to 'droot' due to the downgrade\nconfiguration of weex."),t="droot"):(console.warn("[h5-render] no nodeType is specified, construct Root use 'droot' by default."),t="droot"),e.type=t;var i=o.createElement(e);return i.node.id=n,i}var n=e.Component;t.prototype=Object.create(n.prototype),e.registerComponent("root",t)}},nf={init:function(e){function t(e,t){n.call(this,e,t),this.node.classList.add("weex-container")}var n=e.Component;t.prototype=Object.create(n.prototype),e.registerComponent("div",t),e.registerComponent("container",t)}},rf=0,of={create:function(e){var t=document.createElement(e||"div");return t.classList.add("weex-droot"),t.classList.add("weex-container"),t},bindEvents:function(e){ef.prototype.bindEvents.call(this,e),window.addEventListener("scroll",function(e){var t=document.body,n=t.scrollHeight-window.innerHeight-t.scrollTop;n<=this.loadmoreoffset&&this.isAvailableToFireloadmore?(this.isAvailableToFireloadmore=!1,this.dispatchEvent("loadmore")):n>this.loadmoreoffset&&!this.isAvailableToFireloadmore&&(this.isAvailableToFireloadmore=!0)}.bind(this))}},af={loadmoreoffset:function(e){var t=parseFloat(e);t<0||isNaN(t)?console.warn("[h5-render] invalid loadmoreoffset: "+e):this.loadmoreoffset=t}},sf={init:function(e){function t(e,t){if("_root"!==e.ref)return console.warn("[h5-render] droot can only be used as a downgraded root.");this.loadmoreoffset=rf,this.isAvailableToFireloadmore=!0,ef.call(this,e,t)}ef=e.Component;var n=e.utils.extend;n(t.prototype=Object.create(ef.prototype),of),n(t.prototype,{attr:af}),e.registerComponent("droot",t)}};e(".weex-img {\n  background-repeat: no-repeat;\n  background-size: 100% 100%;\n  background-position: 50%;\n}",void 0);var lf,cf=["stretch","cover","contain"],uf="stretch",df={create:function(){var e=document.createElement("div");return e.classList.add("weex-img"),e.classList.add("weex-element"),e},clearAttr:function(){this.src="",this.node.style.backgroundImage=""}},ff={src:function(e){this.src||(this.src=lib.img.defaultSrc,this.node.style.backgroundImage="url("+this.src+")"),this.enableLazyload(e)},placeholder:function(e){this.node.dataset.placeholder=e},placeHolder:function(e){return this.attr.placeholder.call(this,e)},resize:function(e){-1===cf.indexOf(e)&&(e="stretch"),this.node.style.backgroundSize="stretch"===e?"100% 100%":e}},pf={width:function(e){((e=parseFloat(e))<0||isNaN(e))&&(e=200),this.node.style.width=e+"px"},height:function(e){((e=parseFloat(e))<0||isNaN(e))&&(e=200),this.node.style.height=e+"px"}},hf={load:{extra:function(){var e=this.node;return{naturalWidth:e.naturalWidth,naturalHeight:e.naturalHeight}}}},vf={init:function(e){function t(e){this.resize=uf,lf.call(this,e)}lf=e.Atomic;var n=e.utils.extend;n(t.prototype=Object.create(lf.prototype),df),n(t.prototype,{attr:ff}),n(t.prototype,{style:n(Object.create(lf.prototype.style),pf)}),n(t.prototype,{event:hf}),e.registerComponent("image",t)}},mf={create:function(){var e=document.createElement("div");return e.classList.add("weex-container"),e.style.fontSize="32px",this.textNode=document.createElement("span"),this.textNode.style.whiteSpace="pre-wrap",this.textNode.style.wordWrap="break-word",this.textNode.style.display="-webkit-box",this.textNode.style.webkitBoxOrient="vertical",this.style.lines.call(this,(this.data.style||{}).lines),e.appendChild(this.textNode),e},clearAttr:function(){this.node.firstChild.textContent=""}},yf={value:function(e){var t=this.node.firstChild;t.innerHTML="",null!=e&&""!==e&&(t.textContent=e)}},gf={lines:function(e){if(e=parseInt(e),!isNaN(e))if(e<=0)this.textNode.style.textOverflow="",this.textNode.style.overflow="visible",this.textNode.style.webkitLineClamp="";else{var t=this.data?this.data.style:null;this.textNode.style.overflow="hidden",this.textNode.style.textOverflow=t?t.textOverflow:"ellipsis",this.textNode.style.webkitLineClamp=e}},textOverflow:function(e){this.textNode.style.textOverflow=e}},bf={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),mf),r(t.prototype,{attr:yf}),r(t.prototype,{style:r(Object.create(n.prototype.style),gf)}),e.registerComponent("text",t)}};e(".scrollable-wrap {\n  display: block;\n  overflow: hidden;\n}\n\n.scrollable-element.horizontal {\n  -webkit-box-orient: horizontal;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n}\n.scrollable-element.vertical {\n  -webkit-box-orient: vertical;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n",void 0),lr.prototype.generateCubicBezier=function(){return sr(this.v/this.a,this.t+this.v/this.a)},!lib&&(lib={}),lib.motion=lr;var Af=window.document,wf=window.navigator.userAgent,_f={},xf={},Ef=window.dpr||(window.navigator.userAgent.match(/iPhone|iPad|iPod/)?document.documentElement.clientWidth/window.screen.availWidth:1),Cf={normal:[2*Ef,.0015*Ef],slow:[1.5*Ef,.003*Ef],veryslow:[1.5*Ef,.005*Ef]},kf=!!wf.match(/Firefox/i),Sf=!!wf.match(/IEMobile/i),Of=kf?"-moz-":Sf?"-ms-":"-webkit-",If=kf?"Moz":Sf?"ms":"webkit",jf=Sf?"MSCSSMatrix":"WebKitCSSMatrix",Tf=!!kf||jf in window&&"m11"in new window[jf],Lf=!1;Af.addEventListener("touchmove",function(e){return!Lf||(e.preventDefault(),!1)},!1),lib.scroll=function(e,t){if(1===arguments.length&&!(arguments[0]instanceof HTMLElement))if((t=arguments[0]).scrollElement)e=t.scrollElement;else{if(!t.scrollWrap)throw new Error("no scroll element");e=t.scrollWrap.firstElementChild}if(!e.parentNode)throw new Error("wrong dom tree");if(t&&t.direction&&["x","y"].indexOf(t.direction)<0)throw new Error("wrong direction");return!0===t.downgrade&&lib.scroll.downgrade?lib.scroll.downgrade(e,t):e.scrollId?_f[e.scrollId]:new Ar(e,t)},lib.scroll.plugin=function(e,t){if(!t)return xf[e];(e=e.split(",")).forEach(function(e){xf[e]=t})};var Pf={h:["row","horizontal","h","x"],v:["column","vertical","v","y"]},Mf="column",Nf=0,Bf={loadmoreoffset:function(e){(e=parseFloat(e))<0||isNaN(e)?console.warn("[h5-render] invalida"):this.loadmoreoffset=e}},Rf={init:function(e){function t(e,t){this.loadmoreoffset=Nf,this.isAvailableToFireloadmore=!0;var r=e.attr||{},o=r.scrollDirection||r.direction||Mf;this.direction=-1===Pf.h.indexOf(o)?"v":"h",this.showScrollbar=r.showScrollbar||!0,n.call(this,e,t)}var n=e.Component,r=e.utils.extend;return t.prototype=Object.create(n.prototype),r(t.prototype,xr(e)),r(t.prototype,{attr:Bf}),t}},Ff=["cell","loading","refresh"],Df={init:function(e){function t(e,t){n.call(this,e,t)}var n=Rf.init(e),r=e.utils.extend;return t.prototype=Object.create(n.prototype),r(t.prototype,Er(n)),t}},Wf={init:function(e){function t(e,t){e.attr.direction="v",n.call(this,e,t)}var n=Df.init(e);t.prototype=Object.create(n.prototype),e.registerComponent("list",t),e.registerComponent("vlist",t)}},$f={init:function(e){function t(e,t){e.attr.direction="h",n.call(this,e,t)}var n=Df.init(e);t.prototype=Object.create(n.prototype),e.registerComponent("hlist",t)}},Qf={init:function(e){e.install(Wf),e.install($f)}},Uf={init:function(e){function t(e,t){n.call(this,e,t)}var n=Rf.init(e);(0,e.utils.extend)(t.prototype=Object.create(n.prototype),{create:function(){var e=n.prototype.create.call(this);return e.classList.add("scroller-wrap"),this.scrollElement.classList.add("scroller-element"),e}}),e.registerComponent("scroller",t)}};e(".weex-refresh {\n  // -webkit-box-align: center;\n  // -webkit-align-items: center;\n  // align-items: center;\n  // -webkit-box-pack: center;\n  // -webkit-justify-content: center;\n  // justify-content: center;\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 0;\n  z-index: 999999;\n  background-color: #666;\n}",void 0);var zf=["scroller","list","vlist"],Vf=130,Hf="center",Gf="center",qf={create:function(){var e=document.createElement("div");return e.classList.add("weex-container"),e.classList.add("weex-refresh"),e},onAppend:function(){var e=this.getParent(),t=this;-1!==zf.indexOf(e.data.type)&&(this.refreshPlaceholder=document.createElement("div"),this.refreshPlaceholder.classList.add("weex-refresh-placeholder"),this.refreshPlaceholder.style.display="none",this.refreshPlaceholder.style.width="0px",this.refreshPlaceholder.style.height="0px",(e.scrollElement||e.listElement).insertBefore(this.refreshPlaceholder,this.node),e.node.appendChild(this.node),e.scroller.addEventListener("pulldown",function(e){t.isRefreshing||(Cr(t,Math.abs(e.scrollObj.getScrollTop())),t.display||Sr(t))}),e.scroller.addEventListener("pulldownend",function(e){t.isRefreshing||(Math.abs(e.scrollObj.getScrollTop())>t.clamp?kr(t):Or(t))}))}},Yf={display:function(e){"show"===e?setTimeout(function(){Sr(this)}.bind(this),0):"hide"===e?setTimeout(function(){Or(this)}.bind(this),0):console.error("[h5-render] attr 'display' of <refresh>': value "+e+" is invalid. Should be 'show' or 'hide'")}},Jf={height:function(e){if(e=parseFloat(e),isNaN(e)||e<0)return console.warn("[h5-render] <refresh>'s height ("+e+") is invalid.");this.clamp=e}},Kf={init:function(e){function t(e){this.isRefreshing=!1,this.clamp=e.style.height||Vf,!e.style.alignItems&&(e.style.alignItems=Hf),!e.style.justifyContent&&(e.style.justifyContent=Gf),n.call(this,e)}var n=e.Component,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),qf),r(t.prototype,{attr:Yf}),r(t.prototype,{style:r(Object.create(n.prototype.style),Jf)}),e.registerComponent("refresh",t)}};e(".weex-loading {\n  // -webkit-box-align: center;\n  // -webkit-align-items: center;\n  // align-items: center;\n  // -webkit-box-pack: center;\n  // -webkit-justify-content: center;\n  // justify-content: center;\n  overflow: hidden;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 0;\n  background-color: #666;\n}",void 0);var Zf=["scroller","list","vlist"],Xf=130,ep="center",tp="center",np={create:function(){var e=document.createElement("div");return e.classList.add("weex-container"),e.classList.add("weex-loading"),e},onAppend:function(){var e=this.getParent(),t=this,n=e.node.getBoundingClientRect().height;-1!==Zf.indexOf(e.data.type)&&(this.loadingPlaceholder=document.createElement("div"),this.loadingPlaceholder.classList.add("weex-loading-placeholder"),this.loadingPlaceholder.style.display="none",this.loadingPlaceholder.style.width="0px",this.loadingPlaceholder.style.height="0px",(e.scrollElement||e.listElement).insertBefore(this.loadingPlaceholder,this.node),e.node.appendChild(this.node),e.scroller.addEventListener("pullup",function(e){if(!t.isLoading){var r=e.scrollObj;Ir(t,Math.abs(r.getScrollHeight()-r.getScrollTop()-n)),t.display||Tr(t)}}),e.scroller.addEventListener("pullupend",function(e){t.isLoading||jr(t)}))}},rp={display:function(e){"show"===e?setTimeout(function(){Tr(this)}.bind(this),0):"hide"===e?setTimeout(function(){Lr(this)}.bind(this),0):console.error("[h5-render] attr 'display' of <refresh>': value "+e+" is invalid. Should be 'show' or 'hide'")}},op={height:function(e){if(e=parseFloat(e),Number.isNaN(e)||e<0)return console.warn("[h5-render] <loading>'s height ("+e+") is invalid.");this.clamp=e}},ip={init:function(e){function t(e){this.clamp=e.style.height||Xf,!e.style.alignItems&&(e.style.alignItems=ep),!e.style.justifyContent&&(e.style.justifyContent=tp),n.call(this,e)}var n=e.Component,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),np),r(t.prototype,{attr:rp}),r(t.prototype,{style:r(Object.create(n.prototype.style),op)}),e.registerComponent("loading",t)}},ap={init:function(e){e.install(Qf),e.install(Uf),e.install(Kf),e.install(ip)}};"undefined"==typeof window&&(window={ctrl:{},lib:{}}),!window.ctrl&&(window.ctrl={}),!window.lib&&(window.lib={}),function(e,t){function n(e,t,n,r){function o(e){return(3*c*e+2*u)*e+d}function i(e){return((c*e+u)*e+d)*e}function a(e){return((f*e+p)*e+h)*e}function s(e){for(var t,n,r=e,a=0;8>a;a++){if(n=i(r)-e,Math.abs(n)<l)return r;if(t=o(r),Math.abs(t)<l)break;r-=n/t}var s=1,c=0;for(r=e;s>c;){if(n=i(r)-e,Math.abs(n)<l)return r;n>0?s=r:c=r,r=(s+c)/2}return r}var l=1e-6,c=3*e-3*n+1,u=3*n-6*e,d=3*e,f=3*t-3*r+1,p=3*r-6*t,h=3*t;return function(e){return a(s(e))}}t.cubicbezier=n,t.cubicbezier.linear=n(0,0,1,1),t.cubicbezier.ease=n(.25,.1,.25,1),t.cubicbezier.easeIn=n(.42,0,1,1),t.cubicbezier.easeOut=n(0,0,.58,1),t.cubicbezier.easeInOut=n(.42,0,.58,1)}(window,window.lib||(window.lib={})),"undefined"==typeof window&&(window={ctrl:{},lib:{}}),!window.ctrl&&(window.ctrl={}),!window.lib&&(window.lib={}),function(e,t){function n(e){return setTimeout(e,u)}function r(e){clearTimeout(e)}function o(){var e={},t=new d(function(t,n){e.resolve=t,e.reject=n});return e.promise=t,e}function i(e,t){return["then","catch"].forEach(function(n){t[n]=function(){return e[n].apply(e,arguments)}}),t}function a(t){var n,r,s=!1;this.request=function(){s=!1;var a=arguments;return n=o(),i(n.promise,this),r=f(function(){s||n&&n.resolve(t.apply(e,a))}),this},this.cancel=function(){return r&&(s=!0,p(r),n&&n.reject("CANCEL")),this},this.clone=function(){return new a(t)}}function s(e,t){"function"==typeof t&&(t={0:t});for(var n=e/u,r=1/n,o=[],i=Object.keys(t).map(function(e){return parseInt(e)}),s=0;n>s;s++){var l=i[0],c=r*s;if(null!=l&&100*c>=l){var d=t[""+l];d instanceof a||(d=new a(d)),o.push(d),i.shift()}else o.length&&o.push(o[o.length-1].clone())}return o}function l(e){var n;return"string"==typeof e||e instanceof Array?t.cubicbezier?"string"==typeof e?t.cubicbezier[e]&&(n=t.cubicbezier[e]):e instanceof Array&&4===e.length&&(n=t.cubicbezier.apply(t.cubicbezier,e)):console.error("require lib.cubicbezier"):"function"==typeof e&&(n=e),n}function c(e,t,n){var r,a=s(e,n),c=1/(e/u),d=0;if(!l(t))throw new Error("unexcept timing function");var f=!1;this.play=function(){function e(){var n=c*(d+1).toFixed(10);a[d].request(n.toFixed(10),t(n).toFixed(10)).then(function(){f&&(d===a.length-1?(f=!1,r&&r.resolve("FINISH"),r=null):(d++,e()))},function(){})}if(!f)return f=!0,r||(r=o(),i(r.promise,this)),e(),this},this.stop=function(){return f?(f=!1,a[d]&&a[d].cancel(),this):void 0}}var u=1e3/60,d=e.Promise||t.promise&&t.promise.ES6Promise,f=window.requestAnimationFrame||window.msRequestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||n,p=window.cancelAnimationFrame||window.msCancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||r;(f===n||p===r)&&(f=n,p=r),t.animation=function(e,t,n){return new c(e,t,n)},t.animation.frame=function(e){return new a(e)},t.animation.requestFrame=function(e){return new a(e).request()}}(window,window.lib||(window.lib={})),e('[data-ctrl-name="carrousel"] {\n  position: relative;\n  -webkit-transform: translateZ(1px);\n  -ms-transform: translateZ(1px);\n  transform: translateZ(1px);\n}',void 0);var sp=!1,lp=window.requestAnimationFrame||window.webkitRequestAnimationFrame;lp||(sp=!0,lp=function(e){return Mr(e,16)});var cp=window.cancelAnimationFrame||window.webkitCancelAnimationFrame;!cp&&sp?cp=function(e){return Nr(e)}:cp||(cp=function(){});var up=(Number.MAX_SAFE_INTEGER||Math.pow(2,53)-1)-1,dp={},fp=0,pp=window.document,hp=window.navigator.userAgent,vp=!!hp.match(/Firefox/i),mp=!!hp.match(/IEMobile/i),yp=vp?"Moz":mp?"ms":"webkit",gp=Mr,bp=Nr,Ap=mp?"MSCSSMatrix":"WebKitCSSMatrix",wp=!!vp||Ap in window&&"m11"in new window[Ap],_p=Array.prototype.slice,xp=0;!lib&&(lib={}),lib.carrousel=function(e,t){function n(e,t){var n=pp.createEvent("HTMLEvents");if(n.initEvent(e,!1,!1),t)for(var r in t)n[r]=t[r];s.dispatchEvent(n)}function r(e){for(;e<0;)e+=u;for(;e>=u;)e-=u;return e}function o(e){if(0!==u){var t,r,o=c.get(e);u>1&&(t=c.get(e-1),r=2===u?c.getCloned(e+1):c.get(e+1),o.style.left=-l+"px",t.style.left=-l-d+"px",r.style.left=-l+d+"px"),f=o.index,n("change",{prevItem:t,curItem:o,nextItem:r})}}var i=this,a=Date.now()+"-"+ ++xp,s=document.createDocumentFragment();1!==arguments.length||arguments[0]instanceof HTMLElement||(t=arguments[0],e=null),e||(e=document.createElement("ul"),s.appendChild(e)),t=t||{},e.setAttribute("data-ctrl-name","carrousel"),e.setAttribute("data-ctrl-id",a),e.style.position="relative",e.style[yp+"Transform"]=Rr(0,0);var l=0,c={},u=0,d=t.step||e.getBoundingClientRect().width,f=0;c.add=function(t){var n=document.createElement("li");return n.style.display="none",n.style.float="left",n.index=u,"string"==typeof t?n.innerHTML=t:t instanceof HTMLElement&&n.appendChild(t),e.appendChild(n),Object.defineProperty(c,u+"",{get:function(){return n}}),u++,n},c.get=function(e){return c[r(e)]},c.getCloned=function(t){function n(e,t,r){var o=e._listeners;if(o){t._listeners=o;for(var i in o)t.addEventListener(i,o[i])}if(r&&e.children&&e.children.length)for(var a=0,s=e.children.length;a<s;a++)n(e.children[a],t.children[a],r)}var t=r(t),o=e.querySelector('[cloned="cloned-'+t+'"]'),i=c[t];return o||(n(i,o=i.cloneNode(!0),!0),e.appendChild(o),o.setAttribute("cloned","cloned-"+t),o.index=t),o},c.slide=function(t){if(0!==u){1===u&&(t=0);var n=Br(e).x,r=l+d*-t,i=r-n;0!==i&&new lib.animation(400,lib.cubicbezier.ease,function(t,r){e.style[yp+"Transform"]=Rr(n+i*r,0)}).play().then(function(){l=r,e.style[yp+"Transform"]=Rr(r,0),t&&o(f+t)})}},c.next=function(){c.slide(1)},c.prev=function(){c.slide(-1)},Fr(e.children).forEach(function(e){e.style.position="absolute",e.style.top="0",e.style.left=u*d+"px",e.style.float="left",e.index=u,Object.defineProperty(c,u+"",{get:function(){return e}}),u++}),Object.defineProperty(this,"items",{get:function(){return c}}),Object.defineProperty(c,"length",{get:function(){return u}}),Object.defineProperty(c,"index",{get:function(){return f}}),Object.defineProperty(c,"step",{get:function(){return d},set:function(e){d=e}});var p=!1,h=!1,v=!1;this.play=function(){if(!p)return p=!0,o(0);h||(h=gp(function e(){v=!0,c.next(),gp(function(){v=!1},500),h=gp(e,400+g)},400+g))},this.stop=function(){h&&(bp(h),gp(function(){h=!1},500))};var m=!1,y=!1;Object.defineProperty(this,"autoplay",{get:function(){return m},set:function(e){m=!!e,y&&(bp(y),y=!1),m?y=gp(function(){i.play()},2e3):i.stop()}}),this.autoplay=!!t.autoplay;var g=1500;if(Object.defineProperty(this,"playInterval",{get:function(){return g},set:function(e){g=e}}),this.playInterval=!!t.playInterval||1500,t.useGesture){var b,A=!1;e.addEventListener("panstart",function(e){e.isVertical||A&&v||(e.preventDefault(),e.stopPropagation(),m&&i.stop(),b=0,A=!0)}),e.addEventListener("panmove",function(t){!t.isVertical&&A&&(t.preventDefault(),t.stopPropagation(),b=t.displacementX,e.style[yp+"Transform"]=Rr(l+b,0))}),e.addEventListener("panend",function(e){!e.isVertical&&A&&(e.preventDefault(),e.stopPropagation(),A=!1,e.isSwipe?b<0?c.next():c.prev():Math.abs(b)<d/2?c.slide(0):c.slide(b<0?1:-1),m&&gp(function(){i.play()},2e3))},!1),e.addEventListener("swipe",function(e){e.isVertical||(e.preventDefault(),e.stopPropagation())})}this.addEventListener=function(e,t){this.root.addEventListener(e,t,!1)},this.removeEventListener=function(e,t){this.root.removeEventListener(e,t,!1)},this.root=s,this.element=e},e(".slider {\n  position: relative;\n}\n\n.slider .indicator-container {\n  position: absolute;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-align: center;\n  box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  font-size: 0;\n}\n.slider .indicator-container .indicator {\n  border-radius: 50%;\n}\n.slider .indicator-container.row {\n  -webkit-box-orient: horizontal;\n  box-orient: horizontal;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n}\n.slider .indicator-container.column {\n  -webkit-box-orient: vertical;\n  box-orient: vertical;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n}\n",void 0);var Ep,Cp,kp=3e3,Sp={create:function(){var e=document.createElement("div");return e.classList.add("slider"),e.classList.add("weex-container"),e.style.position="relative",e.style.overflow="hidden",e},createChildren:function(){var e=this,t=this.getComponentManager();this.sliderContainer&&this.node.removeChild(this.sliderContainer),this.indicator&&this.indicator.node.parentNode.removeChild(this.indicator.node),this.children=[];var n=document.createElement("ul");n.style.listStyle="none",this.node.appendChild(n),this.sliderContainer=n;var r,o,i,a=this.data.children,s=document.createDocumentFragment(),l=0,c=0;if(a&&a.length){for(var u=0;u<a.length;u++){var d=void 0;a[u].instanceId=e.data.instanceId,"indicator"===a[u].type?r=Ep(a[u],{extra:{amount:a.length-1,index:0}}):(d=t.createElement(a[u],"li"),e.children.push(d),s.appendChild(d.node),o=d.data.style.width||0,i=d.data.style.height||0,o>l&&(l=o),i>c&&(c=i),d.parentRef=e.data.ref)}r&&(r.extra.width=this.data.style.width||l,r.extra.height=this.data.style.height||c,this.indicator=t.createElement(r),this.indicator.parentRef=this.data.ref,this.indicator.slider=this,this.node.appendChild(this.indicator.node)),n.style.height=this.data.style.height+"px",n.appendChild(s)}},appendChild:function(e){if((this.data.children||(this.data.children=[])).push(e),Ur(this),this.children.length>0)return this.children[this.children.length-1]},insertBefore:function(e,t){for(var n=this.data.children,r=-1,o=0,i=n.length;o<i;o++)if(n[o].ref===t.data.ref){r=o;break}if(n.splice(r,0,e.data),Ur(this),this.children.length>0)return this.children[this.children.length-1]},removeChild:function(e){var t=this.data.children;if(t)for(var n=0;n<t.length;n++)if(e.data.ref===t[n].ref){t.splice(n,1);break}Ur(this)},onAppend:function(){this.carrousel&&(this.carrousel.removeEventListener("change",Qr(this)),this.carrousel.stop(),this.carrousel=null);var e=lib.carrousel;this.carrousel=new e(this.sliderContainer,{autoplay:this.autoPlay,useGesture:!0}),this.carrousel.playInterval=this.interval,this.carrousel.addEventListener("change",Qr(this)),this.currentIndex=0,this.preloadImgsTimer&&clearTimeout(this.preloadImgsTimer);this.preloadImgsTimer=setTimeout(function(){for(var e=this.carrousel.element.querySelectorAll(".weex-img"),t=0,n=e.length;t<n;t++){var r=e[t],o=r.getAttribute("i-lazy-src"),i=r.getAttribute("img-src");o?r.style.backgroundImage="url("+o+")":i&&(r.style.backgroundImage="url("+i+")"),r.removeAttribute("i-lazy-src"),r.removeAttribute("img-src")}}.bind(this),800);var t=!1;this.carrousel.element.addEventListener("panstart",function(e){e.isVertical||(t=!0)}),this.carrousel.element.addEventListener("panend",function(e){e.isVertical||(t=!1)}),document.addEventListener("touchmove",function(e){return!t||(e.preventDefault(),!1)}),Cp.prototype.onAppend.call(this)},play:function(){this.carrousel.play()},stop:function(){this.carrousel.stop()},slideTo:function(e){var t=e-this.currentIndex;this.carrousel.items.slide(t)}},Op={interval:function(e){this.interval=parseInt(e)||kp,this.carrousel&&(this.carrousel.playInterval=this.interval)},index:function(e){function t(e){if((e=parseInt(e))<0||isNaN(e))return console.error("[h5-render] invalid index ",e);n.slideTo(e),n._updateIndex&&window.removeEventListener("renderend",n._updateIndex)}var n=this;if(this.isDomRendering){var r=!!this._updateIndex;this._updateIndex=function(){n.autoPlay&&n.isPageShow&&n.play(),t(e)},!r&&window.addEventListener("renderend",this._updateIndex)}else t(e)},playstatus:function(e){this.playstatus=e&&"false"!==e,this.autoPlay=this.playstatus,this.carrousel&&(this.playstatus?this.play():this.stop())},autoPlay:function(e){this.attr.playstatus.call(this,e)}},Ip={change:{updator:function(){return{attrs:{index:this.currentIndex}}}}},jp={init:function(e){function t(e){this.autoPlay=!1,this.interval=kp,this.direction="row",this.children=[],this.isPageShow=!0,this.isDomRendering=!0,Dr(this),Wr(this),Cp.call(this,e)}Cp=e.Component,Ep=e.utils.extend,t.prototype=Object.create(Cp.prototype),Ep(t.prototype,Sp),Ep(t.prototype,{attr:Op}),Ep(t.prototype,{event:Ip}),e.registerComponent("slider",t)}};e(".weex-indicators {\n  position: absolute;\n  white-space: nowrap;\n}\n.weex-indicators .weex-indicator {\n  float: left;\n  border-radius: 50%;\n}\n",void 0);var Tp="#999",Lp="#0000ff",Pp={create:function(){var e=document.createElement("div");return e.classList.add("weex-indicators"),e.classList.add("weex-element"),e.style.position="absolute",this.node=e,this.style.itemSize.call(this,0),this.updateStyle({left:0,top:0,itemSize:0}),e},createChildren:function(){for(var e=this,t=document.createDocumentFragment(),n=0;n<this.amount;n++){var r=document.createElement("div");r.classList.add("weex-indicator"),r.style.boxSizing="border-box",r.style.margin="0 10px",r.style.width=e.itemSize+"px",r.style.height=e.itemSize+"px",r.setAttribute("index",n),e.index===n?(r.classList.add("active"),r.style.backgroundColor=e.itemSelectedColor):r.style.backgroundColor=e.itemColor,r.addEventListener("click",Vr.bind(null,e,n)),e.items[n]=r,t.appendChild(r)}this.node.appendChild(t)},setIndex:function(e){if(!(e>=this.amount)){var t=this.items[this.index],n=this.items[e];t.classList.remove("active"),t.style.backgroundColor=this.itemColor,n.classList.add("active"),n.style.backgroundColor=this.itemSelectedColor,this.index=e}}},Mp={itemColor:function(e){this.itemColor=e||Tp,zr(this)},itemSelectedColor:function(e){this.itemSelectedColor=e||Lp,zr(this)},itemSize:function(e){var t=this;e=parseInt(e)||20,this.itemSize=e,this.node.style.height=e+"px";for(var n=0,r=this.items.length;n<r;n++)t.items[n].style.width=e+"px",t.items[n].style.height=e+"px"},width:function(e){e=parseInt(e)||parseInt(this.sliderWidth),this.virtualWrapperWidth=e},height:function(e){e=parseInt(e)||parseInt(this.sliderHeight),this.virtualWrapperHeight=e},top:function(e){e=this.virtualWrapperHeight/2-this.itemSize/2+e,this.node.style.bottom="",this.node.style.top=e+"px"},bottom:function(e){e=this.virtualWrapperHeight/2-this.itemSize/2+e,this.node.style.top="",this.node.style.bottom=e+"px"},left:function(e){e=this.virtualWrapperWidth/2-(this.itemSize+20)*this.amount/2+e,this.node.style.right="",this.node.style.left=e+"px"},right:function(e){e=this.virtualWrapperWidth/2-(this.itemSize+20)*this.amount/2+e,this.node.style.left="",this.node.style.right=e+"px"}},Np={init:function(e){function t(e){this.direction="row",this.amount=e.extra.amount,this.index=e.extra.index,this.sliderWidth=e.extra.width,this.sliderHeight=e.extra.height;var t=e.style||{};this.data=e,this.style.width.call(this,t.width),this.style.height.call(this,t.height),this.itemColor=t.itemColor||Tp,this.itemSelectedColor=t.itemSelectedColor||Lp,this.items=[],n.call(this,e)}var n=e.Atomic,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),Pp),r(t.prototype,{style:r(Object.create(n.prototype.style),Mp)}),e.registerComponent("indicator",t)}};e('.tab-header {\n  position: relative;\n  width: 10rem;\n  font-size: 14px;\n  color: #333;\n}\n.tab-header .header-bar {\n  height: 1.17rem;\n  line-height: 1.17rem;\n  display: none;\n  color: #999;\n  padding-left: 0.4rem;\n}\n.tab-header .header-body {\n  margin-right: 1.07rem;\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n.tab-header .header-body::-webkit-scrollbar {\n  width: 0;\n  height: 0;\n  overflow: hidden;\n}\n.tab-header .fold-toggle {\n  position: absolute;\n  top: 0.59rem;\n  -webkit-transform: translateY(-50%);\n  right: 0.29rem;\n  width: 0.48rem;\n  height: 0.48rem;\n  line-height: 0.48rem;\n  text-align: center;\n  z-index: 99;\n  font-size: 14px;\n}\n.tab-header.unfold-header {\n  position: fixed !important;\n  top: 0;\n  left: 0;\n  overflow: hidden;\n}\n\n.tabheader {\n  list-style: none;\n  white-space: nowrap;\n  height: 1.17rem;\n  line-height: 1.17rem;\n}\n.tabheader .th-item {\n  padding-left: 0.72rem;\n  position: relative;\n  display: inline-block;\n}\n.tabheader .hl-icon {\n  width: 0.4rem;\n  height: 0.4rem;\n  line-height: 0.4rem;\n  text-align: center;\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  left: 0.24rem;\n  font-size: 14px;\n}\n\n.unfold-header .header-bar {\n  display: block;\n}\n.unfold-header .fold-toggle {\n  -webkit-transform: translateY(-50%) rotate(180deg);\n}\n.unfold-header .header-body {\n  margin-right: 0;\n  padding: 0.24rem;\n}\n.unfold-header .tabheader {\n  display: block;\n  height: auto;\n}\n.unfold-header .th-item {\n  box-sizing: border-box;\n  float: left;\n  width: 33.3333%;\n  height: 1.01rem;\n  line-height: 1.01rem;\n}\n.unfold-header .hl-icon {\n  margin-right: 0;\n  position: absolute;\n}\n.unfold-header.tabheader-mask {\n  display: block;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.6);\n}\n\n.tabheader-mask {\n  display: none;\n  position: fixed;\n  left: 0;\n  top: 0;\n}\n\n@font-face {\n  font-family: "iconfont";\n  src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAPAIAAAwBwRkZUTXBD98UAAAD8AAAAHE9TLzJXL1zIAAABGAAAAGBjbWFws6IHbgAAAXgAAAFaY3Z0IAyV/swAAApQAAAAJGZwZ20w956VAAAKdAAACZZnYXNwAAAAEAAACkgAAAAIZ2x5ZuxoPFIAAALUAAAEWGhlYWQHA5h3AAAHLAAAADZoaGVhBzIDcgAAB2QAAAAkaG10eAs2AW0AAAeIAAAAGGxvY2EDcAQeAAAHoAAAABBtYXhwASkKKwAAB7AAAAAgbmFtZQl/3hgAAAfQAAACLnBvc3Tm7f0bAAAKAAAAAEhwcmVwpbm+ZgAAFAwAAACVAAAAAQAAAADMPaLPAAAAANIDKnoAAAAA0gMqewAEA/oB9AAFAAACmQLMAAAAjwKZAswAAAHrADMBCQAAAgAGAwAAAAAAAAAAAAEQAAAAAAAAAAAAAABQZkVkAMAAeObeAyz/LABcAxgAlAAAAAEAAAAAAxgAAAAAACAAAQAAAAMAAAADAAAAHAABAAAAAABUAAMAAQAAABwABAA4AAAACgAIAAIAAgB45lDmYebe//8AAAB45lDmYebe////ixm0GaQZKAABAAAAAAAAAAAAAAAAAQYAAAEAAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACIAAAEyAqoAAwAHAClAJgAAAAMCAANXAAIBAQJLAAICAU8EAQECAUMAAAcGBQQAAwADEQUPKzMRIREnMxEjIgEQ7szMAqr9ViICZgAAAAUALP/hA7wDGAAWADAAOgBSAF4Bd0uwE1BYQEoCAQANDg0ADmYAAw4BDgNeAAEICAFcEAEJCAoGCV4RAQwGBAYMXgALBAtpDwEIAAYMCAZYAAoHBQIECwoEWRIBDg4NUQANDQoOQhtLsBdQWEBLAgEADQ4NAA5mAAMOAQ4DXgABCAgBXBABCQgKCAkKZhEBDAYEBgxeAAsEC2kPAQgABgwIBlgACgcFAgQLCgRZEgEODg1RAA0NCg5CG0uwGFBYQEwCAQANDg0ADmYAAw4BDgNeAAEICAFcEAEJCAoICQpmEQEMBgQGDARmAAsEC2kPAQgABgwIBlgACgcFAgQLCgRZEgEODg1RAA0NCg5CG0BOAgEADQ4NAA5mAAMOAQ4DAWYAAQgOAQhkEAEJCAoICQpmEQEMBgQGDARmAAsEC2kPAQgABgwIBlgACgcFAgQLCgRZEgEODg1RAA0NCg5CWVlZQChTUzs7MjEXF1NeU15bWDtSO1JLQzc1MToyOhcwFzBRETEYESgVQBMWKwEGKwEiDgIdASE1NCY1NC4CKwEVIQUVFBYUDgIjBiYrASchBysBIiciLgI9ARciBhQWMzI2NCYXBgcOAx4BOwYyNicuAScmJwE1ND4COwEyFh0BARkbGlMSJRwSA5ABChgnHoX+SgKiARUfIw4OHw4gLf5JLB0iFBkZIBMIdwwSEgwNEhKMCAYFCwQCBA8OJUNRUEAkFxYJBQkFBQb+pAUPGhW8HykCHwEMGScaTCkQHAQNIBsSYYg0Fzo6JRcJAQGAgAETGyAOpz8RGhERGhF8GhYTJA4QDQgYGg0jERMUAXfkCxgTDB0m4wAAAgCg/2wDYALsABIAGgAhQB4AAAADAgADWQACAQECTQACAgFRAAECAUUTFjkQBBIrACAGFRQeAxcWOwEyPwESNTQAIiY0NjIWFAKS/tzORFVvMRAJDgEOCW3b/uKEXl6EXgLszpI1lXyJNhEKC30BDIyS/s5ehF5ehAAAAAEAggBJA4QB6AAdABtAGBIRAgEAAUAFAQA+AAABAGgAAQFfEx8CECsBJgcGBwkBLgEGBwYUFwEwMxcVFjI3AT4DLgIDehEWAwP+uP60BhEQBgoKAWEBAQoaCQFeAwQCAQECBAHhEg0DAv61AUkHBAUGCRsJ/qIBAQkJAWICBwYHCAYGAAEAfwCLA4ECJwAhAB1AGhYPAgEAAUAFAQA+AAABAGgCAQEBXyQuEwMRKyUBMCcjNSYHBgcBDgEUFhceAjMyNwkBFjMyNjc+Ai4BA3f+nwEBEhUEAv6iBQUFBQMHCAQOCQFIAUwKDQYMBQMFAQEFwwFeAQERDQID/p8FDAwMBAMEAgkBS/62CQUFAwoJCgkAAAEAAAABAAALIynoXw889QALBAAAAAAA0gMqewAAAADSAyp7ACL/bAO8AxgAAAAIAAIAAAAAAAAAAQAAAxj/bABcBAAAAAAAA7wAAQAAAAAAAAAAAAAAAAAAAAUBdgAiAAAAAAFVAAAD6QAsBAAAoACCAH8AAAAoACgAKAFkAaIB5AIsAAEAAAAHAF8ABQAAAAAAAgAmADQAbAAAAIoJlgAAAAAAAAAMAJYAAQAAAAAAAQAIAAAAAQAAAAAAAgAGAAgAAQAAAAAAAwAkAA4AAQAAAAAABAAIADIAAQAAAAAABQBGADoAAQAAAAAABgAIAIAAAwABBAkAAQAQAIgAAwABBAkAAgAMAJgAAwABBAkAAwBIAKQAAwABBAkABAAQAOwAAwABBAkABQCMAPwAAwABBAkABgAQAYhpY29uZm9udE1lZGl1bUZvbnRGb3JnZSAyLjAgOiBpY29uZm9udCA6IDI2LTgtMjAxNWljb25mb250VmVyc2lvbiAxLjAgOyB0dGZhdXRvaGludCAodjAuOTQpIC1sIDggLXIgNTAgLUcgMjAwIC14IDE0IC13ICJHIiAtZiAtc2ljb25mb250AGkAYwBvAG4AZgBvAG4AdABNAGUAZABpAHUAbQBGAG8AbgB0AEYAbwByAGcAZQAgADIALgAwACAAOgAgAGkAYwBvAG4AZgBvAG4AdAAgADoAIAAyADYALQA4AC0AMgAwADEANQBpAGMAbwBuAGYAbwBuAHQAVgBlAHIAcwBpAG8AbgAgADEALgAwACAAOwAgAHQAdABmAGEAdQB0AG8AaABpAG4AdAAgACgAdgAwAC4AOQA0ACkAIAAtAGwAIAA4ACAALQByACAANQAwACAALQBHACAAMgAwADAAIAAtAHgAIAAxADQAIAAtAHcAIAAiAEcAIgAgAC0AZgAgAC0AcwBpAGMAbwBuAGYAbwBuAHQAAAACAAAAAAAA/4MAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAABAAIAWwECAQMBBAd1bmlFNjUwB3VuaUU2NjEHdW5pRTZERQABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAyADIDGP/hAxj/bAMY/+EDGP9ssAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywCCNCsAcjQrAAI0KwAEOwB0NRWLAIQyuyAAEAQ2BCsBZlHFktsAUssABDIEUgsAJFY7ABRWJgRC2wBiywAEMgRSCwACsjsQQEJWAgRYojYSBkILAgUFghsAAbsDBQWLAgG7BAWVkjsABQWGVZsAMlI2FERC2wByyxBQVFsAFhRC2wCCywAWAgILAKQ0qwAFBYILAKI0JZsAtDSrAAUlggsAsjQlktsAksILgEAGIguAQAY4ojYbAMQ2AgimAgsAwjQiMtsAosS1RYsQcBRFkksA1lI3gtsAssS1FYS1NYsQcBRFkbIVkksBNlI3gtsAwssQANQ1VYsQ0NQ7ABYUKwCStZsABDsAIlQrIAAQBDYEKxCgIlQrELAiVCsAEWIyCwAyVQWLAAQ7AEJUKKiiCKI2GwCCohI7ABYSCKI2GwCCohG7AAQ7ACJUKwAiVhsAgqIVmwCkNHsAtDR2CwgGIgsAJFY7ABRWJgsQAAEyNEsAFDsAA+sgEBAUNgQi2wDSyxAAVFVFgAsA0jQiBgsAFhtQ4OAQAMAEJCimCxDAQrsGsrGyJZLbAOLLEADSstsA8ssQENKy2wECyxAg0rLbARLLEDDSstsBIssQQNKy2wEyyxBQ0rLbAULLEGDSstsBUssQcNKy2wFiyxCA0rLbAXLLEJDSstsBgssAcrsQAFRVRYALANI0IgYLABYbUODgEADABCQopgsQwEK7BrKxsiWS2wGSyxABgrLbAaLLEBGCstsBsssQIYKy2wHCyxAxgrLbAdLLEEGCstsB4ssQUYKy2wHyyxBhgrLbAgLLEHGCstsCEssQgYKy2wIiyxCRgrLbAjLCBgsA5gIEMjsAFgQ7ACJbACJVFYIyA8sAFgI7ASZRwbISFZLbAkLLAjK7AjKi2wJSwgIEcgILACRWOwAUViYCNhOCMgilVYIEcgILACRWOwAUViYCNhOBshWS2wJiyxAAVFVFgAsAEWsCUqsAEVMBsiWS2wJyywByuxAAVFVFgAsAEWsCUqsAEVMBsiWS2wKCwgNbABYC2wKSwAsANFY7ABRWKwACuwAkVjsAFFYrAAK7AAFrQAAAAAAEQ+IzixKAEVKi2wKiwgPCBHILACRWOwAUViYLAAQ2E4LbArLC4XPC2wLCwgPCBHILACRWOwAUViYLAAQ2GwAUNjOC2wLSyxAgAWJSAuIEewACNCsAIlSYqKRyNHI2EgWGIbIVmwASNCsiwBARUUKi2wLiywABawBCWwBCVHI0cjYbAGRStlii4jICA8ijgtsC8ssAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgsAlDIIojRyNHI2EjRmCwBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhIyAgsAQmI0ZhOBsjsAlDRrACJbAJQ0cjRyNhYCCwBEOwgGJgIyCwACsjsARDYLAAK7AFJWGwBSWwgGKwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbAwLLAAFiAgILAFJiAuRyNHI2EjPDgtsDEssAAWILAJI0IgICBGI0ewACsjYTgtsDIssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDMssAAWILAJQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDQsIyAuRrACJUZSWCA8WS6xJAEUKy2wNSwjIC5GsAIlRlBYIDxZLrEkARQrLbA2LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEkARQrLbA3LLAuKyMgLkawAiVGUlggPFkusSQBFCstsDgssC8riiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSQBFCuwBEMusCQrLbA5LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEkARQrLbA6LLEJBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuwNCstsGEssDErsDUrLbBiLLAxK7A2Ky2wYyywMisusSQBFCstsGQssDIrsDQrLbBlLLAyK7A1Ky2wZiywMiuwNistsGcssDMrLrEkARQrLbBoLLAzK7A0Ky2waSywMyuwNSstsGossDMrsDYrLbBrLCuwCGWwAyRQeLABFTAtAABLuADIUlixAQGOWbkIAAgAYyCwASNEILADI3CwDkUgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbABRWMjYrACI0SzCgkFBCuzCgsFBCuzDg8FBCtZsgQoCUVSRLMKDQYEK7EGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAAAA==") format("truetype");\n}\n.iconfont {\n  font-family: iconfont !important;\n  font-size: 16px;\n  font-style: normal;\n  -webkit-font-smoothing: antialiased;\n  -webkit-text-stroke-width: 0.2px;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n[data-dpr="2"] .tab-header {\n  font-size: 28px;\n}\n\n[data-dpr="3"] .tab-header {\n  font-size: 42px;\n}\n\n[data-dpr="2"] .tabheader .hl-icon {\n  font-size: 28px;\n}\n\n[data-dpr="3"] .tabheader .hl-icon {\n  font-size: 42px;\n}\n\n[data-dpr="2"] .tab-header .fold-toggle {\n  font-size: 28px;\n}\n\n[data-dpr="3"] .tab-header .fold-toggle {\n  font-size: 42px;\n}\n',void 0);var Bp,Rp={create:function(){var e=document.createElement("div");e.className="tab-header";var t=document.createElement("div");t.className="header-bar",t.textContent="CHANGE FLOOR";var n=document.createElement("div");n.className="header-body";var r=document.createElement("ul");return r.className="tabheader",n.appendChild(r),e.appendChild(t),e.appendChild(n),this._bar=t,this._body=n,this.box=r,this.node=e,Hr(this),Jr(this),e}},Fp={highlightIcon:function(){return'<i class="hl-icon iconfont">&#xe650</i>'},data:function(){var e=this.data.attr;void 0===e.selectedIndex&&(e.selectedIndex=0);var t=e.data||[],n=e.selectedIndex,r=[],o='<li class="th-item" data-floor="{{floor}}">{{hlIcon}}{{floorName}}</li>';t.forEach(function(e,t){var i=o.replace("{{floor}}",t);i=(i=n==t?i.replace("{{hlIcon}}",'<i class="hl-icon iconfont">&#xe650</i>'):i.replace("{{hlIcon}}","")).replace("{{floorName}}",e),r.push(i)},this),this.box.innerHTML=r.join("")},selectedIndex:function(e){var t=this.data.attr;void 0===e&&(e=0),t.selectedIndex=e,this.attr.data.call(this),Yr(this),this.style.textHighlightColor.call(this,this.textHighlightColor)}},Dp={opacity:function(e){(void 0===e||e<0||e>1)&&(e=1),this.node.style.opacity=e},textColor:function(e){ro(e)&&(this.node.style.color=e)},textHighlightColor:function(e){if(ro(e)){this.textHighlightColor=e;var t=this.data.attr,n=this.node.querySelector('[data-floor="'+t.selectedIndex+'"]');n&&(n.style.color=e,Xr(this,n))}}},Wp={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),Rp),r(t.prototype,{attr:Fp}),r(t.prototype,{style:r(Object.create(n.prototype.style),Dp)}),e.registerComponent("tabheader",t)}},$p=["text","password","tel","email","url","date","time"],Qp={create:function(){var e=document.createElement("input"),t=Math.floor(1e13*Math.random())+Date.now();return this.className="weex-ipt-"+t,this.styleId="weex-style-"+t,e.classList.add(this.className),e.classList.add("weex-element"),this.placeholder&&(e.placeholder=this.placeholder),this.createKeybordEvent(e),e},createKeybordEvent:function(e){var t=this;Array.isArray(this.data.event)&&this.data.event.indexOf("return")>-1&&e.addEventListener("keyup",function(e){var n=e.keyCode,r=e.key;if(13===n){"tab"===r.toLowerCase()&&(r="next");var o=fn(t.data.attr.returnKeyType);t.dispatchEvent("return",{returnKeyType:o})}},!1)},focus:function(){this.node.focus()},blur:function(){this.node.blur()}},Up={disabled:function(e){this.node.disabled=!!e},placeholder:function(e){this.node.placeholder=e||""},value:function(e){this.node.value=e||""},autofocus:function(e){this.node.autofocus=!!e},type:function(e){this.node.type=-1!==$p.indexOf(e)?e:"text"},returnKeyType:function(e){this.node.returnKeyType=e||""}},zp={placeholderColor:function(e){oo(this,e)}},Vp={input:{updator:function(){return{attrs:{value:this.node.value}}},extra:function(){return{value:this.node.value,timestamp:Date.now()}}},change:{updator:function(){return{attrs:{value:this.node.value}}},extra:function(){return{value:this.node.value,timestamp:Date.now()}}},return:{updator:function(e){return{attrs:{value:this.node.value}}}}},Hp={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;Bp=e.utils.appendStyle,r(t.prototype=Object.create(n.prototype),Qp),r(t.prototype,{attr:Up}),r(t.prototype,{style:r(Object.create(n.prototype.style),zp)}),r(t.prototype,{event:Vp}),e.registerComponent("input",t)}},Gp={create:function(){var e=document.createElement("textarea");return e.classList.add("weex-element"),e.classList.add("weex-textarea"),this.createKeyboardEvent(e),e},createKeyboardEvent:function(e){var t=this;Array.isArray(this.data.event)&&this.data.event.indexOf("return")>-1&&e.addEventListener("keyup",function(e){var n=e.keyCode,r=e.key;if(13===n){"tab"===r.toLowerCase()&&(r="next");var o=fn(t.data.attr.returnKeyType);t.dispatchEvent("return",{returnKeyType:o})}},!1)}},qp={rows:function(e){this.node.rows=e||2},disabled:function(e){this.node.disabled=!!e},placeholder:function(e){this.node.placeholder=e||""},value:function(e){this.node.value=e||""},autofocus:function(e){this.node.autofocus=!!e},returnKeyType:function(e){this.node.returnKeyType=e||""}},Yp={input:{updator:function(){return{attrs:{value:this.node.value}}},extra:function(){return{value:this.node.value,timestamp:Date.now()}}},change:{updator:function(){return{attrs:{value:this.node.value}}},extra:function(){return{value:this.node.value,timestamp:Date.now()}}},return:{updator:function(e){return{attrs:{value:this.node.value}}}}},Jp={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),Gp),r(t.prototype,{attr:qp}),r(t.prototype,{event:Yp}),e.registerComponent("textarea",t)}};e(".weex-video {\n\tbackground-color: #000;\n}",void 0);var Kp={playStatus:function(e){"play"!==e&&"stop"!==e&&"pause"!==e&&(e="pause"),this.playStatus!==e&&(this.playStatus=e,this.node.setAttribute("play-status",e),this[this.playStatus]())},autoPlay:function(e){}},Zp={init:function(e){function t(e){var t=e.attr.autoPlay,r=e.attr.playStatus;this.autoPlay=!0===t||"true"===t,this.playStatus="play"!==r&&"stop"!==r&&"pause"!==r?"pause":r,n.call(this,e)}var n=e.Atomic,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),io(e)),r(t.prototype,{attr:Kp}),e.registerComponent("video",t)}};e("/* switch defaults. */\n.weex-switch {\n  background-color: #fff;\n  border: 1px solid #dfdfdf;\n  cursor: pointer;\n  display: inline-block;\n  position: relative;\n  vertical-align: middle;\n  -moz-user-select: none;\n  -khtml-user-select: none;\n  -webkit-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  box-sizing: content-box;\n  background-clip: content-box;\n}\n\n.weex-switch > small {\n  background: #fff;\n  border-radius: 100%;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n  position: absolute;\n  top: 0;\n}\n",void 0);var Xp,eh={color:"#64bd63",secondaryColor:"#dfdfdf",jackColor:"#fff",jackSecondaryColor:null,className:"weex-switch",disabledOpacity:.5,speed:"0.4s",width:100,height:60,scalable:!1},th={create:function(){var e=document.createElement("span");return this.jack=document.createElement("small"),e.appendChild(this.jack),e.className=this.options.className,this.node=e,this.attr.disabled.call(this,this.data.attr.disabled),e},onAppend:function(){so(this),lo(this)},enable:function(){this.disabled&&(this.disabled=!1),this.node.style.opacity=1,this.node.addEventListener("click",fo(this))},disable:function(){!this.disabled&&(this.disabled=!0),this.node.style.opacity=eh.disabledOpacity,this.node.removeEventListener("click",fo(this))}},nh={disabled:function(e){this.disabled=e&&"false"!==e,this.disabled?this.disable():this.enable()}},rh={width:function(e){this.options.scalable&&(e=parseFloat(e),(isNaN(e)||e<0)&&(e=this.options.width),this.width=e,this.setSize())},height:function(e){this.options.scalable&&(e=parseFloat(e),(isNaN(e)||e<0)&&(e=this.options.height),this.height=e,this.setSize())}},oh={change:{updator:function(){return{attrs:{checked:this.checked}}},extra:function(){return{value:this.checked}}}},ih={init:function(e){function t(e){this.options=r({},eh),this.checked=e.attr.checked&&"false"!==e.attr.checked,this.data=e,this.width=this.options.width,this.height=this.options.height,n.call(this,e)}var n=e.Atomic,r=e.utils.extend;t.prototype=Object.create(n.prototype),r(t.prototype,th),r(t.prototype,{attr:nh}),r(t.prototype,{style:r(Object.create(n.prototype.style),rh)}),r(t.prototype,{event:oh}),e.registerComponent("switch",t)}},ah={href:function(e){if(!e)return console.warn("[web-render] href of <a> should not be a null value.");this.href=e,this.node.setAttribute("data-href",e)}},sh={init:function(e){function t(e){n.call(this,e)}var n=e.Component,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),po(e)),r(t.prototype,{attr:ah}),e.registerComponent("a",t)}},lh="weex_embed_",ch={create:function(){var e=document.createElement("div");return e.id=this.id,e.style.overflow="scroll",e},initWeex:function(){this.id=ho(),this.node.id=this.id;var e={appId:this.id,source:this.source,bundleUrl:this.source,loader:this.loader,jsonpCallback:this.jsonpCallback,width:this.node.getBoundingClientRect().width,rootId:this.id,embed:!0};window.weex.init(e)},destroyWeex:function(){this.id&&window.destroyInstance(this.id),this.node.innerHTML=""},reloadWeex:function(){this.id&&(this.destroyWeex(),this.id=null,this.node.id=null,this.node.innerHTML=""),this.initWeex()}},uh={src:function(e){this.source=e,this.reloadWeex()}},dh={init:function(e){function t(e,t){var r=e.attr;r&&(this.source=r.src,this.loader=r.loader||"xhr",this.jsonpCallback=r.jsonpCallback),n.call(this,e,t)}var n=e.Component,r=e.utils.extend;Xp=e.utils.getRandom,r(t.prototype=Object.create(n.prototype),ch),r(t.prototype,{attr:uh}),e.registerComponent("embed",t)}};e(".weex-spinner-wrap {\n  width: 1.013333rem; /* 76px */\n  height: 1.013333rem;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  overflow: visible;\n}\n\n.weex-spinner {\n  font-size: 0.16rem; /* 12px */\n  width: 1em;\n  height: 1em;\n  border-radius: 50%;\n  position: relative;\n  text-indent: -9999em;\n  -webkit-animation: weex-spinner 1.1s infinite ease;\n  animation: weex-spinner 1.1s infinite ease;\n  -webkit-transform: translateZ(0);\n  -ms-transform: translateZ(0);\n  transform: translateZ(0);\n}\n@-webkit-keyframes weex-spinner {\n  0%,\n  100% {\n    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);\n  }\n  12.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);\n  }\n  25% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  37.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  50% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  62.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  75% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  87.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;\n  }\n}\n@keyframes weex-spinner {\n  0%,\n  100% {\n    box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);\n  }\n  12.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);\n  }\n  25% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  37.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  50% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  62.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  75% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n  }\n  87.5% {\n    box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;\n  }\n}\n",void 0);var fh,ph,hh,vh={create:function(){var e=document.createElement("div");return e.classList.add("weex-container"),e.classList.add("weex-spinner-wrap"),this.spinner=document.createElement("div"),this.spinner.classList.add("weex-element"),this.spinner.classList.add("weex-spinner"),e.appendChild(this.spinner),e}},mh={color:function(e){var t=ph(e);if(!t)return console.error("[web-render] invalid color value:",e);mo(this,t)}},yh={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;ph=e.utils.getRgb,fh=e.utils.loopArray,r(t.prototype=Object.create(n.prototype),vh),r(t.prototype,{style:r(Object.create(n.prototype.style),mh)}),e.registerComponent("spinner",t),e.registerComponent("loading-indicator",t)}},gh={src:function(e){this.web.src=e,setTimeout(function(){this.dispatchEvent("pagestart",{url:e})}.bind(this),0)}},bh={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;hh=e.utils.isArray,r(t.prototype=Object.create(n.prototype),bo(e)),r(t.prototype,{attr:gh}),e.registerComponent("web",t)}};e(".weex-neighbor-item {\n  position: absolute !important;\n  top: 50% !important;\n  left: 50% !important;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n}\n",void 0);var Ah,wh,_h=3e3,xh=20,Eh=.6,Ch=.8,kh=400,Sh=.9,Oh={create:function(){var e=document.createElement("div");return this.node=e,e.classList.add("slider-neighbor"),e.classList.add("weex-container"),this.style.flexDirection.call(this,"row"),e.style.position="relative",e.style.overflow="hidden",e},createChildren:function(){var e=this,t=this.getComponentManager(),n=this.data.children,r=document.createDocumentFragment();if(n&&n.length){for(var o=0;o<n.length;o++){var i=void 0,a=n[o];if(a.instanceId=e.data.instanceId,"indicator"!==a.type){(i=t.createElement(a)).node.classList.add("weex-neighbor-item");var s=(a.style||{}).width||e.data.style.width,l=(a.style||{}).height||e.data.style.height;i.node.style.marginTop=-l/2+"px",i.node.style.marginLeft=-s/2+"px",e.slides.push(i),r.appendChild(i.node),i.parentRef=e.data.ref}else xo(e,r,Ah(a,{extra:{amount:n.length-1,index:0}}))}Bo(this,[]),this.node.appendChild(r),jo(this)}},appendChild:function(e){var t,n=this.data.children,r=this.getComponentManager();if("indicator"===e.type)xo(this,this.node,Ah(e,{extra:{amount:n.length,index:this.currentIndex}}));else{(t=r.createElement(e)).node.classList.add("weex-neighbor-item");var o=(e.style||{}).width||this.data.style.width,i=(e.style||{}).height||this.data.style.height;t.node.style.marginTop=-i/2+"px",t.node.style.marginLeft=-o/2+"px",this.slides.push(t),Bo(this,[]),this.node.appendChild(t.node)}return jo(this),n&&n.length?n.push(e):this.data.children=[e],t||this.indicator},insertBefore:function(e,t){var n=this.data.children,r=0,o=0,i=!1;if(n&&n.length&&t){var a;for(a=n.length;r<a&&n[r].ref!==t.data.ref;r++)"indicator"!==n[r].type&&o++;r===a&&(i=!0)}else i=!0;e.node.classList.add("weex-neighbor-item");var s=e.data,l=(s.style||{}).width||this.data.style.width,c=(s.style||{}).height||this.data.style.height;e.node.style.marginTop=-c/2+"px",e.node.style.marginLeft=-l/2+"px",i?(this.node.appendChild(e.node),this.slides.push(e),Bo(this,[]),n.push(e.data)):(this.node.insertBefore(e.node,t.node),this.slides.splice(o,0,e),n.splice(r,0,e.data)),jo(this)},removeChild:function(e){var t=this.data.children,n=0,r=0;if(t&&t.length){var o;for(o=t.length;n<o&&t[n].ref!==e.data.ref;n++)"indicator"!==t[n].type&&r++;n<o&&(t.splice(n,1),this.slides.splice(r,1),Bo(this,[]))}this.getComponentManager().removeComponent(e.data.ref),e.node.parentNode.removeChild(e.node),jo(this)},onAppend:function(){this.slideTo(0),Po(this),wh.prototype.onAppend.call(this)},play:function(){this.playTimer&&clearTimeout(this.playTimer),this.playstatus&&(this.playTimer=setTimeout(Lo.bind(null,this),this.interval))},stop:function(){this.playTimer&&clearTimeout(this.playTimer)},slideTo:function(e,t){var n=this,r=this.slides.length;if(0!==r){t&&(this.stop(),setTimeout(function(){return n.play()},100));var o=e,i=To((e=To(o,r))-1,r),a=To(e+1,r);this.mainSlide=this.slides[e],this.leftSlide=this.slides[To(e-1,r)],this.rightSlide=this.slides[To(e+1,r)];var s="translate(0px, 0px) scale("+Sh+")";setTimeout(function(){return ko(n.mainSlide.node,{webkitTransform:s,transform:s,opacity:1,zIndex:99})},100);var l=this.width-this.width*(1-this.neighborScale)/2-this.neighborSpace;this.leftTranslate=-l,this.rightTranslate=l,o>this.currentIndex?No(this,"right"):o<this.currentIndex&&No(this,"left");var c="translate("+-l+"px, 0px) scale("+this.neighborScale+")";setTimeout(function(){return ko(n.leftSlide.node,{webkitTransform:c,transform:c,opacity:n.neighborAlpha,zIndex:1})},100);var u="translate("+l+"px, 0px) scale("+this.neighborScale+")";setTimeout(function(){return ko(n.rightSlide.node,{webkitTransform:u,transform:u,opacity:n.neighborAlpha,zIndex:1})},100),Bo(this,[e,i,a]),this.currentIndex=e,Eo(this),this.dispatchEvent("change",{index:this.currentIndex})}},slideToPrev:function(){this.slideTo(this.currentIndex-1)},slideToNext:function(){this.slideTo(this.currentIndex+1)}},Ih={interval:function(e){this.interval=parseInt(e)||_h},index:function(e){function t(e){if((e=parseInt(e))<0||isNaN(e))return console.error("[h5-render] invalid index ",e);n.stop(),n.slideTo(e),n.autoPlay&&n.isPageShow&&n.play(),n._updateIndex&&window.removeEventListener("renderend",n._updateIndex)}var n=this;if(this.isDomRendering){var r=!!this._updateIndex;this._updateIndex=function(){t(e)},!r&&window.addEventListener("renderend",this._updateIndex)}else t(e)},playstatus:function(e){function t(){n.isPageShow&&n.play(),n._updatePlaystatus&&window.removeEventListener("renderend",n._updatePlaystatus)}var n=this;if(this.playstatus=e&&"false"!==e,this.autoPlay=this.playstatus,this.playstatus)if(this.isDomRendering){var r=!!this._updatePlaystatus;this._updatePlaystatus=function(){t()},!r&&window.addEventListener("renderend",this._updatePlaystatus)}else t();else this.stop()},autoPlay:function(e){this.attr.playstatus.call(this,e)},neighborSpace:function(e){var t=parseFloat(e);!isNaN(t)&&t>=0?this.neighborSpace=t:console.warn("[h5-render] invalid value for 'neighbor-space' of slider-neighbor: "+e+".")},neighborAlpha:function(e){var t=parseFloat(e);!isNaN(t)&&t>=0&&t<=1?this.neighborAlpha=t:console.warn("[h5-render] invalid value for 'neighbor-alpha' of slider-neighbor: "+e+".")},neighborScale:function(e){var t=parseFloat(e);!isNaN(t)&&t>=0&&t<=1?this.neighborScale=t:console.warn("[h5-render] invalid value for 'neighbor-scale' of slider-neighbor: "+e+".")}},jh={change:{updator:function(){return{attrs:{index:this.currentIndex}}}}},Th={init:function(e){function t(e){this.autoPlay=!1,this.interval=_h,this.direction="row",this.slides=[],this.isPageShow=!0,this.isDomRendering=!0,this.currentIndex=0,this.neighborSpace=xh,this.neighborAlpha=Eh,this.neighborScale=Ch,Ao(this),wo(this),wh.call(this,e)}wh=e.Component,Ah=e.utils.extend,t.prototype=Object.create(wh.prototype),Ah(t.prototype,Oh),Ah(t.prototype,{attr:Ih}),Ah(t.prototype,{event:jh}),e.registerComponent("slider-neighbor",t)}},Lh={a:"inline",image:"inline-block",span:"inline-block"},Ph={a:"a",image:"image",span:"text"},Mh=0,Nh=function(){return"rtn-"+Mh++},Bh={create:function(){var e=document.createElement("div");return e.classList.add("weex-element"),e.classList.add("weex-richtext"),e},parse:function(){var e=this;Array.prototype.slice.call(this.node.children).forEach(function(t){return e.node.removeChild(t)}),this.value&&Do(this,this.node,this.value)}},Rh={value:function(e){this.value=e,this.parse()}},Fh={init:function(e){function t(e){n.call(this,e)}var n=e.Atomic,r=e.utils.extend;r(t.prototype=Object.create(n.prototype),Bh),r(t.prototype,{attr:Rh}),e.registerComponent("richtext",t)}},Dh={},Wh={transition:function(e,t,n){var r=Dh[e],o=JSON.stringify(t.styles),i=this;if(!r||!r[o])return r||(r=Dh[e]={}),r[o]=!0,Wo(this.getComponentManager().getComponent(e),t,function(){delete r[o],i.sender.performCallback(n)})}},$h={animation:[{name:"transition",args:["string","object","function"]}]},Qh={init:function(e){e.registerApiModule("animation",Wh,$h)}},Uh="__weex_clipboard_id__",zh={getString:function(e){console.log("clipboard.getString() is not supported now.")},setString:function(e){if("string"==typeof e&&""!==e&&document.execCommand){var t=$o();t.value=e,t.select(),document.execCommand("copy"),t.value="",t.blur()}else console.log("only support string input now")}},Vh={clipboard:[{name:"getString",args:["function"]},{name:"setString",args:["string"]}]},Hh={init:function(e){e.registerApiModule("clipboard",zh,Vh)}},Gh=Qo;Qo.prototype.on=Qo.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks["$"+e]=this._callbacks["$"+e]||[]).push(t),this},Qo.prototype.once=function(e,t){function n(){this.off(e,n),t.apply(this,arguments)}return n.fn=t,this.on(e,n),this},Qo.prototype.off=Qo.prototype.removeListener=Qo.prototype.removeAllListeners=Qo.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n=this._callbacks["$"+e];if(!n)return this;if(1==arguments.length)return delete this._callbacks["$"+e],this;for(var r,o=0;o<n.length;o++)if((r=n[o])===t||r.fn===t){n.splice(o,1);break}return this},Qo.prototype.emit=function(e){var t=this;this._callbacks=this._callbacks||{};var n=[].slice.call(arguments,1),r=this._callbacks["$"+e];if(r)for(var o=0,i=(r=r.slice(0)).length;o<i;++o)r[o].apply(t,n);return this},Qo.prototype.listeners=function(e){return this._callbacks=this._callbacks||{},this._callbacks["$"+e]||[]},Qo.prototype.hasListeners=function(e){return!!this.listeners(e).length};var qh,Yh=Object.prototype.toString,Jh=function(e){switch(Yh.call(e)){case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object Error]":return"error"}return null===e?"null":void 0===e?"undefined":e!==e?"nan":e&&1===e.nodeType?"element":typeof(e=e.valueOf?e.valueOf():Object.prototype.valueOf.apply(e))};try{qh=Jh}catch(e){qh=Jh}var Kh=zo,Zh=n(function(e,t){t.linear=function(e){return e},t.inQuad=function(e){return e*e},t.outQuad=function(e){return e*(2-e)},t.inOutQuad=function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},t.inCube=function(e){return e*e*e},t.outCube=function(e){return--e*e*e+1},t.inOutCube=function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},t.inQuart=function(e){return e*e*e*e},t.outQuart=function(e){return 1- --e*e*e*e},t.inOutQuart=function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},t.inQuint=function(e){return e*e*e*e*e},t.outQuint=function(e){return--e*e*e*e*e+1},t.inOutQuint=function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},t.inSine=function(e){return 1-Math.cos(e*Math.PI/2)},t.outSine=function(e){return Math.sin(e*Math.PI/2)},t.inOutSine=function(e){return.5*(1-Math.cos(Math.PI*e))},t.inExpo=function(e){return 0==e?0:Math.pow(1024,e-1)},t.outExpo=function(e){return 1==e?e:1-Math.pow(2,-10*e)},t.inOutExpo=function(e){return 0==e?0:1==e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(2-Math.pow(2,-10*(e-1)))},t.inCirc=function(e){return 1-Math.sqrt(1-e*e)},t.outCirc=function(e){return Math.sqrt(1- --e*e)},t.inOutCirc=function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},t.inBack=function(e){var t=1.70158;return e*e*((t+1)*e-t)},t.outBack=function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},t.inOutBack=function(e){var t=2.5949095;return(e*=2)<1?e*e*((t+1)*e-t)*.5:.5*((e-=2)*e*((t+1)*e+t)+2)},t.inBounce=function(e){return 1-t.outBounce(1-e)},t.outBounce=function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},t.inOutBounce=function(e){return e<.5?.5*t.inBounce(2*e):.5*t.outBounce(2*e-1)+.5},t["in-quad"]=t.inQuad,t["out-quad"]=t.outQuad,t["in-out-quad"]=t.inOutQuad,t["in-cube"]=t.inCube,t["out-cube"]=t.outCube,t["in-out-cube"]=t.inOutCube,t["in-quart"]=t.inQuart,t["out-quart"]=t.outQuart,t["in-out-quart"]=t.inOutQuart,t["in-quint"]=t.inQuint,t["out-quint"]=t.outQuint,t["in-out-quint"]=t.inOutQuint,t["in-sine"]=t.inSine,t["out-sine"]=t.outSine,t["in-out-sine"]=t.inOutSine,t["in-expo"]=t.inExpo,t["out-expo"]=t.outExpo,t["in-out-expo"]=t.inOutExpo,t["in-circ"]=t.inCirc,t["out-circ"]=t.outCirc,t["in-out-circ"]=t.inOutCirc,t["in-back"]=t.inBack,t["out-back"]=t.outBack,t["in-out-back"]=t.inOutBack,t["in-bounce"]=t.inBounce,t["out-bounce"]=t.outBounce,t["in-out-bounce"]=t.inOutBounce}),Xh=Kh,ev=Jh,tv=Zh,nv=Vo;Gh(Vo.prototype),Vo.prototype.reset=function(){return this.isArray="array"===ev(this._from),this._curr=Xh(this._from),this._done=!1,this._start=Date.now(),this},Vo.prototype.to=function(e){return this.reset(),this._to=e,this},Vo.prototype.duration=function(e){return this._duration=e,this},Vo.prototype.ease=function(e){if(!(e="function"==typeof e?e:tv[e]))throw new TypeError("invalid easing function");return this._ease=e,this},Vo.prototype.stop=function(){return this.stopped=!0,this._done=!0,this.emit("stop"),this.emit("end"),this},Vo.prototype.step=function(){if(!this._done){var e=this._duration,t=Date.now();if(t-this._start>=e)return this._from=this._to,this._update(this._to),this._done=!0,this.emit("end"),this;var n=this._from,r=this._to,o=this._curr,i=(0,this._ease)((t-this._start)/e);if(this.isArray){for(var a=0;a<n.length;++a)o[a]=n[a]+(r[a]-n[a])*i;return this._update(o),this}for(var s in n)o[s]=n[s]+(r[s]-n[s])*i;return this._update(o),this}},Vo.prototype.update=function(e){return 0==arguments.length?this.step():(this._update=e,this)};var rv,ov,iv=nv,av=n(function(e,t){t=e.exports=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){var t=(new Date).getTime(),r=Math.max(0,16-(t-n)),o=setTimeout(e,r);return n=t,o};var n=(new Date).getTime(),r=window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.clearTimeout;t.cancel=function(e){r.call(window,e)}}),sv=function(e,t,n){function r(){av(r),i.update()}n=n||{};var o=Ho(),i=iv(o).ease(n.ease||"out-circ").to({top:t,left:e}).duration(n.duration||1e3);return i.update(function(e){window.scrollTo(0|e.left,0|e.top)}),i.on("end",function(){r=function(){}}),r(),i},lv={createBody:function(e){var t=this.getComponentManager();return e.instanceId=t.instanceId,t.createBody(e)},addElement:function(e,t,n){var r=this.getComponentManager();return t.instanceId=r.instanceId,r.addElement(e,t,n)},removeElement:function(e){return this.getComponentManager().removeElement(e)},moveElement:function(e,t,n){return this.getComponentManager().moveElement(e,t,n)},addEvent:function(e,t){return this.getComponentManager().addEvent(e,t)},removeEvent:function(e,t){return this.getComponentManager().removeEvent(e,t)},updateAttrs:function(e,t){return this.getComponentManager().updateAttrs(e,t)},updateStyle:function(e,t){return this.getComponentManager().updateStyle(e,t)},scrollToElement:function(e,t){!t&&(t={});var n=Number(t.offset)||0,r=this.getComponentManager().getComponent(e);if(!r)return console.error("[h5-render] component of ref "+e+" doesn't exist.");var o=r.getParentScroller();if(o)o.scroller.scrollToElement(r.node,!0,n);else{var i=r.node.getBoundingClientRect().top+document.body.scrollTop;sv(0,i+n,t).on("end",function(){console.log("scroll end.")})}},getComponentRect:function(e,t){var n={result:!1};if(e&&"viewport"===e)n.result=!0,n.size={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,top:0,left:0,right:document.documentElement.clientWidth,bottom:document.documentElement.clientHeight};else{var r=this.getComponentManager().getComponent(e);r&&r.node&&(n.result=!0,n.size=r.node.getBoundingClientRect())}var o=n.result?n:{result:!1,errMsg:"Illegal parameter"};return this.sender.performCallback(t,o),o},addRule:function(e,t){e=rv(e);var n="";for(var r in t)t.hasOwnProperty(r)&&(n+=rv(r)+":"+t[r]+";");ov("@"+e+"{"+n+"}","dom-added-rules")},createFinish:function(e){return this.getComponentManager().createFinish()},updateFinish:function(e){return this.getComponentManager().updateFinish()},refreshFinish:function(e){return this.getComponentManager().refreshFinish()}},cv={dom:[{name:"createBody",args:["object"]},{name:"addElement",args:["string","object","number"]},{name:"removeElement",args:["string"]},{name:"moveElement",args:["string","string","number"]},{name:"addEvent",args:["string","string"]},{name:"removeEvent",args:["string","string"]},{name:"updateAttrs",args:["string","object"]},{name:"updateStyle",args:["string","object"]},{name:"createFinish",args:[]},{name:"updateFinish",args:[]},{name:"refreshFinish",args:[]},{name:"scrollToElement",args:["string","object"]},{name:"getComponentRect",args:["string","function"]},{name:"addRule",args:["string","object"]}]},uv={init:function(e){rv=e.utils.camelToKebab,ov=e.utils.appendStyle,e.registerApiModule("dom",lv,cv)}},dv={openURL:function(e){location.href=e}},fv={event:[{name:"openURL",args:["string"]}]},pv={init:function(e){e.registerApiModule("event",dv,fv)}},hv="geolocation"in navigator,vv="[h5-render]: browser doesn't support geolocation.",mv={getCurrentPosition:function(e,t,n){var r=this,o=function(e){return r.sender.performCallback(t,e)};hv?navigator.geolocation.getCurrentPosition(function(t){return r.sender.performCallback(e,t)},o,n):(console.warn(vv),o(new Error(vv)))},watchPosition:function(e,t,n){var r=this,o=function(t){return r.sender.performCallback(e,t,!0)},i=function(e){return r.sender.performCallback(t,e)};if(hv)var a=navigator.geolocation.watchPosition(function(e){e.watchId=a,o(e)},i,n);else console.warn(vv),i(new Error(vv))},clearWatch:function(e){hv?navigator.geolocation.clearWatch(e):console.warn(vv)}},yv={geolocation:[{name:"getCurrentPosition",args:["function","function","object"]},{name:"watchPosition",args:["function","function","object"]},{name:"clearWatch",args:["string"]}]},gv={init:function(e){e.registerApiModule("geolocation",mv,yv)}},bv={},Av={addEventListener:function(e,t){var n=this,r=function(e){return n.sender.performCallback(t,e,!0)};bv[e]?bv[e].push(r):bv[e]=[r],document.addEventListener(e,r)},removeEventListener:function(e){bv[e].forEach(function(t){return document.removeEventListener(e,t)})}},wv={globalEvent:[{name:"addEventListener",args:["string","function"]},{name:"removeEventListener",args:["string"]}]},_v={init:function(e){e.registerApiModule("globalEvent",Av,wv)}},xv={setViewport:function(e){document.querySelector("meta[name=viewport]").setAttribute("content","width="+e.width+", user-scalable=no")}},Ev={meta:[{name:"setViewport",args:["object"]}]},Cv={init:function(e){e.registerApiModule("meta",xv,Ev)}};e(".amfe-modal-wrap {\n  display: none;\n  position: fixed;\n  z-index: 999999999;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: #000;\n  opacity: 0.5;\n}\n\n.amfe-modal-node {\n  position: fixed;\n  z-index: 9999999999;\n  top: 50%;\n  left: 50%;\n  width: 6.666667rem;\n  min-height: 2.666667rem;\n  border-radius: 0.066667rem;\n  -webkit-transform: translate(-50%, -50%);\n  transform: translate(-50%, -50%);\n  background-color: #fff;\n}\n.amfe-modal-node.hide {\n  display: none;\n}\n.amfe-modal-node .content {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-flex-direction: column;\n  flex-direction: column;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n  align-items: center;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n  justify-content: center;\n  width: 100%;\n  min-height: 1.866667rem;\n  box-sizing: border-box;\n  font-size: 0.32rem;\n  line-height: 0.426667rem;\n  padding: 0.213333rem;\n  border-bottom: 1px solid #ddd;\n}\n.amfe-modal-node .btn-group {\n  width: 100%;\n  height: 0.8rem;\n  font-size: 0.373333rem;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n  border: none;\n}\n.amfe-modal-node .btn-group .btn {\n  box-sizing: border-box;\n  height: 0.8rem;\n  line-height: 0.8rem;\n  margin: 0;\n  padding: 0;\n  border: none;\n  background: none;\n}\n",void 0);var kv="amfe-modal-wrap",Sv="amfe-modal-node";Go.prototype={show:function(){this.wrap.style.display="block",this.node.classList.remove("hide")},destroy:function(){document.body.removeChild(this.wrap),document.body.removeChild(this.node),this.wrap=null,this.node=null},createWrap:function(){this.wrap=document.createElement("div"),this.wrap.className=kv,document.body.appendChild(this.wrap)},createNode:function(){this.node=document.createElement("div"),this.node.classList.add(Sv,"hide"),document.body.appendChild(this.node)},clearNode:function(){this.node.innerHTML=""},createNodeContent:function(){},bindEvents:function(){this.wrap.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation()})}};var Ov=Go;e(".amfe-alert .amfe-alert-ok {\n  width: 100%;\n}\n",void 0);var Iv=Ov;(qo.prototype=Object.create(Iv.prototype)).createNodeContent=function(){var e=document.createElement("div");e.classList.add("content"),this.node.appendChild(e);var t=document.createElement("div");t.classList.add("content-msg"),t.appendChild(document.createTextNode(this.msg)),e.appendChild(t);var n=document.createElement("div");n.classList.add("btn-group"),this.node.appendChild(n);var r=document.createElement("div");r.classList.add("btn","alert-ok"),r.appendChild(document.createTextNode(this.okTitle)),n.appendChild(r)},qo.prototype.bindEvents=function(){Iv.prototype.bindEvents.call(this),this.node.querySelector(".btn").addEventListener("click",function(){this.destroy(),this.callback&&this.callback()}.bind(this))};var jv=qo;e(".amfe-confirm .btn-group .btn {\n  float: left;\n  width: 50%;\n}\n.amfe-confirm .btn-group .btn.btn-ok {\n  border-right: 1px solid #ddd;\n}\n",void 0);var Tv=Ov;(Yo.prototype=Object.create(Tv.prototype)).createNodeContent=function(){var e=document.createElement("div");e.classList.add("content"),this.node.appendChild(e);var t=document.createElement("div");t.classList.add("content-msg"),t.appendChild(document.createTextNode(this.msg)),e.appendChild(t);var n=document.createElement("div");n.classList.add("btn-group"),this.node.appendChild(n);var r=document.createElement("div");r.appendChild(document.createTextNode(this.okTitle)),r.classList.add("btn-ok","btn");var o=document.createElement("div");o.appendChild(document.createTextNode(this.cancelTitle)),o.classList.add("btn-cancel","btn"),n.appendChild(r),n.appendChild(o),this.node.appendChild(n)},Yo.prototype.bindEvents=function(){Tv.prototype.bindEvents.call(this);var e=this.node.querySelector(".btn.btn-ok"),t=this.node.querySelector(".btn.btn-cancel");e.addEventListener("click",function(){this.destroy(),this.callback&&this.callback(this.okTitle)}.bind(this)),t.addEventListener("click",function(){this.destroy(),this.callback&&this.callback(this.cancelTitle)}.bind(this))};var Lv=Yo;e(".amfe-prompt .input-wrap {\n  box-sizing: border-box;\n  width: 100%;\n  margin-top: 0.133333rem;\n  // padding: 0.24rem 0.213333rem 0.213333rem;\n  height: 0.96rem;\n}\n.amfe-prompt .input-wrap .input {\n  box-sizing: border-box;\n  width: 100%;\n  height: 0.56rem;\n  line-height: 0.56rem;\n  font-size: 0.32rem;\n  border: 1px solid #999;\n}\n.amfe-prompt .btn-group .btn {\n  float: left;\n  width: 50%;\n}\n.amfe-prompt .btn-group .btn.btn-ok {\n  border-right: 1px solid #ddd;\n}\n",void 0);var Pv=Ov;(Jo.prototype=Object.create(Pv.prototype)).createNodeContent=function(){var e=document.createElement("div");e.classList.add("content"),this.node.appendChild(e);var t=document.createElement("div");t.classList.add("content-msg"),t.appendChild(document.createTextNode(this.msg)),e.appendChild(t);var n=document.createElement("div");n.classList.add("input-wrap"),e.appendChild(n);var r=document.createElement("input");r.classList.add("input"),r.type="text",r.autofocus=!0,r.placeholder=this.defaultMsg,n.appendChild(r);var o=document.createElement("div");o.classList.add("btn-group");var i=document.createElement("div");i.appendChild(document.createTextNode(this.okTitle)),i.classList.add("btn-ok","btn");var a=document.createElement("div");a.appendChild(document.createTextNode(this.cancelTitle)),a.classList.add("btn-cancel","btn"),o.appendChild(i),o.appendChild(a),this.node.appendChild(o)},Jo.prototype.bindEvents=function(){Pv.prototype.bindEvents.call(this);var e=this.node.querySelector(".btn.btn-ok"),t=this.node.querySelector(".btn.btn-cancel"),n=this;e.addEventListener("click",function(){var e=document.querySelector("input").value;this.destroy(),this.callback&&this.callback({result:n.okTitle,data:e})}.bind(this)),t.addEventListener("click",function(){var e=document.querySelector("input").value;this.destroy(),this.callback&&this.callback({result:n.cancelTitle,data:e})}.bind(this))};var Mv=Jo;e(".amfe-toast {\n  font-size: 0.32rem;\n  line-height: 0.426667rem;\n  position: fixed;\n  box-sizing: border-box;\n  max-width: 80%;\n  bottom: 2.666667rem;\n  left: 50%;\n  padding: 0.213333rem;\n  background-color: #000;\n  color: #fff;\n  text-align: center;\n  opacity: 0.6;\n  transition: all 0.4s ease-in-out;\n  border-radius: 0.066667rem;\n  -webkit-transform: translateX(-50%);\n  transform: translateX(-50%);\n}\n\n.amfe-toast.hide {\n  opacity: 0;\n}\n",void 0);var Nv,Bv,Rv=[],Fv=!1,Dv="amfe-toast",Wv={push:function(e,t){Rv.push({msg:e,duration:t||.8}),this.show()},show:function(){var e=this;if(!Rv.length)return Bv&&Bv.parentNode.removeChild(Bv),void(Bv=null);if(!Fv){Fv=!0;var t=Rv.shift();Ko(t.msg,function(){Nv=setTimeout(function(){Nv=null,Zo(function(){Fv=!1,e.show()})},1e3*t.duration)})}}},$v=jv,Qv=Lv,Uv=Mv,zv={push:Wv.push.bind(Wv)},Vv={toast:function(e,t){zv.push(e,t)},alert:function(e){new $v(e).show()},prompt:function(e){new Uv(e).show()},confirm:function(e){new Qv(e).show()}};!window.lib&&(window.lib={}),window.lib.modal=Vv;var Hv,Gv,qv=Vv,Yv={toast:function(e){qv.toast(e.message,e.duration)},alert:function(e,t){var n=this.sender;e.callback=function(){n.performCallback(t)},qv.alert(e)},confirm:function(e,t){var n=this.sender;e.callback=function(e){n.performCallback(t,e)},qv.confirm(e)},prompt:function(e,t){var n=this.sender;e.callback=function(e){n.performCallback(t,e)},qv.prompt(e)}},Jv={modal:[{name:"toast",args:["object"]},{name:"alert",args:["object","function"]},{name:"confirm",args:["object","function"]},{name:"prompt",args:["object","function"]}]},Kv={init:function(e){e.registerApiModule("modal",Yv,Jv)}},Zv={push:function(e,t){window.location.href=e.url,this.sender.performCallback(t)},pop:function(e,t){window.history.back(),this.sender.performCallback(t)}},Xv={navigator:[{name:"push",args:["object","function"]},{name:"pop",args:["object","function"]}]},em={init:function(e){e.registerApiModule("navigator",Zv,Xv)}},tm={setTitle:function(e){e=e||"Weex HTML5";try{e=decodeURIComponent(e)}catch(e){}document.title=e}},nm={pageInfo:[{name:"setTitle",args:["string"]}]},rm={init:function(e){e.registerApiModule("pageInfo",tm,nm)}},om="undefined"!=typeof localStorage,im={setItem:function(e,t,n){if(om){var r=this.sender;if(e&&t)try{localStorage.setItem(e,t),r.performCallback(n,{result:"success",data:"undefined"})}catch(e){r.performCallback(n,{result:"failed",data:"undefined"})}else r.performCallback(n,{result:"failed",data:"invalid_param"})}else console.error("your browser is not support localStorage yet.")},getItem:function(e,t){if(om){var n=this.sender;if(e){var r=localStorage.getItem(e);n.performCallback(t,{result:r?"success":"failed",data:r||"undefined"})}else n.performCallback(t,{result:"failed",data:"invalid_param"})}else console.error("your browser is not support localStorage yet.")},removeItem:function(e,t){if(om){var n=this.sender;e?(localStorage.removeItem(e),n.performCallback(t,{result:"success",data:"undefined"})):n.performCallback(t,{result:"failed",data:"invalid_param"})}else console.error("your browser is not support localStorage yet.")},length:function(e){if(om){var t=this.sender,n=localStorage.length;t.performCallback(e,{result:"success",data:n})}else console.error("your browser is not support localStorage yet.")},getAllKeys:function(e){if(om){for(var t=this.sender,n=[],r=0;r<localStorage.length;r++)n.push(localStorage.key(r));t.performCallback(e,{result:"success",data:n})}else console.error("your browser is not support localStorage yet.")}},am={storage:[{name:"setItem",args:["string","string","function"]},{name:"getItem",args:["string","function"]},{name:"removeItem",args:["string","function"]},{name:"length",args:["function"]},{name:"getAllKeys",args:["function"]}]},sm={init:function(e){e.registerApiModule("storage",im,am)}},lm=Object.getOwnPropertySymbols,cm=Object.prototype.hasOwnProperty,um=Object.prototype.propertyIsEnumerable,dm=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})},fm=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,r,o=arguments,i=Xo(e),a=1;a<arguments.length;a++){n=Object(o[a]);for(var s in n)cm.call(n,s)&&(i[s]=n[s]);if(lm){r=lm(n);for(var l=0;l<r.length;l++)um.call(n,r[l])&&(i[r[l]]=n[r[l]])}}return i},pm={extract:function(e){return e.split("?")[1]||""},parse:function(e,t){var n=ti(t=fm({arrayFormat:"none"},t)),r=Object.create(null);return"string"!=typeof e?r:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach(function(e){var t=e.replace(/\+/g," ").split("="),o=t.shift(),i=t.length>0?t.join("="):void 0;i=void 0===i?null:decodeURIComponent(i),n(decodeURIComponent(o),i,r)}),Object.keys(r).sort().reduce(function(e,t){var n=r[t];return Boolean(n)&&"object"==typeof n&&!Array.isArray(n)?e[t]=ri(n):e[t]=n,e},Object.create(null))):r},stringify:function(e,t){var n=ei(t=fm({encode:!0,strict:!0,arrayFormat:"none"},t));return e?Object.keys(e).sort().map(function(r){var o=e[r];if(void 0===o)return"";if(null===o)return ni(r,t);if(Array.isArray(o)){var i=[];return o.slice().forEach(function(e){void 0!==e&&i.push(n(r,e,i.length))}),i.join("&")}return ni(r,t)+"="+ni(o,t)}).filter(function(e){return e.length>0}).join("&"):""}},hm=0,vm=-1,mm={sendHttp:function(e,t){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return}if("object"!=typeof e||!e.url)return console.error("[h5-render] invalid config or invalid config.url for sendHttp API");var n=this.sender,r=e.method||"GET",o=new XMLHttpRequest;o.open(r,e.url,!0),o.onload=function(){n.performCallback(t,this.responseText)},o.onerror=function(e){return console.error("[h5-render] unexpected error in sendHttp API",e)},o.send()},fetch:function(e,t,n){var r=["GET","POST","PUT","DELETE","HEAD","PATCH"],o=["cors","no-cors","same-origin","navigate"],i=["text","json","jsonp","arraybuffer"],a=this.sender,s=Hv.extend({},e);if(void 0===s.method)s.method="GET",console.warn("[h5-render] options.method for 'fetch' API has been set to default value '"+s.method+"'");else if(-1===r.indexOf((s.method+"").toUpperCase()))return console.error("[h5-render] options.method '"+s.method+"' for 'fetch' API should be one of "+r+".");if(!s.url)return console.error("[h5-render] options.url should be set for 'fetch' API.");if("GET"===s.method.toUpperCase()){var l=s.body;Hv.isPlainObject(l)&&(l=pm.stringify(l));var c=s.url,u=c.indexOf("#");u<=-1&&(u=c.length);var d=c.substr(u);d&&(d="#"+d),c=c.substring(0,u),c+=(s.url.indexOf("?")<=-1?"?":"&")+l+d,s.url=c}if(void 0===s.mode)s.mode="cors";else if(-1===o.indexOf((s.mode+"").toLowerCase()))return console.error("[h5-render] options.mode '"+s.mode+"' for 'fetch' API should be one of "+o+".");if(void 0===s.type)s.type="text",console.warn("[h5-render] options.type for 'fetch' API has been set to default value '"+s.type+"'.");else if(-1===i.indexOf((s.type+"").toLowerCase()))return console.error("[h5-render] options.type '"+s.type+"' for 'fetch' API should be one of "+i+".");if(s.headers=s.headers||{},!Hv.isPlainObject(s.headers))return console.error("[h5-render] options.headers should be a plain object");s.timeout=parseInt(s.timeout,10)||2500;var f=[s,function(e){a.performCallback(t,e)}];n&&f.push(function(e){a.performCallback(n,e,!0)}),"jsonp"===s.type?oi.apply(this,f):ii.apply(this,f)}},ym={stream:[{name:"sendHttp",args:["object","function"]},{name:"fetch",args:["object","function","function"]}]},gm={goBack:function(e){var t=this.getComponentManager().getComponent(e);t.goBack?t.goBack():console.error("error: the specified component has no method of goBack. Please make sure it is a webview component.")},goForward:function(e){var t=this.getComponentManager().getComponent(e);t.goForward?t.goForward():console.error("error: the specified component has no method of goForward. Please make sure it is a webview component.")},reload:function(e){var t=this.getComponentManager().getComponent(e);t.reload?t.reload():console.error("error: the specified component has no method of reload. Please make sure it is a webview component.")}},bm={webview:[{name:"goBack",args:["string"]},{name:"goForward",args:["string"]},{name:"reload",args:["string"]}]},Am={},wm={WebSocket:function(e,t){Gv&&(Gv.close(),Gv=void 0,Am={}),""===t&&(t=void 0);var n=this;(Gv=new WebSocket(e,t)).onopen=function(e){Am.onopen&&n.sender.performCallback(Am.onopen,{type:e.type},!0)},Gv.onmessage=function(e){Am.onmessage&&n.sender.performCallback(Am.onmessage,{origin:e.origin,data:e.data,source:e.data},!0)},Gv.onerror=function(e){Am.onerror&&n.sender.performCallback(Am.onerror,{code:e.code,data:e.data})},Gv.onclose=function(e){Am.onclose&&n.sender.performCallback(Am.onclose,{data:e.data,code:e.code,reason:e.reason})}},close:function(e,t){Gv&&(Gv.close(e,t),Gv=void 0,Am={})},send:function(e){Gv&&Gv.send(e)},onopen:function(e){Gv&&(Am.onopen=e)},onerror:function(e){Gv&&(Am.onerror=e)},onmessage:function(e){Gv&&(Am.onmessage=e)},onclose:function(e){Gv&&(Am.onclose=e)}},_m={webSocket:[{name:"WebSocket",args:["string","string"]},{name:"close",args:["numble","string"]},{name:"send",args:["string"]},{name:"onopen",args:["function"]},{name:"onmessage",args:["function"]},{name:"onclose",args:["function"]},{name:"onerror",args:["function"]}]},xm={Image:vf,Text:bf,Scrollable:ap,Slider:jp,Indicator:Np,Tabheader:Wp,Input:Hp,Textarea:Jp,Video:Zp,Switch:ih,A:sh,Embed:dh,Spinner:yh,Web:bh,Neighbor:Th,Richtext:Fh,Animation:Qh,Clipboard:Hh,Dom:uv,Event:pv,Geolocation:gv,GlobalEvent:_v,Meta:Cv,Modal:Kv,Navigator:em,PageInfo:rm,Storage:sm,Stream:{init:function(e){Hv=e.utils,e.registerApiModule("stream",mm,ym)}},Webview:{init:function(e){e.registerApiModule("webview",gm,bm)}},WebSocket:{init:function(e){e.registerApiModule("webSocket",wm,_m)}}},Em={init:function(e){if("object"==typeof xm)for(var t in xm)e.install(xm[t])}};return ar.install(tf),ar.install(nf),ar.install(sf),ar.install(Em),global.registerComponents([{type:"input",methods:["focus","blur"]}]),ar});
