http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/assets/weex-rax.js
----------------------------------------------------------------------
diff --git a/android/sdk/assets/weex-rax.js b/android/sdk/assets/weex-rax.js
new file mode 100644
index 0000000..19ffa62
--- /dev/null
+++ b/android/sdk/assets/weex-rax.js
@@ -0,0 +1,8299 @@
+/* Prepare Rax Environment APIs 0.4.20, Build 2018-02-26 19:32. */
+
+var global = this; var process = {env:{}};
+(function (global, factory) {
+       typeof exports === 'object' && typeof module !== 'undefined' ? 
factory() :
+       typeof define === 'function' && define.amd ? define(factory) :
+       (factory());
+}(this, (function () { 'use strict';
+
+function unwrapExports (x) {
+       return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 
'default') ? x['default'] : x;
+}
+
+function createCommonjsModule(fn, module) {
+       return module = { exports: {} }, fn(module, module.exports), 
module.exports;
+}
+
+var api = createCommonjsModule(function (module) {
+module.exports = /******/ (function(modules) { // webpackBootstrap
+/******/  // The module cache
+/******/  var installedModules = {};
+/******/
+/******/  // The require function
+/******/  function __webpack_require__(moduleId) {
+/******/
+/******/    // Check if module is in cache
+/******/    if(installedModules[moduleId]) {
+/******/      return installedModules[moduleId].exports;
+/******/    }
+/******/    // Create a new module (and put it into the cache)
+/******/    var module = installedModules[moduleId] = {
+/******/      i: moduleId,
+/******/      l: false,
+/******/      exports: {}
+/******/    };
+/******/
+/******/    // Execute the module function
+/******/    modules[moduleId].call(module.exports, module, module.exports, 
__webpack_require__);
+/******/
+/******/    // Flag the module as loaded
+/******/    module.l = true;
+/******/
+/******/    // Return the exports of the module
+/******/    return module.exports;
+/******/  }
+/******/
+/******/
+/******/  // expose the modules object (__webpack_modules__)
+/******/  __webpack_require__.m = modules;
+/******/
+/******/  // expose the module cache
+/******/  __webpack_require__.c = installedModules;
+/******/
+/******/  // define getter function for harmony exports
+/******/  __webpack_require__.d = function(exports, name, getter) {
+/******/    if(!__webpack_require__.o(exports, name)) {
+/******/      Object.defineProperty(exports, name, {
+/******/        configurable: false,
+/******/        enumerable: true,
+/******/        get: getter
+/******/      });
+/******/    }
+/******/  };
+/******/
+/******/  // getDefaultExport function for compatibility with non-harmony 
modules
+/******/  __webpack_require__.n = function(module) {
+/******/    var getter = module && module.__esModule ?
+/******/      function getDefault() { return module['default']; } :
+/******/      function getModuleExports() { return module; };
+/******/    __webpack_require__.d(getter, 'a', getter);
+/******/    return getter;
+/******/  };
+/******/
+/******/  // Object.prototype.hasOwnProperty.call
+/******/  __webpack_require__.o = function(object, property) { return 
Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/  // __webpack_public_path__
+/******/  __webpack_require__.p = "";
+/******/
+/******/  // Load entry module and return exports
+/******/  return __webpack_require__(__webpack_require__.s = 3);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/*!***************************************************************************************************************************!*\
+  !*** 
./packages/weex-rax-framework-api/node_modules/.npminstall/event-target-shim/2.0.0/event-target-shim/lib/commons.js
 ***!
+  
\***************************************************************************************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/*! ModuleConcatenation bailout: Module is not an ECMAScript module */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createUniqueKey = module.exports.createUniqueKey = (
+    typeof Symbol !== "undefined" ? Symbol : //eslint-disable-line no-undef
+    /* otherwise */ function createUniqueKey(name) {
+        return "[[" + name + "_" + Math.random().toFixed(8).slice(2) + "]]"
+    }
+);
+
+/**
+ * Checks whether the given value is a non-null object or not.
+ *
+ * @param {any} x - The value to be check.
+ * @returns {boolean} `true` if the value is a non-null object.
+ * @private
+ */
+var isObject = module.exports.isObject = function isObject(x) {
+    return typeof x === "object" && x !== null
+};
+
+/**
+ * The key of listeners.
+ *
+ * @type {symbol|string}
+ * @private
+ */
+module.exports.LISTENERS = createUniqueKey("listeners");
+
+/**
+ * A value of kind for listeners which are registered in the capturing phase.
+ *
+ * @type {number}
+ * @private
+ */
+module.exports.CAPTURE = 1;
+
+/**
+ * A value of kind for listeners which are registered in the bubbling phase.
+ *
+ * @type {number}
+ * @private
+ */
+module.exports.BUBBLE = 2;
+
+/**
+ * A value of kind for listeners which are registered as an attribute.
+ *
+ * @type {number}
+ * @private
+ */
+module.exports.ATTRIBUTE = 3;
+
+/**
+ * @typedef object ListenerNode
+ * @property {function} listener - A listener function.
+ * @property {number} kind - The kind of the listener.
+ * @property {ListenerNode|null} next - The next node.
+ *      If this node is the last, this is `null`.
+ */
+
+/**
+ * Creates a node of singly linked list for a list of listeners.
+ *
+ * @param {function} listener - A listener function.
+ * @param {number} kind - The kind of the listener.
+ * @param {object} [options] - The option object.
+ * @param {boolean} [options.once] - The flag to remove the listener at the 
first call.
+ * @param {boolean} [options.passive] - The flag to ignore 
`event.preventDefault` method.
+ * @returns {ListenerNode} The created listener node.
+ */
+module.exports.newNode = function newNode(listener, kind, options) {
+    var obj = isObject(options);
+
+    return {
+        listener: listener,
+        kind: kind,
+        once: obj && Boolean(options.once),
+        passive: obj && Boolean(options.passive),
+        next: null,
+    }
+};
+
+
+/***/ }),
+/* 1 */
+/*!********************************************************!*\
+  !*** ./packages/weex-rax-framework-api/src/emitter.js ***!
+  \********************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/*! ModuleConcatenation bailout: Module is not an ECMAScript module */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { 
for (var i = 0; i < props.length; i++) { var descriptor = props[i]; 
descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable 
= true; if ("value" in descriptor) { descriptor.writable = true; } 
Object.defineProperty(target, descriptor.key, descriptor); } } return function 
(Constructor, protoProps, staticProps) { if (protoProps) { 
defineProperties(Constructor.prototype, protoProps); } if (staticProps) { 
defineProperties(Constructor, staticProps); } return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof 
Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var EventEmitter = function () {
+  function EventEmitter() {
+    _classCallCheck(this, EventEmitter);
+
+    this._listeners = {};
+  }
+
+  /**
+   * Adds a listener function to the specified event.
+   * @param {String} type
+   * @param {Function} listener
+   * @param {Boolean} once
+   */
+
+
+  _createClass(EventEmitter, [{
+    key: "_addListener",
+    value: function _addListener(type, listener, once) {
+      this._listeners[type] = this._listeners[type] || [];
+      this._listeners[type].push({ listener: listener, once: once });
+      return this;
+    }
+
+    /**
+     * Adds a listener function to the specified event.
+     * @param {String} type
+     * @param {Function} listener
+     * @return {Object} Current instance of EventEmitter for chaining.
+     */
+
+  }, {
+    key: "on",
+    value: function on(type, listener) {
+      return this._addListener(type, listener, false);
+    }
+  }, {
+    key: "once",
+    value: function once(type, listener) {
+      return this._addListener(type, listener, true);
+    }
+
+    /**
+     * Removes a listener function to the specified event.
+     * @param {String} type
+     * @param {Function} listener
+     * @return {Object} Current instance of EventEmitter for chaining.
+     */
+
+  }, {
+    key: "off",
+    value: function off(type, listener) {
+      // alias
+      if (!this._listeners[type]) {
+        return this;
+      }
+      if (!this._listeners[type].length) {
+        return this;
+      }
+      if (!listener) {
+        delete this._listeners[type];
+        return this;
+      }
+      this._listeners[type] = this._listeners[type].filter(function 
(_listener) {
+        return !(_listener.listener === listener);
+      });
+      return this;
+    }
+
+    /**
+     * Emits an specified event.
+     * @param {String} type
+     * @param {Object} payload
+     * @return {Object} Current instance of EventEmitter for chaining.
+     */
+
+  }, {
+    key: "emit",
+    value: function emit(type, payload) {
+      var _this = this;
+
+      if (!this._listeners[type]) {
+        return this;
+      }
+      this._listeners[type].forEach(function (_listener) {
+        _listener.listener.apply(_this, [payload]);
+        if (_listener.once) {
+          _this.removeListener(type, _listener.listener);
+        }
+      });
+      return this;
+    }
+  }]);
+
+  return EventEmitter;
+}();
+
+exports.default = EventEmitter;
+module.exports = exports["default"];
+
+/***/ }),
+/* 2 */
+/*!********************************************************************************************************************************!*\
+  !*** 
./packages/weex-rax-framework-api/node_modules/.npminstall/event-target-shim/2.0.0/event-target-shim/lib/event-target.js
 ***!
+  
\********************************************************************************************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/*! ModuleConcatenation bailout: Module is not an ECMAScript module */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Commons = __webpack_require__(/*! ./commons */ 0);
+var CustomEventTarget = __webpack_require__(/*! ./custom-event-target */ 15);
+var EventWrapper = __webpack_require__(/*! ./event-wrapper */ 16);
+var isObject = Commons.isObject;
+var LISTENERS = Commons.LISTENERS;
+var CAPTURE = Commons.CAPTURE;
+var BUBBLE = Commons.BUBBLE;
+var ATTRIBUTE = Commons.ATTRIBUTE;
+var newNode = Commons.newNode;
+var defineCustomEventTarget = CustomEventTarget.defineCustomEventTarget;
+var createEventWrapper = EventWrapper.createEventWrapper;
+var STOP_IMMEDIATE_PROPAGATION_FLAG = 
EventWrapper.STOP_IMMEDIATE_PROPAGATION_FLAG;
+var PASSIVE_LISTENER_FLAG = EventWrapper.PASSIVE_LISTENER_FLAG;
+
+//------------------------------------------------------------------------------
+// Constants
+//------------------------------------------------------------------------------
+
+/**
+ * A flag which shows there is the native `EventTarget` interface object.
+ *
+ * @type {boolean}
+ * @private
+ */
+var HAS_EVENTTARGET_INTERFACE = (
+    typeof window !== "undefined" &&
+    typeof window.EventTarget !== "undefined"
+);
+
+//------------------------------------------------------------------------------
+// Public Interface
+//------------------------------------------------------------------------------
+
+/**
+ * An implementation for `EventTarget` interface.
+ *
+ * @constructor
+ * @public
+ */
+var EventTarget = module.exports = function EventTarget() {
+    var arguments$1 = arguments;
+
+    if (this instanceof EventTarget) {
+        // this[LISTENERS] is a Map.
+        // Its key is event type.
+        // Its value is ListenerNode object or null.
+        //
+        // interface ListenerNode {
+        //     var listener: Function
+        //     var kind: CAPTURE|BUBBLE|ATTRIBUTE
+        //     var next: ListenerNode|null
+        // }
+        Object.defineProperty(this, LISTENERS, {value: Object.create(null)});
+    }
+    else if (arguments.length === 1 && Array.isArray(arguments[0])) {
+        return defineCustomEventTarget(EventTarget, arguments[0])
+    }
+    else if (arguments.length > 0) {
+        var types = Array(arguments.length);
+        for (var i = 0; i < arguments.length; ++i) {
+            types[i] = arguments$1[i];
+        }
+
+        // To use to extend with attribute listener properties.
+        // e.g.
+        //     class MyCustomObject extends EventTarget("message", "error") {
+        //         //...
+        //     }
+        return defineCustomEventTarget(EventTarget, types)
+    }
+    else {
+        throw new TypeError("Cannot call a class as a function")
+    }
+};
+
+EventTarget.prototype = Object.create(
+    (HAS_EVENTTARGET_INTERFACE ? window.EventTarget : Object).prototype,
+    {
+        constructor: {
+            value: EventTarget,
+            writable: true,
+            configurable: true,
+        },
+
+        addEventListener: {
+            value: function addEventListener(type, listener, options) {
+                if (listener == null) {
+                    return false
+                }
+                if (typeof listener !== "function" && typeof listener !== 
"object") {
+                    throw new TypeError("\"listener\" is not an object.")
+                }
+
+                var capture = isObject(options) ? Boolean(options.capture) : 
Boolean(options);
+                var kind = (capture ? CAPTURE : BUBBLE);
+                var node = this[LISTENERS][type];
+                if (node == null) {
+                    this[LISTENERS][type] = newNode(listener, kind, options);
+                    return true
+                }
+
+                var prev = null;
+                while (node != null) {
+                    if (node.listener === listener && node.kind === kind) {
+                        // Should ignore a duplicated listener.
+                        return false
+                    }
+                    prev = node;
+                    node = node.next;
+                }
+
+                prev.next = newNode(listener, kind, options);
+                return true
+            },
+            configurable: true,
+            writable: true,
+        },
+
+        removeEventListener: {
+            value: function removeEventListener(type, listener, options) {
+                var this$1 = this;
+
+                if (listener == null) {
+                    return false
+                }
+
+                var capture = isObject(options) ? Boolean(options.capture) : 
Boolean(options);
+                var kind = (capture ? CAPTURE : BUBBLE);
+                var prev = null;
+                var node = this[LISTENERS][type];
+                while (node != null) {
+                    if (node.listener === listener && node.kind === kind) {
+                        if (prev == null) {
+                            this$1[LISTENERS][type] = node.next;
+                        }
+                        else {
+                            prev.next = node.next;
+                        }
+                        return true
+                    }
+
+                    prev = node;
+                    node = node.next;
+                }
+
+                return false
+            },
+            configurable: true,
+            writable: true,
+        },
+
+        dispatchEvent: {
+            value: function dispatchEvent(event) {
+                var this$1 = this;
+
+                // If listeners aren't registered, terminate.
+                var type = event.type;
+                var node = this[LISTENERS][type];
+                if (node == null) {
+                    return true
+                }
+
+                // Since we cannot rewrite several properties, so wrap object.
+                var wrapped = createEventWrapper(event, this);
+
+                // This doesn't process capturing phase and bubbling phase.
+                // This isn't participating in a tree.
+                var prev = null;
+                while (node != null) {
+                    // Remove this listener if it's once
+                    if (node.once) {
+                        if (prev == null) {
+                            this$1[LISTENERS][type] = node.next;
+                        }
+                        else {
+                            prev.next = node.next;
+                        }
+                    }
+                    else {
+                        prev = node;
+                    }
+
+                    // Call this listener
+                    wrapped[PASSIVE_LISTENER_FLAG] = node.passive;
+                    if (typeof node.listener === "function") {
+                        node.listener.call(this$1, wrapped);
+                    }
+                    else if (node.kind !== ATTRIBUTE && typeof 
node.listener.handleEvent === "function") {
+                        node.listener.handleEvent(wrapped);
+                    }
+
+                    // Break if `event.stopImmediatePropagation` was called.
+                    if (wrapped[STOP_IMMEDIATE_PROPAGATION_FLAG]) {
+                        break
+                    }
+
+                    node = node.next;
+                }
+
+                return !wrapped.defaultPrevented
+            },
+            configurable: true,
+            writable: true,
+        },
+    }
+);
+
+
+/***/ }),
+/* 3 */
+/*!******************************************************!*\
+  !*** ./packages/weex-rax-framework-api/src/index.js ***!
+  \******************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/*! ModuleConcatenation bailout: Module is not an ECMAScript module */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === 
"symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj 
&& typeof Symbol === "function" && obj.constructor === Symbol && obj !== 
Symbol.prototype ? "symbol" : typeof obj; };
+
+exports.injectContext = injectContext;
+exports.resetInstanceContext = resetInstanceContext;
+
+var _builtin = __webpack_require__(/*! ./builtin */ 4);
+
+var _emitter = __webpack_require__(/*! ./emitter */ 1);
+
+var _emitter2 = _interopRequireDefault(_emitter);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+var MODULE_NAME_PREFIX = '@weex-module/';
+var MODAL_MODULE = MODULE_NAME_PREFIX + 'modal';
+var NAVIGATOR_MODULE = MODULE_NAME_PREFIX + 'navigator';
+var GLOBAL_EVENT_MODULE = MODULE_NAME_PREFIX + 'globalEvent';
+// Instance hub
+// const instances = {};
+// Bundles hub
+var noop = function noop() {};
+var weex = {};
+
+function genBuiltinModules(modules, moduleFactories, context) {
+  for (var moduleName in moduleFactories) {
+    modules[moduleName] = {
+      factory: moduleFactories[moduleName].bind(context),
+      module: { exports: {} },
+      isInitialized: false
+    };
+  }
+  return modules;
+}
+
+function injectContext() {
+  var instanceContext = new Function('return this')();
+  var window = resetInstanceContext(instanceContext);
+  for (var key in window) {
+    if (typeof instanceContext[key] === 'undefined' && key != '__weex_data__') 
{
+      instanceContext[key] = window[key];
+    }
+  }
+}
+
+/**
+ * create a Weex instance
+ *
+ * @param  {string} instanceId
+ * @param  {string} __weex_code__
+ * @param  {object} [__weex_options__] {bundleUrl, debug}
+ */
+// export function createInstance(instanceId, __weex_code__, __weex_options__, 
__weex_data__, __weex_config__) {
+function resetInstanceContext(instanceContext) {
+  var instanceId = instanceContext.instanceId,
+      document = instanceContext.document,
+      bundleUrl = instanceContext.bundleUrl,
+      __weex_document__ = instanceContext.__weex_document__,
+      __weex_options__ = instanceContext.__weex_options__,
+      __weex_data__ = instanceContext.__weex_data__,
+      __weex_config__ = instanceContext.__weex_config__;
+
+
+  weex = __weex_options__.weex;
+
+  // Mark start time
+  var responseEnd = Date.now();
+  var __weex_env__ = (typeof WXEnvironment === 'undefined' ? 'undefined' : 
_typeof(WXEnvironment)) === 'object' && WXEnvironment || {};
+  // For better performance use built-in promise first
+  var shared = __webpack_require__(/*! runtime-shared/dist/shared.function */ 
6)();
+
+  var Promise = typeof Promise === 'function' ? Promise : shared.Promise;
+  var _Symbol = typeof _Symbol === 'function' ? _Symbol : shared.Symbol;
+  var Set = typeof Set === 'function' ? Set : shared.Set;
+  var Map = typeof Map === 'function' ? Map : shared.Map;
+  var WeakMap = typeof WeakMap === 'function' ? WeakMap : shared.WeakMap;
+  var WeakSet = typeof WeakSet === 'function' ? WeakSet : shared.WeakSet;
+  var URL = shared.URL,
+      URLSearchParams = shared.URLSearchParams,
+      FontFace = shared.FontFace,
+      matchMedia = shared.matchMedia;
+  // let bundleUrl = __weex_options__.bundleUrl || 'about:blank';
+
+  if (!bundleUrl) {
+    console.error('Error: Must have bundleUrl option when createInstance, 
downgrade to "about:blank".');
+  } else if (!bundleUrl.split('//')[0]) {
+    bundleUrl = 'https:' + bundleUrl;
+  }
+
+  var documentURL = new URL(bundleUrl);
+  var modules = {};
+
+  // Generate native modules map at instance init
+  // genNativeModules(modules, document);
+  var __weex_define__ = __webpack_require__(/*! ./define.weex */ 7)(modules);
+  var __weex_require__ = __webpack_require__(/*! ./require.weex */ 8)(modules, 
weex);
+  var __weex_downgrade__ = __webpack_require__(/*! ./downgrade.weex */ 
9)(__weex_require__);
+  // Extend document
+  __webpack_require__(/*! ./document.weex */ 11)(__weex_require__, document);
+
+  var location = __webpack_require__(/*! ./location.weex */ 
12)(__weex_require__, documentURL);
+
+  var _require = __webpack_require__(/*! ./fetch.weex */ 13)(__weex_require__, 
Promise),
+      fetch = _require.fetch,
+      Headers = _require.Headers,
+      Request = _require.Request,
+      Response = _require.Response;
+
+  var XMLHttpRequest = __webpack_require__(/*! ./xmlhttprequest.weex */ 
14)(__weex_require__);
+  var WebSocket = __webpack_require__(/*! ./websocket.weex */ 
17)(__weex_require__);
+
+  var _require2 = __webpack_require__(/*! ./timer.weex */ 
18)(__weex_require__, document),
+      setTimeout = _require2.setTimeout,
+      clearTimeout = _require2.clearTimeout,
+      setInterval = _require2.setInterval,
+      clearInterval = _require2.clearInterval,
+      requestAnimationFrame = _require2.requestAnimationFrame,
+      cancelAnimationFrame = _require2.cancelAnimationFrame;
+
+  var _require3 = __webpack_require__(/*! ./base64.weex */ 19)(),
+      atob = _require3.atob,
+      btoa = _require3.btoa;
+
+  var performance = __webpack_require__(/*! ./performance.weex */ 
20)(responseEnd);
+
+  var _require4 = __webpack_require__(/*! ./event.weex */ 21)(),
+      Event = _require4.Event,
+      CustomEvent = _require4.CustomEvent;
+
+  var windowEmitter = new _emitter2.default();
+
+  var errorHandler = null;
+  function registerErrorHandler() {
+    if (registerErrorHandler.once) { return; }
+
+    var globalEvent = __weex_require__(GLOBAL_EVENT_MODULE);
+    globalEvent.addEventListener('exception', function (e) {
+      // TODO: miss lineno and colno
+      // window.onerror = function(messageOrEvent, source, lineno, colno, 
error) { ... }
+      errorHandler(e.exception, e.bundleUrl, 0, 0, new Error(e.exception, 
e.bundleUrl, 0));
+    });
+
+    registerErrorHandler.once = true;
+  }
+
+  var window = {
+    // ES
+    Promise: Promise,
+    Symbol: _Symbol,
+    Map: Map,
+    Set: Set,
+    WeakMap: WeakMap,
+    WeakSet: WeakSet,
+    // W3C: https://www.w3.org/TR/html5/browsers.html#browsing-context-name
+    name: '',
+    // This read-only property indicates whether the referenced window is 
closed or not.
+    closed: false,
+    atob: atob,
+    btoa: btoa,
+    performance: performance,
+    // W3C
+    document: document,
+    location: location,
+    // https://www.w3.org/TR/2009/WD-html5-20090423/browsers.html#dom-navigator
+    navigator: {
+      product: 'Weex',
+      platform: __weex_env__.platform,
+      appName: __weex_env__.appName,
+      appVersion: __weex_env__.appVersion,
+      // Weex/0.12 iOS/9.3 (iPhone7,2) AppName/0.12
+      userAgent: 'Weex/' + __weex_env__.weexVersion + ' ' + 
__weex_env__.platform + '/' + __weex_env__.osVersion + ' (' + 
__weex_env__.deviceModel + ') ' + __weex_env__.appName + '/' + 
__weex_env__.appVersion
+    },
+    // https://drafts.csswg.org/cssom-view/#the-screen-interface
+    screen: {
+      width: __weex_env__.deviceWidth,
+      height: __weex_env__.deviceHeight,
+      availWidth: __weex_env__.deviceWidth,
+      availHeight: __weex_env__.deviceHeight,
+      colorDepth: 24,
+      pixelDepth: 24
+    },
+    devicePixelRatio: __weex_env__.scale,
+    fetch: fetch,
+    Headers: Headers,
+    Response: Response,
+    Request: Request,
+    XMLHttpRequest: XMLHttpRequest,
+    URL: URL,
+    URLSearchParams: URLSearchParams,
+    FontFace: FontFace,
+    WebSocket: WebSocket,
+    Event: Event,
+    CustomEvent: CustomEvent,
+    matchMedia: matchMedia,
+    setTimeout: setTimeout,
+    clearTimeout: clearTimeout,
+    setInterval: setInterval,
+    clearInterval: clearInterval,
+    requestAnimationFrame: requestAnimationFrame,
+    cancelAnimationFrame: cancelAnimationFrame,
+    setImmediate: typeof setImmediate === 'function' && setImmediate || 
function (fn) {
+      setTimeout(fn, 0);
+    },
+    clearImmediate: typeof setImmediate === 'function' && setImmediate || 
function (id) {
+      clearTimeout(id);
+    },
+    frameworkVersion: null,
+    alert: function alert(message) {
+      var modal = __weex_require__(MODAL_MODULE);
+      modal.alert({
+        message: message
+      }, function () {});
+    },
+    open: function open(url) {
+      var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
+      weexNavigator.push({
+        url: url,
+        animated: true
+      }, noop);
+    },
+    close: function close() {
+      var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
+      weexNavigator.close({
+        animated: true
+      }, noop, noop);
+    },
+    postMessage: function postMessage(message, targetOrigin) {
+      var event = {
+        origin: location.origin,
+        data: JSON.parse(JSON.stringify(message)),
+        type: 'message',
+        source: window // FIXME: maybe not export window
+      };
+
+      if (typeof BroadcastChannel === 'function') {
+        if (targetOrigin == '*') {
+          var stack = new BroadcastChannel('message');
+          stack.postMessage(event);
+        } else {
+          var stack = new BroadcastChannel('message' + targetOrigin);
+          stack.postMessage(event);
+        }
+      }
+    },
+    addEventListener: function addEventListener(type, listener) {
+      if (type === 'message') {
+        if (typeof BroadcastChannel === 'function') {
+          var stack = new BroadcastChannel('message');
+          var thisStack = new BroadcastChannel('message' + bundleUrl);
+          stack.onmessage = function (e) {
+            listener(e.data);
+          };
+          thisStack.onmessage = function (e) {
+            listener(e.data);
+          };
+        }
+      } else {
+        windowEmitter.on(type, listener);
+      }
+    },
+    removeEventListener: function removeEventListener(type, listener) {
+      windowEmitter.off(type, listener);
+    },
+    dispatchEvent: function dispatchEvent(e) {
+      windowEmitter.emit(e.type, e);
+    },
+    set onerror(handler) {
+      if (typeof handler == 'function') {
+        errorHandler = handler;
+        registerErrorHandler();
+      } else {
+        errorHandler = null;
+      }
+    },
+    get onerror() {
+      return errorHandler;
+    },
+    // ModuleJS
+    define: __weex_define__,
+    require: __weex_require__,
+    // Weex
+    callNative: function callNative() {},
+    __weex_document__: __weex_document__,
+    __weex_module_supports__: weex.isRegisteredModule,
+    __weex_tag_supports__: weex.isRegisteredComponent,
+    __weex_define__: __weex_define__,
+    __weex_require__: __weex_require__,
+    __weex_downgrade__: __weex_downgrade__,
+    __weex_env__: __weex_env__,
+    __weex_code__: '',
+    __weex_options__: __weex_options__,
+    __weex_data__: __weex_data__,
+    __weex_config__: __weex_config__
+  };
+
+  genBuiltinModules(modules, _builtin.ModuleFactories, window);
+
+  window.self = window.window = window;
+
+  console.log('Rax jsfm init window', typeof window === 'undefined' ? 
'undefined' : _typeof(window));
+  return window;
+}
+
+/***/ }),
+/* 4 */
+/*!********************************************************!*\
+  !*** ./packages/weex-rax-framework-api/src/builtin.js ***!
+  \********************************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/*! ModuleConcatenation bailout: Module is not an ECMAScript module */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var ModuleFactories = exports.ModuleFactories = {
+  'rax': __webpack_require__(/*! rax/dist/rax.factory */ 5)
+};
+
+/***/ }),
+/* 5 */
+/*!******************************************!*\
+  !*** ./packages/rax/dist/rax.factory.js ***!
+  \******************************************/
+/*! dynamic exports provided */
+/*! all exports used */
+/*! ModuleConcatenation bailout: Module is not an ECMAScript module */
+/***/ (function(module, exports) {
+
+module.exports = function(require, exports, module) {
+  var __weex_document__ = this["__weex_document__"];
+var document = this["document"];
+  module.exports = /******/ (function(modules) { // webpackBootstrap
+/******/  // The module cache
+/******/  var installedModules = {};
+/******/
+/******/  // The require function
+/******/  function __webpack_require__(moduleId) {
+/******/
+/******/    // Check if module is in cache
+/******/    if(installedModules[moduleId]) {
+/******/      return installedModules[moduleId].exports;
+/******/    }
+/******/    // Create a new module (and put it into the cache)
+/******/    var module = installedModules[moduleId] = {
+/******/      i: moduleId,
+/******/      l: false,
+/******/      exports: {}
+/******/    };
+/******/
+/******/    // Execute the module function
+/******/    modules[moduleId].call(module.exports, module, module.exports, 
__webpack_require__);
+/******/
+/******/    // Flag the module as loaded
+/******/    module.l = true;
+/******/
+/******/    // Return the exports of the module
+/******/    return module.exports;
+/******/  }
+/******/
+/******/
+/******/  // expose the modules object (__webpack_modules__)
+/******/  __webpack_require__.m = modules;
+/******/
+/******/  // expose the module cache
+/******/  __webpack_require__.c = installedModules;
+/******/
+/******/  // define getter function for harmony exports
+/******/  __webpack_require__.d = function(exports, name, getter) {
+/******/    if(!__webpack_require__.o(exports, name)) {
+/******/      Object.defineProperty(exports, name, {
+/******/        configurable: false,
+/******/        enumerable: true,
+/******/        get: getter
+/******/      });
+/******/    }
+/******/  };
+/******/
+/******/  // getDefaultExport function for compatibility with non-harmony 
modules
+/******/  __webpack_require__.n = function(module) {
+/******/    var getter = module && module.__esModule ?
+/******/      function getDefault() { return module['default']; } :
+/******/      function getModuleExports() { return module; };
+/******/    __webpack_require__.d(getter, 'a', getter);
+/******/    return getter;
+/******/  };
+/******/
+/******/  // Object.prototype.hasOwnProperty.call
+/******/  __webpack_require__.o = function(object, property) { return 
Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/  // __webpack_public_path__
+/******/  __webpack_require__.p = "";
+/******/
+/******/  // Load entry module and return exports
+/******/  return __webpack_require__(__webpack_require__.s = 17);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+/*
+ * Stateful things in runtime
+ */
+exports.default = {
+  component: null,
+  mountID: 1,
+  sandbox: true,
+  // Roots
+  rootComponents: {},
+  rootInstances: {},
+  // Inject
+  hook: null,
+  driver: null,
+  monitor: null
+};
+module.exports = exports["default"];
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+var _element = __webpack_require__(6);
+
+var _unmountComponentAtNode = __webpack_require__(9);
+
+var _unmountComponentAtNode2 = _interopRequireDefault(_unmountComponentAtNode);
+
+var _instantiateComponent = __webpack_require__(2);
+
+var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
+
+var _shouldUpdateComponent = __webpack_require__(3);
+
+var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
+
+var _root = __webpack_require__(19);
+
+var _root2 = _interopRequireDefault(_root);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+/**
+ * Instance manager
+ */
+var KEY = '$$instance';
+
+exports.default = {
+  set: function set(node, instance) {
+    if (!node[KEY]) {
+      node[KEY] = instance;
+      // Record root instance to roots map
+      if (instance.rootID) {
+        _host2.default.rootInstances[instance.rootID] = instance;
+        _host2.default.rootComponents[instance.rootID] = instance._internal;
+      }
+    }
+  },
+  get: function get(node) {
+    return node[KEY];
+  },
+  remove: function remove(node) {
+    var instance = this.get(node);
+    if (instance) {
+      node[KEY] = null;
+      if (instance.rootID) {
+        delete _host2.default.rootComponents[instance.rootID];
+        delete _host2.default.rootInstances[instance.rootID];
+      }
+    }
+  },
+  mount: function mount(element, container, parentInstance) {
+    _host2.default.driver.beforeRender && _host2.default.driver.beforeRender();
+
+    // Real native root node is body
+    if (container == null) {
+      container = _host2.default.driver.createBody();
+    }
+
+    // Get the context from the conceptual parent component.
+    var parentContext = void 0;
+    if (parentInstance) {
+      var parentInternal = parentInstance._internal;
+      parentContext = 
parentInternal._processChildContext(parentInternal._context);
+    }
+
+    var prevRootInstance = this.get(container);
+    var hasPrevRootInstance = prevRootInstance && 
prevRootInstance.isRootComponent;
+
+    if (hasPrevRootInstance) {
+      var prevRenderedComponent = prevRootInstance.getRenderedComponent();
+      var prevElement = prevRenderedComponent._currentElement;
+      if ((0, _shouldUpdateComponent2.default)(prevElement, element)) {
+        var prevUnmaskedContext = prevRenderedComponent._context;
+        prevRenderedComponent.updateComponent(prevElement, element, 
prevUnmaskedContext, parentContext || prevUnmaskedContext);
+
+        return prevRootInstance;
+      } else {
+        _host2.default.hook.Reconciler.unmountComponent(prevRootInstance);
+        (0, _unmountComponentAtNode2.default)(container);
+      }
+    }
+
+    var wrappedElement = (0, _element.createElement)(_root2.default, null, 
element);
+    var renderedComponent = (0, 
_instantiateComponent2.default)(wrappedElement);
+    var defaultContext = parentContext || {};
+    var rootInstance = renderedComponent.mountComponent(container, null, 
defaultContext);
+    this.set(container, rootInstance);
+
+    // After render callback
+    _host2.default.driver.afterRender && 
_host2.default.driver.afterRender(rootInstance);
+
+    // Devtool render new root hook
+    _host2.default.hook.Mount._renderNewRootComponent(rootInstance._internal);
+
+    return rootInstance;
+  }
+};
+module.exports = exports['default'];
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === 
"symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj 
&& typeof Symbol === "function" && obj.constructor === Symbol && obj !== 
Symbol.prototype ? "symbol" : typeof obj; };
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function instantiateComponent(element) {
+  var instance = void 0;
+
+  if (element === undefined || element === null || element === false || 
element === true) {
+    instance = new _host2.default.EmptyComponent();
+  } else if (Array.isArray(element)) {
+    instance = new _host2.default.FragmentComponent(element);
+  } else if ((typeof element === 'undefined' ? 'undefined' : _typeof(element)) 
=== 'object' && element.type) {
+    // Special case string values
+    if (typeof element.type === 'string') {
+      instance = new _host2.default.NativeComponent(element);
+    } else {
+      instance = new _host2.default.CompositeComponent(element);
+    }
+  } else if (typeof element === 'string' || typeof element === 'number') {
+    instance = new _host2.default.TextComponent(element);
+  } else {
+    throw new Error('Invalid element type: ' + element + '. (keys: ' + 
Object.keys(element) + ')');
+  }
+
+  instance._mountIndex = 0;
+
+  return instance;
+}
+
+exports.default = instantiateComponent;
+module.exports = exports['default'];
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === 
"symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj 
&& typeof Symbol === "function" && obj.constructor === Symbol && obj !== 
Symbol.prototype ? "symbol" : typeof obj; };
+
+function shouldUpdateComponent(prevElement, nextElement) {
+  // TODO: prevElement and nextElement could be array
+  var prevEmpty = prevElement === null;
+  var nextEmpty = nextElement === null;
+  if (prevEmpty || nextEmpty) {
+    return prevEmpty === nextEmpty;
+  }
+
+  var prevType = typeof prevElement === 'undefined' ? 'undefined' : 
_typeof(prevElement);
+  var nextType = typeof nextElement === 'undefined' ? 'undefined' : 
_typeof(nextElement);
+  if (prevType === 'string' || prevType === 'number') {
+    return nextType === 'string' || nextType === 'number';
+  } else {
+    return prevType === 'object' && nextType === 'object' && prevElement.type 
=== nextElement.type && prevElement.key === nextElement.key;
+  }
+}
+
+exports.default = shouldUpdateComponent;
+module.exports = exports['default'];
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { 
for (var i = 0; i < props.length; i++) { var descriptor = props[i]; 
descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable 
= true; if ("value" in descriptor) { descriptor.writable = true; } 
Object.defineProperty(target, descriptor.key, descriptor); } } return function 
(Constructor, protoProps, staticProps) { if (protoProps) { 
defineProperties(Constructor.prototype, protoProps); } if (staticProps) { 
defineProperties(Constructor, staticProps); } return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof 
Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Base component class.
+ */
+var Component = function () {
+  function Component(props, context, updater) {
+    _classCallCheck(this, Component);
+
+    this.props = props;
+    this.context = context;
+    this.refs = {};
+    this.updater = updater;
+  }
+
+  _createClass(Component, [{
+    key: "isComponentClass",
+    value: function isComponentClass() {}
+  }, {
+    key: "setState",
+    value: function setState(partialState, callback) {
+      this.updater.setState(this, partialState, callback);
+    }
+  }, {
+    key: "forceUpdate",
+    value: function forceUpdate(callback) {
+      this.updater.forceUpdate(this, callback);
+    }
+  }]);
+
+  return Component;
+}();
+
+exports.default = Component;
+module.exports = exports["default"];
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _instance = __webpack_require__(1);
+
+var _instance2 = _interopRequireDefault(_instance);
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+exports.default = {
+  ComponentTree: {
+    getClosestInstanceFromNode: function getClosestInstanceFromNode(node) {
+      return _instance2.default.get(node);
+    },
+    getNodeFromInstance: function getNodeFromInstance(inst) {
+      // inst is an internal instance (but could be a composite)
+      while (inst._renderedComponent) {
+        inst = inst._renderedComponent;
+      }
+
+      if (inst) {
+        return inst._nativeNode;
+      } else {
+        return null;
+      }
+    }
+  },
+  Mount: {
+    _instancesByReactRootID: _host2.default.rootComponents,
+
+    // Stub - React DevTools expects to find this method and replace it
+    // with a wrapper in order to observe new root components being added
+    _renderNewRootComponent: function _renderNewRootComponent() {}
+  },
+  Reconciler: {
+    // Stubs - React DevTools expects to find these methods and replace them
+    // with wrappers in order to observe components being mounted, updated and
+    // unmounted
+    mountComponent: function mountComponent() {},
+    receiveComponent: function receiveComponent() {},
+    unmountComponent: function unmountComponent() {}
+  },
+  // monitor the info of all components
+  monitor: null
+};
+module.exports = exports['default'];
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === 
"symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj 
&& typeof Symbol === "function" && obj.constructor === Symbol && obj !== 
Symbol.prototype ? "symbol" : typeof obj; };
+
+exports.createElement = createElement;
+exports.createFactory = createFactory;
+exports.cloneElement = cloneElement;
+exports.isValidElement = isValidElement;
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+var _flattenChildren = __webpack_require__(7);
+
+var _flattenChildren2 = _interopRequireDefault(_flattenChildren);
+
+var _universalEnv = __webpack_require__(8);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+var RESERVED_PROPS = {
+  key: true,
+  ref: true
+};
+
+function getRenderErrorInfo() {
+  if (_host2.default.component) {
+    var name = _host2.default.component.getName();
+    if (name) {
+      return ' Check the render method of `' + name + '`.';
+    }
+  }
+  return '';
+}
+
+function Element(type, key, ref, props, owner) {
+  if (_universalEnv.isWeex) {
+    props = filterProps(type, props);
+  }
+
+  return {
+    // Built-in properties that belong on the element
+    type: type,
+    key: key,
+    ref: ref,
+    props: props,
+    // Record the component responsible for creating this element.
+    _owner: owner
+  };
+}
+
+exports.default = Element;
+
+
+function flattenStyle(style) {
+  if (!style) {
+    return undefined;
+  }
+
+  if (!Array.isArray(style)) {
+    return style;
+  } else {
+    var result = {};
+    for (var i = 0; i < style.length; ++i) {
+      var computedStyle = flattenStyle(style[i]);
+      if (computedStyle) {
+        for (var key in computedStyle) {
+          result[key] = computedStyle[key];
+        }
+      }
+    }
+    return result;
+  }
+}
+
+// TODO: move to weex-drvier
+function filterProps(type, props) {
+  // Only for weex text
+  if (type === 'text') {
+    var children = props.children;
+    var value = props.value;
+
+    // Value is first
+    if (value == null && children != null) {
+      if (Array.isArray(children)) {
+        children = children.map(function (val) {
+          if (typeof val === 'number' || typeof val === 'string') {
+            return val;
+          } else {
+            return '';
+          }
+        }).join('');
+      } else if (typeof children !== 'number' && typeof children !== 'string') 
{
+        children = '';
+      }
+
+      props.value = String(children);
+    }
+
+    props.children = null;
+  }
+
+  return props;
+}
+
+function createElement(type, config, children) {
+  var arguments$1 = arguments;
+
+  if (type == null) {
+    throw Error('createElement: type should not be null or undefined.' + 
getRenderErrorInfo());
+  }
+  // Reserved names are extracted
+  var props = {};
+  var propName = void 0;
+  var key = null;
+  var ref = null;
+
+  if (config != null) {
+    ref = config.ref === undefined ? null : config.ref;
+    key = config.key === undefined ? null : String(config.key);
+    // Remaining properties are added to a new props object
+    for (propName in config) {
+      if (!RESERVED_PROPS[propName]) {
+        props[propName] = config[propName];
+      }
+    }
+  }
+
+  var childrenLength = arguments.length - 2;
+  if (childrenLength > 0) {
+    if (childrenLength === 1 && !Array.isArray(children)) {
+      props.children = children;
+    } else {
+      var childArray = children;
+      if (childrenLength > 1) {
+        childArray = new Array(childrenLength);
+        for (var i = 0; i < childrenLength; i++) {
+          childArray[i] = arguments$1[i + 2];
+        }
+      }
+      props.children = (0, _flattenChildren2.default)(childArray);
+    }
+  }
+
+  // Resolve default props
+  if (type && type.defaultProps) {
+    var defaultProps = type.defaultProps;
+    for (propName in defaultProps) {
+      if (props[propName] === undefined) {
+        props[propName] = defaultProps[propName];
+      }
+    }
+  }
+
+  if (props.style && (Array.isArray(props.style) || _typeof(props.style) === 
'object')) {
+    props.style = flattenStyle(props.style);
+  }
+
+  return new Element(type, key, ref, props, _host2.default.component);
+}
+
+function createFactory(type) {
+  var factory = createElement.bind(null, type);
+  // Expose the type on the factory and the prototype so that it can be
+  // easily accessed on elements. E.g. `<Foo />.type === Foo`.
+  // This should not be named `constructor` since this may not be the function
+  // that created the element, and it may not even be a constructor.
+  factory.type = type;
+  return factory;
+}
+
+function cloneElement(element, config) {
+  var arguments$1 = arguments;
+
+  if (!isValidElement(element)) {
+    throw Error('cloneElement: not a valid element.' + getRenderErrorInfo());
+  }
+
+  // Original props are copied
+  var props = Object.assign({}, element.props);
+
+  // Reserved names are extracted
+  var key = element.key;
+  var ref = element.ref;
+
+  // Owner will be preserved, unless ref is overridden
+  var owner = element._owner;
+
+  if (config) {
+    // Should reset ref and owner if has a new ref
+    if (config.ref !== undefined) {
+      ref = config.ref;
+      owner = _host2.default.component;
+    }
+
+    if (config.key !== undefined) {
+      key = String(config.key);
+    }
+
+    // Resolve default props
+    var defaultProps = void 0;
+    if (element.type && element.type.defaultProps) {
+      defaultProps = element.type.defaultProps;
+    }
+    // Remaining properties override existing props
+    var propName = void 0;
+    for (propName in config) {
+      if (config.hasOwnProperty(propName) && 
!RESERVED_PROPS.hasOwnProperty(propName)) {
+        if (config[propName] === undefined && defaultProps !== undefined) {
+          // Resolve default props
+          props[propName] = defaultProps[propName];
+        } else {
+          props[propName] = config[propName];
+        }
+      }
+    }
+  }
+
+  for (var _len = arguments.length, children = Array(_len > 2 ? _len - 2 : 0), 
_key = 2; _key < _len; _key++) {
+    children[_key - 2] = arguments$1[_key];
+  }
+
+  if (children.length) {
+    props.children = (0, _flattenChildren2.default)(children);
+  }
+
+  return new Element(element.type, key, ref, props, owner);
+}
+
+function isValidElement(object) {
+  return (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 
'object' && object !== null && object.type && object.props;
+}
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = flattenChildren;
+function traverseChildren(children, result) {
+  if (Array.isArray(children)) {
+    for (var i = 0, l = children.length; i < l; i++) {
+      traverseChildren(children[i], result);
+    }
+  } else {
+    result.push(children);
+  }
+}
+
+function flattenChildren(children) {
+  if (children == null) {
+    return children;
+  }
+  var result = [];
+  traverseChildren(children, result);
+
+  if (result.length === 1) {
+    result = result[0];
+  }
+
+  return result;
+}
+module.exports = exports["default"];
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === 
"symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj 
&& typeof Symbol === "function" && obj.constructor === Symbol && obj !== 
Symbol.prototype ? "symbol" : typeof obj; };
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === 
"symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+} : function (obj) {
+  return obj && typeof Symbol === "function" && obj.constructor === Symbol && 
obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" 
: _typeof2(obj);
+};
+
+// https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appcodename
+var isWeb = exports.isWeb = (typeof navigator === 'undefined' ? 'undefined' : 
_typeof(navigator)) === 'object' && (navigator.appCodeName === 'Mozilla' || 
navigator.product === 'Gecko');
+var isNode = exports.isNode = typeof process !== 'undefined' && 
!!(process.versions && process.versions.node);
+var isWeex = exports.isWeex = typeof callNative === 'function';
+var isReactNative = exports.isReactNative = typeof __fbBatchedBridgeConfig !== 
'undefined';
+exports['default'] = module.exports;
+exports.default = module.exports;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = unmountComponentAtNode;
+
+var _instance = __webpack_require__(1);
+
+var _instance2 = _interopRequireDefault(_instance);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function unmountComponentAtNode(node) {
+  var component = _instance2.default.get(node);
+
+  if (!component) {
+    return false;
+  }
+
+  _instance2.default.remove(node);
+  component._internal.unmountComponent();
+
+  return true;
+}
+module.exports = exports['default'];
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _inject = __webpack_require__(22);
+
+var _inject2 = _interopRequireDefault(_inject);
+
+var _instance = __webpack_require__(1);
+
+var _instance2 = _interopRequireDefault(_instance);
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function render(element, container, options, callback) {
+  // Compatible with `render(element, container, callback)`
+  if (typeof options === 'function') {
+    callback = options;
+    options = null;
+  }
+
+  options = options || {};
+  // Init inject
+  (0, _inject2.default)(options);
+
+  var rootComponent = _instance2.default.mount(element, container, 
options.parent);
+  var componentInstance = rootComponent.getPublicInstance();
+
+  if (callback) {
+    callback.call(componentInstance);
+  }
+
+  return componentInstance;
+}
+
+exports.default = render;
+module.exports = exports['default'];
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { 
for (var i = 0; i < props.length; i++) { var descriptor = props[i]; 
descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable 
= true; if ("value" in descriptor) { descriptor.writable = true; } 
Object.defineProperty(target, descriptor.key, descriptor); } } return function 
(Constructor, protoProps, staticProps) { if (protoProps) { 
defineProperties(Constructor.prototype, protoProps); } if (staticProps) { 
defineProperties(Constructor, staticProps); } return Constructor; }; }();
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+var _ref = __webpack_require__(12);
+
+var _ref2 = _interopRequireDefault(_ref);
+
+var _instantiateComponent = __webpack_require__(2);
+
+var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
+
+var _shouldUpdateComponent = __webpack_require__(3);
+
+var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
+
+var _getElementKeyName = __webpack_require__(13);
+
+var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName);
+
+var _instance = __webpack_require__(1);
+
+var _instance2 = _interopRequireDefault(_instance);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof 
Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var STYLE = 'style';
+var CHILDREN = 'children';
+var TREE = 'tree';
+var EVENT_PREFIX_REGEXP = /on[A-Z]/;
+
+/**
+ * Native Component
+ */
+
+var NativeComponent = function () {
+  function NativeComponent(element) {
+    _classCallCheck(this, NativeComponent);
+
+    this._currentElement = element;
+  }
+
+  _createClass(NativeComponent, [{
+    key: 'mountComponent',
+    value: function mountComponent(parent, parentInstance, context, 
childMounter) {
+      // Parent native element
+      this._parent = parent;
+      this._parentInstance = parentInstance;
+      this._context = context;
+      this._mountID = _host2.default.mountID++;
+
+      var props = this._currentElement.props;
+      var type = this._currentElement.type;
+      var instance = {
+        _internal: this,
+        type: type,
+        props: props
+      };
+      var appendType = props.append; // Default is node
+
+      this._instance = instance;
+
+      // Clone a copy for style diff
+      this._prevStyleCopy = Object.assign({}, props.style);
+
+      var nativeNode = this.getNativeNode();
+
+      if (appendType !== TREE) {
+        if (childMounter) {
+          childMounter(nativeNode, parent);
+        } else {
+          _host2.default.driver.appendChild(nativeNode, parent);
+        }
+      }
+
+      if (this._currentElement && this._currentElement.ref) {
+        _ref2.default.attach(this._currentElement._owner, 
this._currentElement.ref, this);
+      }
+
+      // Process children
+      var children = props.children;
+      if (children != null) {
+        this.mountChildren(children, context);
+      }
+
+      if (appendType === TREE) {
+        if (childMounter) {
+          childMounter(nativeNode, parent);
+        } else {
+          _host2.default.driver.appendChild(nativeNode, parent);
+        }
+      }
+
+      _host2.default.hook.Reconciler.mountComponent(this);
+
+      return instance;
+    }
+  }, {
+    key: 'mountChildren',
+    value: function mountChildren(children, context) {
+      var _this = this;
+
+      if (!Array.isArray(children)) {
+        children = [children];
+      }
+
+      var renderedChildren = this._renderedChildren = {};
+
+      var renderedChildrenImage = children.map(function (element, index) {
+        var renderedChild = (0, _instantiateComponent2.default)(element);
+        var name = (0, _getElementKeyName2.default)(renderedChildren, element, 
index);
+        renderedChildren[name] = renderedChild;
+        renderedChild._mountIndex = index;
+        // Mount
+        var mountImage = renderedChild.mountComponent(_this.getNativeNode(), 
_this._instance, context, null);
+        return mountImage;
+      });
+
+      return renderedChildrenImage;
+    }
+  }, {
+    key: 'unmountChildren',
+    value: function unmountChildren(notRemoveChild) {
+      var renderedChildren = this._renderedChildren;
+
+      if (renderedChildren) {
+        for (var name in renderedChildren) {
+          var renderedChild = renderedChildren[name];
+          renderedChild.unmountComponent(notRemoveChild);
+        }
+        this._renderedChildren = null;
+      }
+    }
+  }, {
+    key: 'unmountComponent',
+    value: function unmountComponent(notRemoveChild) {
+      if (this._nativeNode) {
+        var ref = this._currentElement.ref;
+        if (ref) {
+          _ref2.default.detach(this._currentElement._owner, ref, this);
+        }
+
+        _instance2.default.remove(this._nativeNode);
+        if (!notRemoveChild) {
+          _host2.default.driver.removeChild(this._nativeNode, this._parent);
+        }
+        _host2.default.driver.removeAllEventListeners(this._nativeNode);
+      }
+
+      this.unmountChildren(notRemoveChild);
+
+      _host2.default.hook.Reconciler.unmountComponent(this);
+
+      this._currentElement = null;
+      this._nativeNode = null;
+      this._parent = null;
+      this._parentInstance = null;
+      this._context = null;
+      this._instance = null;
+      this._prevStyleCopy = null;
+    }
+  }, {
+    key: 'updateComponent',
+    value: function updateComponent(prevElement, nextElement, prevContext, 
nextContext) {
+      // Replace current element
+      this._currentElement = nextElement;
+
+      _ref2.default.update(prevElement, nextElement, this);
+
+      var prevProps = prevElement.props;
+      var nextProps = nextElement.props;
+
+      this.updateProperties(prevProps, nextProps);
+      this.updateChildren(nextProps.children, nextContext);
+
+      _host2.default.hook.Reconciler.receiveComponent(this);
+    }
+  }, {
+    key: 'updateProperties',
+    value: function updateProperties(prevProps, nextProps) {
+      var this$1 = this;
+
+      var propKey = void 0;
+      var styleName = void 0;
+      var styleUpdates = void 0;
+      for (propKey in prevProps) {
+        if (propKey === CHILDREN || nextProps.hasOwnProperty(propKey) || 
!prevProps.hasOwnProperty(propKey) || prevProps[propKey] == null) {
+          continue;
+        }
+        if (propKey === STYLE) {
+          var lastStyle = this$1._prevStyleCopy;
+          for (styleName in lastStyle) {
+            if (lastStyle.hasOwnProperty(styleName)) {
+              styleUpdates = styleUpdates || {};
+              styleUpdates[styleName] = '';
+            }
+          }
+          this$1._prevStyleCopy = null;
+        } else if (EVENT_PREFIX_REGEXP.test(propKey)) {
+          if (typeof prevProps[propKey] === 'function') {
+            _host2.default.driver.removeEventListener(this$1.getNativeNode(), 
propKey.slice(2).toLowerCase(), prevProps[propKey]);
+          }
+        } else {
+          _host2.default.driver.removeAttribute(this$1.getNativeNode(), 
propKey, prevProps[propKey]);
+        }
+      }
+
+      for (propKey in nextProps) {
+        var nextProp = nextProps[propKey];
+        var prevProp = propKey === STYLE ? this$1._prevStyleCopy : prevProps 
!= null ? prevProps[propKey] : undefined;
+        if (propKey === CHILDREN || !nextProps.hasOwnProperty(propKey) || 
nextProp === prevProp || nextProp == null && prevProp == null) {
+          continue;
+        }
+        // Update style
+        if (propKey === STYLE) {
+          if (nextProp) {
+            // Clone property
+            nextProp = this$1._prevStyleCopy = Object.assign({}, nextProp);
+          } else {
+            this$1._prevStyleCopy = null;
+          }
+
+          if (prevProp != null) {
+            // Unset styles on `prevProp` but not on `nextProp`.
+            for (styleName in prevProp) {
+              if (prevProp.hasOwnProperty(styleName) && (!nextProp || 
!nextProp.hasOwnProperty(styleName))) {
+                styleUpdates = styleUpdates || {};
+                styleUpdates[styleName] = '';
+              }
+            }
+            // Update styles that changed since `prevProp`.
+            for (styleName in nextProp) {
+              if (nextProp.hasOwnProperty(styleName) && prevProp[styleName] 
!== nextProp[styleName]) {
+                styleUpdates = styleUpdates || {};
+                styleUpdates[styleName] = nextProp[styleName];
+              }
+            }
+          } else {
+            // Assign next prop when prev style is null
+            styleUpdates = nextProp;
+          }
+
+          // Update event binding
+        } else if (EVENT_PREFIX_REGEXP.test(propKey)) {
+          var eventName = propKey.slice(2).toLowerCase();
+
+          if (typeof prevProp === 'function') {
+            _host2.default.driver.removeEventListener(this$1.getNativeNode(), 
eventName, prevProp, nextProps);
+          }
+
+          if (typeof nextProp === 'function') {
+            _host2.default.driver.addEventListener(this$1.getNativeNode(), 
eventName, nextProp, nextProps);
+          }
+          // Update other property
+        } else {
+          if (nextProp != null) {
+            _host2.default.driver.setAttribute(this$1.getNativeNode(), 
propKey, nextProp);
+          } else {
+            _host2.default.driver.removeAttribute(this$1.getNativeNode(), 
propKey, prevProps[propKey]);
+          }
+          
+        }
+      }
+
+      if (styleUpdates) {
+        _host2.default.driver.setStyles(this.getNativeNode(), styleUpdates);
+      }
+    }
+  }, {
+    key: 'updateChildren',
+    value: function updateChildren(nextChildrenElements, context) {
+      var _this2 = this;
+
+      // prev rendered children
+      var prevChildren = this._renderedChildren;
+
+      if (nextChildrenElements == null && prevChildren == null) {
+        return;
+      }
+
+      var nextChildren = {};
+      var oldNodes = {};
+
+      if (nextChildrenElements != null) {
+        if (!Array.isArray(nextChildrenElements)) {
+          nextChildrenElements = [nextChildrenElements];
+        }
+
+        // Update next children elements
+        for (var index = 0, length = nextChildrenElements.length; index < 
length; index++) {
+          var nextElement = nextChildrenElements[index];
+          var name = (0, _getElementKeyName2.default)(nextChildren, 
nextElement, index);
+          var prevChild = prevChildren && prevChildren[name];
+          var prevElement = prevChild && prevChild._currentElement;
+
+          if (prevChild != null && (0, 
_shouldUpdateComponent2.default)(prevElement, nextElement)) {
+            // Pass the same context when updating chidren
+            prevChild.updateComponent(prevElement, nextElement, context, 
context);
+            nextChildren[name] = prevChild;
+          } else {
+            // Unmount the prevChild when nextChild is different element type.
+            if (prevChild) {
+              var oldNativeNode = prevChild.getNativeNode();
+              // Delay remove child
+              prevChild.unmountComponent(true);
+              oldNodes[name] = oldNativeNode;
+            }
+            // The child must be instantiated before it's mounted.
+            nextChildren[name] = (0, 
_instantiateComponent2.default)(nextElement);
+          }
+        }
+      }
+
+      var firstPrevChild = void 0;
+      var delayRemoveFirstPrevChild = void 0;
+      // Unmount children that are no longer present.
+      if (prevChildren != null) {
+        for (var _name in prevChildren) {
+          if (!prevChildren.hasOwnProperty(_name)) {
+            continue;
+          }
+
+          var _prevChild = prevChildren[_name];
+          var shouldRemove = !nextChildren[_name];
+
+          // Store old first child ref for append node ahead and maybe delay 
remove it
+          if (!firstPrevChild) {
+            firstPrevChild = _prevChild;
+            delayRemoveFirstPrevChild = shouldRemove;
+          } else if (shouldRemove) {
+            _prevChild.unmountComponent();
+          }
+        }
+      }
+
+      if (nextChildren != null) {
+        (function () {
+          // `nextIndex` will increment for each child in `nextChildren`, but
+          // `lastIndex` will be the last index visited in `prevChildren`.
+          var lastIndex = 0;
+          var nextIndex = 0;
+          var lastPlacedNode = null;
+          var nextNativeNode = [];
+
+          var _loop = function _loop(_name2) {
+            if (!nextChildren.hasOwnProperty(_name2)) {
+              return 'continue';
+            }
+
+            var nextChild = nextChildren[_name2];
+            var prevChild = prevChildren && prevChildren[_name2];
+
+            if (prevChild === nextChild) {
+              var prevChildNativeNode = prevChild.getNativeNode();
+              // Convert to array type
+              if (!Array.isArray(prevChildNativeNode)) {
+                prevChildNativeNode = [prevChildNativeNode];
+              }
+
+              // If the index of `child` is less than `lastIndex`, then it 
needs to
+              // be moved. Otherwise, we do not need to move it because a 
child will be
+              // inserted or moved before `child`.
+              if (prevChild._mountIndex < lastIndex) {
+                // Get the last child
+                if (Array.isArray(lastPlacedNode)) {
+                  lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1];
+                }
+
+                for (var _i = prevChildNativeNode.length - 1; _i >= 0; _i--) {
+                  _host2.default.driver.insertAfter(prevChildNativeNode[_i], 
lastPlacedNode);
+                }
+              }
+
+              nextNativeNode = nextNativeNode.concat(prevChildNativeNode);
+
+              lastIndex = Math.max(prevChild._mountIndex, lastIndex);
+              prevChild._mountIndex = nextIndex;
+            } else {
+              if (prevChild != null) {
+                // Update `lastIndex` before `_mountIndex` gets unset by 
unmounting.
+                lastIndex = Math.max(prevChild._mountIndex, lastIndex);
+              }
+
+              var parent = _this2.getNativeNode();
+              // Fragment extended native component, so if parent is fragment 
should get this._parent
+              if (Array.isArray(parent)) {
+                parent = _this2._parent;
+              }
+
+              nextChild.mountComponent(parent, _this2._instance, context, 
function (newChild, parent) {
+                // TODO: Rework the duplicate code
+                var oldChild = oldNodes[_name2];
+                if (!Array.isArray(newChild)) {
+                  newChild = [newChild];
+                }
+
+                if (oldChild) {
+                  // The oldChild or newChild all maybe fragment
+                  if (!Array.isArray(oldChild)) {
+                    oldChild = [oldChild];
+                  }
+
+                  // If newChild count large then oldChild
+                  var lastNewChild = void 0;
+                  for (var _i2 = 0; _i2 < newChild.length; _i2++) {
+                    var child = newChild[_i2];
+                    if (oldChild[_i2]) {
+                      _host2.default.driver.replaceChild(child, oldChild[_i2]);
+                    } else {
+                      _host2.default.driver.insertAfter(child, lastNewChild);
+                    }
+                    lastNewChild = child;
+                  }
+
+                  // If newChild count less then oldChild
+                  if (newChild.length < oldChild.length) {
+                    for (var _i3 = newChild.length; _i3 < oldChild.length; 
_i3++) {
+                      _host2.default.driver.removeChild(oldChild[_i3]);
+                    }
+                  }
+                } else {
+                  // Insert child at a specific index
+
+                  // Get the last child
+                  if (Array.isArray(lastPlacedNode)) {
+                    lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1];
+                  }
+
+                  var prevFirstNativeNode = void 0;
+
+                  if (firstPrevChild && !lastPlacedNode) {
+                    prevFirstNativeNode = firstPrevChild.getNativeNode();
+                    if (Array.isArray(prevFirstNativeNode)) {
+                      prevFirstNativeNode = prevFirstNativeNode[0];
+                    }
+                  }
+
+                  for (var _i4 = newChild.length - 1; _i4 >= 0; _i4--) {
+                    var _child = newChild[_i4];
+                    if (lastPlacedNode) {
+                      _host2.default.driver.insertAfter(_child, 
lastPlacedNode);
+                    } else if (prevFirstNativeNode) {
+                      _host2.default.driver.insertBefore(_child, 
prevFirstNativeNode);
+                    } else {
+                      _host2.default.driver.appendChild(_child, parent);
+                    }
+                  }
+                }
+
+                nextNativeNode = nextNativeNode.concat(newChild);
+              });
+              nextChild._mountIndex = nextIndex;
+            }
+
+            nextIndex++;
+            lastPlacedNode = nextChild.getNativeNode();
+          };
+
+          for (var _name2 in nextChildren) {
+            var _ret2 = _loop(_name2);
+
+            if (_ret2 === 'continue') { continue; }
+          }
+
+          // Sync update native refs
+          if (Array.isArray(_this2._nativeNode)) {
+            // Clear all and push the new array
+            _this2._nativeNode.splice(0, _this2._nativeNode.length);
+            for (var i = 0; i < nextNativeNode.length; i++) {
+              _this2._nativeNode.push(nextNativeNode[i]);
+            }
+          }
+        })();
+      }
+
+      if (delayRemoveFirstPrevChild) {
+        firstPrevChild.unmountComponent();
+      }
+
+      this._renderedChildren = nextChildren;
+    }
+  }, {
+    key: 'getNativeNode',
+    value: function getNativeNode() {
+      if (this._nativeNode == null) {
+        this._nativeNode = _host2.default.driver.createElement(this._instance);
+        _instance2.default.set(this._nativeNode, this._instance);
+      }
+
+      return this._nativeNode;
+    }
+  }, {
+    key: 'getPublicInstance',
+    value: function getPublicInstance() {
+      return this.getNativeNode();
+    }
+  }, {
+    key: 'getName',
+    value: function getName() {
+      return this._currentElement.type;
+    }
+  }]);
+
+  return NativeComponent;
+}();
+
+exports.default = NativeComponent;
+module.exports = exports['default'];
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+/*
+ * Ref manager
+ */
+
+exports.default = {
+  update: function update(prevElement, nextElement, component) {
+    var prevRef = prevElement != null && prevElement.ref;
+    var nextRef = nextElement != null && nextElement.ref;
+
+    // Update refs in owner component
+    if (prevRef !== nextRef) {
+      // Detach prev RenderedElement's ref
+      prevRef != null && this.detach(prevElement._owner, prevRef, component);
+      // Attach next RenderedElement's ref
+      nextRef != null && this.attach(nextElement._owner, nextRef, component);
+    }
+  },
+  attach: function attach(ownerComponent, ref, component) {
+    if (!ownerComponent) {
+      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 instance = component.getPublicInstance();
+    if (typeof ref === 'function') {
+      ref(instance);
+    } else {
+      ownerComponent._instance.refs[ref] = instance;
+    }
+  },
+  detach: function detach(ownerComponent, ref, component) {
+    if (typeof ref === 'function') {
+      // When the referenced component is unmounted and whenever the ref 
changes, the old ref will be called with null as an argument.
+      ref(null);
+    } else {
+      // Must match component and ref could detach the ref on owner when A's 
before ref is B's current ref
+      var instance = component.getPublicInstance();
+      if (ownerComponent._instance.refs[ref] === instance) {
+        delete ownerComponent._instance.refs[ref];
+      }
+    }
+  }
+};
+module.exports = exports['default'];
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+exports.default = function (children, element, index) {
+  var elementKey = element && element.key;
+  var hasKey = typeof elementKey === 'string';
+  var defaultName = '.' + index.toString(36);
+
+  if (hasKey) {
+    var keyName = '$' + elementKey;
+    // Child keys must be unique.
+    var keyUnique = children[keyName] === undefined;
+    // Only the first child will be used when encountered two children with 
the same key
+    if (!keyUnique) { console.warn('Encountered two children with the same key 
"' + elementKey + '".'); }
+
+    return keyUnique ? keyName : defaultName;
+  } else {
+    return defaultName;
+  }
+};
+
+module.exports = exports['default'];
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === 
"symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj 
&& typeof Symbol === "function" && obj.constructor === Symbol && obj !== 
Symbol.prototype ? "symbol" : typeof obj; };
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === 
"symbol" ? function (obj) {
+  return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
+} : function (obj) {
+  return obj && typeof Symbol === "function" && obj.constructor === Symbol && 
obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" 
: _typeof2(obj);
+};
+
+exports.isRem = isRem;
+exports.calcRem = calcRem;
+exports.getRem = getRem;
+exports.setRem = setRem;
+exports.isUnitNumber = isUnitNumber;
+exports.convertUnit = convertUnit;
+/**
+ * CSS properties which accept numbers but are not in units of "px".
+ */
+var UNITLESS_NUMBER_PROPS = {
+  animationIterationCount: true,
+  borderImageOutset: true,
+  borderImageSlice: true,
+  borderImageWidth: true,
+  boxFlex: true,
+  boxFlexGroup: true,
+  boxOrdinalGroup: true,
+  columnCount: true,
+  flex: true,
+  flexGrow: true,
+  flexPositive: true,
+  flexShrink: true,
+  flexNegative: true,
+  flexOrder: true,
+  gridRow: true,
+  gridColumn: true,
+  fontWeight: true,
+  lineClamp: true,
+  // We make lineHeight default is px that is diff with w3c spec
+  // lineHeight: true,
+  opacity: true,
+  order: true,
+  orphans: true,
+  tabSize: true,
+  widows: true,
+  zIndex: true,
+  zoom: true,
+  // Weex only
+  lines: true
+};
+var SUFFIX = 'rem';
+var REM_REG = /[-+]?\d*\.?\d+rem/g;
+var GLOBAL_REM_UNIT = '__global_rem_unit__';
+var global = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) 
=== 'object' ? window : (typeof global === 'undefined' ? 'undefined' : 
_typeof(global)) === 'object' ? global : {};
+// Default 1 rem to 1 px
+if (global[GLOBAL_REM_UNIT] == null) {
+  global[GLOBAL_REM_UNIT] = 1;
+}
+
+/**
+ * Is string contains rem
+ * @param {String} str
+ * @returns {Boolean}
+ */
+function isRem(str) {
+  return typeof str === 'string' && str.indexOf(SUFFIX) !== -1;
+}
+
+/**
+ * Calculate rem to pixels: '1.2rem' => 1.2 * rem
+ * @param {String} str
+ * @param {Number} rem
+ * @returns {number}
+ */
+function calcRem(str) {
+  var remUnit = arguments.length > 1 && arguments[1] !== undefined ? 
arguments[1] : global[GLOBAL_REM_UNIT];
+
+  return str.replace(REM_REG, function (rem) {
+    return parseFloat(rem) * remUnit + 'px';
+  });
+}
+
+function getRem() {
+  return global[GLOBAL_REM_UNIT];
+}
+
+function setRem(rem) {
+  global[GLOBAL_REM_UNIT] = rem;
+}
+
+function isUnitNumber(val, prop) {
+  return typeof val === 'number' && !UNITLESS_NUMBER_PROPS[prop];
+}
+
+function convertUnit(val, prop) {
+  var remUnit = arguments.length > 2 && arguments[2] !== undefined ? 
arguments[2] : global[GLOBAL_REM_UNIT];
+
+  if (prop && isUnitNumber(val, prop)) {
+    return val * remUnit + 'px';
+  } else if (isRem(val)) {
+    return calcRem(val, remUnit);
+  }
+
+  return val;
+}
+exports['default'] = module.exports;
+exports.default = module.exports;
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.transformPropsAttrsToStyle = transformPropsAttrsToStyle;
+exports.renamePropsAttr = renamePropsAttr;
+/**
+ * transformPropAttrsToStyle
+ *
+ * @param {Object} props
+ * @param {Array} attrs
+ */
+function transformPropsAttrsToStyle(props, attrs) {
+  props.style = props.style || {};
+
+  attrs.forEach(function (attr) {
+    if (props[attr] && !props.style[attr]) {
+      props.style[attr] = props[attr];
+      delete props[attr];
+    }
+  });
+
+  return props;
+}
+
+/**
+ * renamePropsAttr
+ *
+ * @param {Object} props
+ * @param {String} originalAttrName
+ * @param {String} newAttrName
+ */
+function renamePropsAttr(props, originalAttrName, newAttrName) {
+  if (props[originalAttrName] && !props[newAttrName]) {
+    props[newAttrName] = props[originalAttrName];
+    delete props[originalAttrName];
+  }
+
+  return props;
+}
+exports["default"] = module.exports;
+exports.default = module.exports;
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _host = __webpack_require__(0);
+
+var _host2 = _interopRequireDefault(_host);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function findDOMNode(instance) {
+  if (instance == null) {
+    return null;
+  }
+
+  // If a native node, weex may not export ownerDocument property
+  if (instance.ownerDocument || instance.nodeType) {
+    return instance;
+  }
+
+  // Native component
+  if (instance._nativeNode) {
+    return instance._nativeNode;
+  }
+
+  if (typeof instance == 'string') {
+    return _host2.default.driver.getElementById(instance);
+  }
+
+  if (typeof instance.render !== 'function') {
+    throw new Error('findDOMNode: find by neither component nor DOM node.');
+  }
+
+  // Composite component
+  var internal = instance._internal;
+
+  if (internal) {
+    while (!internal._nativeNode) {
+      internal = internal._renderedComponent;
+      // If not mounted
+      if (internal == null) {
+        return null;
+      }
+    }
+    return internal._nativeNode;
+  } else {
+    throw new Error('findDOMNode: find on an unmounted component.');
+  }
+}
+
+exports.default = findDOMNode;
+module.exports = exports['default'];
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Children = exports.version = exports.setNativeProps = 
exports.findComponentInstance = exports.unmountComponentAtNode = 
exports.findDOMNode = exports.hydrate = exports.render = exports.PropTypes = 
exports.PureComponent = exports.Component = exports.createFactory = 
exports.isValidElement = exports.cloneElement = exports.createElement = 
undefined;
+
+__webpack_require__(18);
+
+var _element = __webpack_require__(6);
+
+var _component = __webpack_require__(4);
+
+var _component2 = _interopRequireDefault(_component);
+
+var _purecomponent = __webpack_require__(20);
+
+var _purecomponent2 = _interopRequireDefault(_purecomponent);
+
+var _proptypes = __webpack_require__(21);
+
+var _proptypes2 = _interopRequireDefault(_proptypes);
+
+var _render2 = __webpack_require__(10);
+
+var _render3 = _interopRequireDefault(_render2);
+
+var _hydrate2 = __webpack_require__(42);
+
+var _hydrate3 = _interopRequireDefault(_hydrate2);
+
+var _findDOMNode2 = __webpack_require__(16);
+
+var _findDOMNode3 = _interopRequireDefault(_findDOMNode2);
+
+var _unmountComponentAtNode2 = __webpack_require__(9);
+
+var _unmountComponentAtNode3 = 
_interopRequireDefault(_unmountComponentAtNode2);
+
+var _findComponentInstance2 = __webpack_require__(43);
+
+var _findComponentInstance3 = _interopRequireDefault(_findComponentInstance2);
+
+var _setNativeProps2 = __webpack_require__(44);
+
+var _setNativeProps3 = _interopRequireDefault(_setNativeProps2);
+
+var _version2 = __webpack_require__(45);
+
+var _version3 = _interopRequireDefault(_version2);
+
+var _children = __webpack_require__(46);
+
+var _children2 = _interopRequireDefault(_children);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+exports.createElement = _element.createElement;
+exports.cloneElement = _element.cloneElement;
+exports.isValidElement = _element.isValidElement;
+exports.createFactory = _element.createFactory;
+exports.Component = _component2.default;
+exports.PureComponent = _purecomponent2.default;
+exports.PropTypes = _proptypes2.default;
+exports.render = _render3.default;
+exports.hydrate = _hydrate3.default;
+exports.findDOMNode = _findDOMNode3.default;
+exports.unmountComponentAtNode = _unmountComponentAtNode3.default;
+exports.findComponentInstance = _findComponentInstance3.default;
+exports.setNativeProps = _setNativeProps3.default;
+exports.version = _version3.default;
+exports.Children = _children2.default;
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _hook = __webpack_require__(5);
+
+var _hook2 = _interopRequireDefault(_hook);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
+if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof 
__REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {
+  __REACT_DEVTOOLS_GLOBAL_HOOK__.inject(_hook2.default);
+}
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { 
for (var i = 0; i < props.length; i++) { var descriptor = props[i]; 
descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable 
= true; if ("value" in descriptor) { descriptor.writable = true; } 
Object.defineProperty(target, descriptor.key, descriptor); } } return function 
(Constructor, protoProps, staticProps) { if (protoProps) { 
defineProperties(Constructor.prototype, protoProps); } if (staticProps) { 
defineProperties(Constructor, staticProps); } return Constructor; }; }();
+
+var _component = __webpack_require__(4);
+
+var _component2 = _interopRequireDefault(_component);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof 
Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new 
ReferenceError("this hasn't been initialised - super() hasn't been called"); } 
return call && (typeof call === "object" || typeof call === "function") ? call 
: self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 
"function" && superClass !== null) { throw new TypeError("Super expression must 
either be null or a function, not " + typeof superClass); } subClass.prototype 
= Object.create(superClass && superClass.prototype, { constructor: { value: 
subClass, enumerable: false, writable: true, configurable: true } }); if 
(superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, 
superClass) : subClass.__proto__ = superClass; } }
+
+var rootCounter = 1;
+
+var Root = function (_Component) {
+  _inherits(Root, _Component);
+
+  function Root() {
+    var arguments$1 = arguments;
+
+    var _ref;
+
+    var _temp, _this, _ret;
+
+    _classCallCheck(this, Root);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < 
_len; _key++) {
+      args[_key] = arguments$1[_key];
+    }
+
+    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = 
Root.__proto__ || Object.getPrototypeOf(Root)).call.apply(_ref, 
[this].concat(args))), _this), _this.rootID = rootCounter++, _temp), 
_possibleConstructorReturn(_this, _ret);
+  }
+
+  _createClass(Root, [{
+    key: 'isRootComponent',
+    value: function isRootComponent() {}
+  }, {
+    key: 'render',
+    value: function render() {
+      return this.props.children;
+    }
+  }, {
+    key: 'getPublicInstance',
+    value: function getPublicInstance() {
+      return this.getRenderedComponent().getPublicInstance();
+    }
+  }, {
+    key: 'getRenderedComponent',
+    value: function getRenderedComponent() {
+      return this._internal._renderedComponent;
+    }
+  }]);
+
+  return Root;
+}(_component2.default);
+
+exports.default = Root;
+module.exports = exports['default'];
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { 
for (var i = 0; i < props.length; i++) { var descriptor = props[i]; 
descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable 
= true; if ("value" in descriptor) { descriptor.writable = true; } 
Object.defineProperty(target, descriptor.key, descriptor); } } return function 
(Constructor, protoProps, staticProps) { if (protoProps) { 
defineProperties(Constructor.prototype, protoProps); } if (staticProps) { 
defineProperties(Constructor, staticProps); } return Constructor; }; }();
+
+var _component = __webpack_require__(4);
+
+var _component2 = _interopRequireDefault(_component);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 
default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof 
Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new 
ReferenceError("this hasn't been initialised - super() hasn't been called"); } 
return call && (typeof call === "object" || typeof call === "function") ? call 
: self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== 
"function" && superClass !== null) { throw new TypeError("Super expression must 
either be null or a function, not " + typeof superClass); } subClass.prototype 
= Object.create(superClass && superClass.prototype, { constructor: { value: 
subClass, enumerable: false, writable: true, configurable: true } }); if 
(superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, 
superClass) : subClass.__proto__ = superClass; } }
+
+/**
+ * Pure component class.
+ */
+var PureComponent = function (_Component) {
+  _inherits(PureComponent, _Component);
+
+  fu

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/libs/armeabi/libweexjsb.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsb.so 
b/android/sdk/libs/armeabi/libweexjsb.so
old mode 100644
new mode 100755
index f0287cf..48bee08
Binary files a/android/sdk/libs/armeabi/libweexjsb.so and 
b/android/sdk/libs/armeabi/libweexjsb.so differ


Reply via email to