
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


==============================================================================

Apache Weex Submodules:

Apache Weex includes a number of submodules with separate copyright notices
and license terms. Your use of these submodules is subject to the terms and
conditions of the following licenses.

This product bundles vuejs v1.0.12, which is available under a
"MIT" license. For details, see https://github.com/vuejs/vue/blob/v1.0.12/LICENSE and following files:
  src/js-framework/dist/index.js
  runtime/frameworks/legacy/core/array.js
  runtime/frameworks/legacy/core/dep.js
  runtime/frameworks/legacy/core/object.js
  runtime/frameworks/legacy/core/observer.js
  runtime/frameworks/legacy/core/state.js
  runtime/frameworks/legacy/core/watcher.js

  The MIT License (MIT)

  Copyright (c) 2013-2014 Yuxi Evan You

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.


This product bundles Guava v20.0, which is available under a "Apache" license. For details, see https://github.com/google/guava/blob/v20.0/COPYING and following files:
  android_sdk/src/main/java/org/apache/taobao/weex/utils/WXDataStructureUtil.java

This product bundles json11 v1.0.0, which is available under a "MIT" license. For details, see https://github.com/dropbox/json11/tree/v1.0.0 and following files:
   weex_core/Source/third_party/json11/CMakeLists.txt
   weex_core/Source/third_party/json11/json11.cc
   weex_core/Source/third_party/json11/json11.hpp

   /* Copyright (c) 2013 Dropbox, Inc.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   * THE SOFTWARE.
   */

This product bundles chromium v66.0.3344.2, which is available under a "BSD-style" license. For details, see https://github.com/chromium/chromium/blob/66.0.3344.2/ and following files:
   modp_b64:
      The following files are copied from https://github.com/chromium/chromium/tree/master/third_party/modp_b64 and their names are listed below:
         weex_core/Source/base/base64/modp_base64/modp_b64_data.h
         weex_core/Source/base/base64/modp_base64/modp_b64.cc
         weex_core/Source/base/base64/modp_base64/modp_b64.h

      License for above files:
         * MODP_B64 - High performance base64 encoder/decoder
         * Version 1.3 -- 17-Mar-2006
         * http://modp.com/release/base64
         *
         * Copyright (c) 2005, 2006  Nick Galbreath -- nickg [at] modp [dot] com
         * All rights reserved.
         *
         * Redistribution and use in source and binary forms, with or without
         * modification, are permitted provided that the following conditions are
         * met:
         *
         *   Redistributions of source code must retain the above copyright
         *   notice, this list of conditions and the following disclaimer.
         *
         *   Redistributions in binary form must reproduce the above copyright
         *   notice, this list of conditions and the following disclaimer in the
         *   documentation and/or other materials provided with the distribution.
         *
         *   Neither the name of the modp.com nor the names of its
         *   contributors may be used to endorse or promote products derived from
         *   this software without specific prior written permission.
         *
         * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
         * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
         * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
         * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
         * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
         * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
         * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
         * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
         * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
         * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

   ICU:
      The following files are copied from https://github.com/chromium/chromium/tree/66.0.3344.2/base/third_party/icu and their names are listed below:
         weex_core/Source/base/third_party/icu/icu_utf.h
         weex_core/Source/base/third_party/icu/icu_utf.cpp
      
      License for above files:
         /* COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
         *
         * Copyright © 1991-2017 Unicode, Inc. All rights reserved.
         * Distributed under the Terms of Use in http://www.unicode.org/copyright.html
         *
         * Permission is hereby granted, free of charge, to any person obtaining
         * a copy of the Unicode data files and any associated documentation
         * (the "Data Files") or Unicode software and any associated documentation
         * (the "Software") to deal in the Data Files or Software
         * without restriction, including without limitation the rights to use,
         * copy, modify, merge, publish, distribute, and/or sell copies of
         * the Data Files or Software, and to permit persons to whom the Data Files
         * or Software are furnished to do so, provided that either
         * (a) this copyright and permission notice appear with all copies
         * of the Data Files or Software, or
         * (b) this copyright and permission notice appear in associated
         * Documentation.
         * 
         * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
         * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
         * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         * NONINFRINGEMENT OF THIRD PARTY RIGHTS.
         * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
         * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
         * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
         * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
         * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
         * PERFORMANCE OF THE DATA FILES OR SOFTWARE.
         * 
         * Except as contained in this notice, the name of a copyright holder
         * shall not be used in advertising or otherwise to promote the sale,
         * use or other dealings in these Data Files or Software without prior
         * written authorization of the copyright holder.
         *
         * ---------------------
         *
         * Third-Party Software Licenses
         *  
         * This section contains third-party software notices and/or additional
         * terms for licensed third-party software components included within ICU
         * libraries.
         * 
         * 1. ICU License - ICU 1.8.1 to ICU 57.1
         *
         * COPYRIGHT AND PERMISSION NOTICE
         * 
         * Copyright (c) 1995-2016 International Business Machines Corporation and others
         * All rights reserved.
         *  
         * Permission is hereby granted, free of charge, to any person obtaining
         * a copy of this software and associated documentation files (the
         * "Software"), to deal in the Software without restriction, including
         * without limitation the rights to use, copy, modify, merge, publish,
         * distribute, and/or sell copies of the Software, and to permit persons
         * to whom the Software is furnished to do so, provided that the above
         * copyright notice(s) and this permission notice appear in all copies of
         * the Software and that both the above copyright notice(s) and this
         * permission notice appear in supporting documentation.
         * 
         * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
         * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
         * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
         * SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
         * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
         * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
         * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
         * 
         * Except as contained in this notice, the name of a copyright holder
         * shall not be used in advertising or otherwise to promote the sale, use
         * or other dealings in this Software without prior written authorization
         * of the copyright holder.
         * 
         * All trademarks and registered trademarks mentioned herein are the
         * property of their respective owners.

   Other files:
      weex_core/Source/base/android/jniprebuild/jni_generator.py

      The license for this file is below:
      # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      # Use of this source code is governed by a BSD-style license that can be
      # found in the LICENSE file.

This product bundles Android Open Source Project vandroid-4.2.2_r1, which is available under a "BSD" license. For details, see https://android.googlesource.com/platform/bionic/+/android-4.2.2_r1/libc/README and following files:
  weex_core/Source/IPC/futex.h

This product bundles Webkit 2.17.4, which is available under a "BSD-style" license. For details, reference https://webkit.org/licensing-webkit/ for license and see https://svn.webkit.org/repository/webkit/releases/WebKitGTK/webkit-2.17.4 for following files:

   Bmalloc in WebKit:
      weex_core/Source/android/jsengine/dependence/bmalloc:
         CMakeLists.txt
         ChangeLog
         Makefile

      weex_core/Source/android/jsengine/dependence/bmalloc/Configurations:
         Base.xcconfig
         DebugRelease.xcconfig
         bmalloc.xcconfig
         mbmalloc.xcconfig

      weex_core/Source/android/jsengine/dependence/bmalloc/bmalloc:
         Algorithm.h
         Allocator.cpp
         Allocator.h
         AsyncTask.h
         AvailableMemory.cpp
         AvailableMemory.h
         BAssert.h
         BPlatform.h
         BumpAllocator.h
         BumpRange.h
         Cache.cpp
         Cache.h
         Chunk.h
         Deallocator.cpp
         Deallocator.h
         DebugHeap.cpp
         DebugHeap.h
         Environment.cpp
         Environment.h
         FixedVector.h
         Heap.cpp
         Heap.h
         Inline.h
         LargeMap.cpp
         LargeMap.h
         LargeRange.h
         LineMetadata.h
         List.h
         Logging.cpp
         Logging.h
         Map.h
         Mutex.h
         Object.h
         ObjectType.cpp
         ObjectType.h
         PerProcess.h
         PerThread.h
         Range.h
         ScopeExit.h
         Sizes.h
         SmallLine.h
         SmallPage.h
         StaticMutex.cpp
         StaticMutex.h
         Syscall.h
         VMAllocate.h
         VMHeap.cpp
         VMHeap.h
         Vector.h
         Zone.cpp
         Zone.h
         bmalloc.h
         mbmalloc.cpp

      weex_core/Source/android/jsengine/dependence/bmalloc/bmalloc/darwin:
         BSoftLinking.h

      weex_core/Source/android/jsengine/dependence/bmalloc/bmalloc.xcodeproj:
         project.pbxproj

   ICU in WebKit:
      weex_core/Source/android/jsengine/dependence/icu:
         LICENSE
         README

      weex_core/Source/android/jsengine/dependence/icu/unicode:
         localpointer.h
         parseerr.h
         platform.h
         ptypes.h
         putil.h
         ucal.h
         uchar.h
         ucnv.h
         ucnv_err.h
         ucol.h
         uconfig.h
         ucurr.h
         udat.h
         udatpg.h
         udisplaycontext.h
         uenum.h
         uformattable.h
         uiter.h
         uloc.h
         umachine.h
         umisc.h
         unorm.h
         unorm2.h
         unum.h
         unumsys.h
         urename.h
         uscript.h
         uset.h
         ustring.h
         utf.h
         utf16.h
         utf8.h
         utf_old.h
         utypes.h
         uvernum.h
         uversion.h
   
   JavaScriptCore in WebKit:
      weex_core/Source/include/JavaScriptCore/API:
         APICallbackFunction.h
         APICast.h
         APIUtils.h
         JSAPIWrapperObject.h
         JSBase.h
         JSBasePrivate.h
         JSCTestRunnerUtils.h
         JSCallbackConstructor.h
         JSCallbackFunction.h
         JSCallbackObject.h
         JSCallbackObjectFunctions.h
         JSClassRef.h
         JSContext.h
         JSContextInternal.h
         JSContextPrivate.h
         JSContextRef.h
         JSContextRefInspectorSupport.h
         JSContextRefInternal.h
         JSContextRefPrivate.h
         JSExport.h
         JSManagedValue.h
         JSManagedValueInternal.h
         JSObjectRef.h
         JSObjectRefPrivate.h
         JSRemoteInspector.h
         JSRetainPtr.h
         JSScriptRefPrivate.h
         JSStringRef.h
         JSStringRefBSTR.h
         JSStringRefCF.h
         JSStringRefPrivate.h
         JSTypedArray.h
         JSValue.h
         JSValueInternal.h
         JSValueRef.h
         JSVirtualMachine.h
         JSVirtualMachineInternal.h
         JSWeakObjectMapRefInternal.h
         JSWeakObjectMapRefPrivate.h
         JSWrapperMap.h
         JavaScript.h
         JavaScriptCore.h
         ObjCCallbackFunction.h
         ObjcRuntimeExtras.h
         OpaqueJSString.h
         WebKitAvailability.h

      weex_core/Source/include/JavaScriptCore/ForwardingHeaders/JavaScriptCore:
         APICast.h
         JSBase.h
         JSCTestRunnerUtils.h
         JSContextRef.h
         JSObjectRef.h
         JSObjectRefPrivate.h
         JSRetainPtr.h
         JSStringRef.h
         JSStringRefCF.h
         JSTypedArray.h
         JSValueRef.h
         JavaScript.h
         JavaScriptCore.h
         OpaqueJSString.h
         WebKitAvailability.h

   Other files in Webkit:
      weex_core/Source/android/jsengine/dependence:
         OptionsCommon.cmake
         OptionsJSCOnly.cmake

   The copyright for files above is listed below:
      weex_core/Source/android/jsengine/dependence/icu:
         COPYRIGHT AND PERMISSION NOTICE

         Copyright (c) 1995-2006 International Business Machines Corporation and others

         All rights reserved.

         Permission is hereby granted, free of charge, to any person obtaining a copy of this
         software and associated documentation files (the "Software"), to deal in the Software
         without restriction, including without limitation the rights to use, copy, modify,
         merge, publish, distribute, and/or sell copies of the Software, and to permit persons
         to whom the Software is furnished to do so, provided that the above copyright notice(s)
         and this permission notice appear in all copies of the Software and that both the above
         copyright notice(s) and this permission notice appear in supporting documentation.

         THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
         INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
         PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER
         OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR
         CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
         PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
         OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

         Except as contained in this notice, the name of a copyright holder shall not be used in
         advertising or otherwise to promote the sale, use or other dealings in this Software
         without prior written authorization of the copyright holder.
      
      weex_core/Source/include/JavaScriptCore:

         /*
         * Copyright (C) 2005, 2006, 2007, 2010 Apple Inc. All rights reserved.
         * Copyright (C) 2006 Apple Inc.  All rights reserved.
         * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
         * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
         * Copyright (C) 2006, 2008, 2016 Apple Inc. All rights reserved.
         * Copyright (C) 2006-2016 Apple Inc. All rights reserved.
         * Copyright (C) 2007 Apple Inc.  All rights reserved.
         * Copyright (C) 2008 Apple Inc.  All rights reserved.
         * Copyright (C) 2008, 2009, 2010, 2014 Apple Inc. All Rights Reserved.
         * Copyright (C) 2009 Apple Inc.  All rights reserved.
         * Copyright (C) 2010 Apple Inc. All rights reserved.
         * Copyright (C) 2012 Apple Inc. All rights reserved.
         * Copyright (C) 2013 Apple Inc. All rights reserved.
         * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
         * Copyright (C) 2013, 2017 Apple Inc. All rights reserved.
         * Copyright (C) 2014 Apple Inc. All rights reserved.
         * Copyright (C) 2015 Apple Inc.  All rights reserved.
         * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
         * Copyright (C) 2016 Apple Inc. All rights reserved.
         * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
         * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
         * Copyright (C) 2008 Alp Toker <alp@atoker.com>
         * Copyright (C) 2008 Kelvin W Sherlock (ksherlock@gmail.com)
         * Copyright (C) 2015 Dominic Szablewski (dominic@phoboslab.org)
         *
         * Redistribution and use in source and binary forms, with or without
         * modification, are permitted provided that the following conditions
         * are met:
         * 1. Redistributions of source code must retain the above copyright
         *    notice, this list of conditions and the following disclaimer.
         * 2. Redistributions in binary form must reproduce the above copyright
         *    notice, this list of conditions and the following disclaimer in the
         *    documentation and/or other materials provided with the distribution.
         *
         * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
         * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
         * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
         * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
         * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
         * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
         * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
         * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
         * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
         * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
         * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
         */

         weex_core/Source/android/jsengine/dependence/bmalloc:

         /*
         * Copyright (C) 2007, 2008, 2011-2016 Apple Inc. All rights reserved.
         * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
         * Copyright (C) 2014 Apple Inc. All rights reserved.
         * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
         * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
         * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
         * Copyright (C) 2016 Apple Inc. All rights reserved.
         *
         * Redistribution and use in source and binary forms, with or without
         * modification, are permitted provided that the following conditions
         * are met:
         * 1.  Redistributions of source code must retain the above copyright
         *     notice, this list of conditions and the following disclaimer.
         * 2.  Redistributions in binary form must reproduce the above copyright
         *     notice, this list of conditions and the following disclaimer in the
         *     documentation and/or other materials provided with the distribution.
         *
         * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
         * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
         * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
         * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
         * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
         * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
         * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
         * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
         * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
         * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         */

This product bundles files from Boost under "Boost Software License". For more details, reference http://www.boost.org/LICENSE_1_0.txt
  weex_core/Source/js_runtime/utils/base64.hpp

  //
  // Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
  //
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  //
